opencv_ex20-圖像縮小pyrDown、灰階圖像可調式邊緣檢測Canny、圖像轉換+複製cvtColor、直線偵測HoughLinesP、畫線函數line
opencv_ex20-圖像縮小pyrDown、灰階圖像可調式邊緣檢測Canny、圖像轉換+複製cvtColor、直線偵測HoughLinesP、畫線函數line
GITHUB: https://github.com/jash-git/CPP_opencv249_ex
OpenCV 直線偵測
void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0)
image:輸入圖,8位元單通道二值化圖。
lines:將所有線的資料存在vector< Vec4i >,Vec4i為每個線段的資料,分別有x1、y1、x2、y2這四個值,(x1,y1)和(x2,y2)分別表示線段的頭尾頂點。
rho:距離解析度,越小表示定位要求越準確,但也較易造成應該是同條線的點判為不同線。 1
theta:角度解析度,越小表示角度要求越準確,但也較易造成應該是同條線的點判為不同線。 CV_PI/180
threshold:累積個數閾值,超過此值的線才會存在lines這個容器內。 10
minLineLength :線段最短距離,超過此值的線才會存在lines這個容器內。 0
maxLineGap:最大間隔。 10
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/ml/ml.hpp>
#include <iostream>
#include <cstdio>
#include <sys/timeb.h>
#if defined(WIN32)
#define TIMEB _timeb
#define ftime _ftime
typedef __int64 TIME_T;
#else
#define TIMEB timeb
typedef long long TIME_T;
#endif
using namespace cv;
using namespace std;
Mat src;//input image
void Pause()
{
printf("Press Enter key to continue...");
fgetc(stdin);
}
int main()
{
Mat input;
input = imread("hough01.png");
if (!input.data)
{
printf("could not load image...\n");
}
else
{
//縮小
pyrDown(input, src, Size(input.cols/2, input.rows/2));
char INPUT_TITLE[] = "input image";
char OUTPUT_TITLE[] = "hough-line-detection";
namedWindow(INPUT_TITLE, CV_WINDOW_AUTOSIZE);
namedWindow(OUTPUT_TITLE, CV_WINDOW_AUTOSIZE);
imshow(INPUT_TITLE, src);
Mat src_gray,dst;
Canny(src, src_gray, 150, 200);
cvtColor(src_gray, dst, CV_GRAY2BGR);
imshow("edge image", src_gray);
/*
OpenCV 直線偵測
void HoughLines(InputArray image, OutputArray lines, double rho, double theta, int threshold, double srn=0, double stn=0)
image:輸入圖,8位元單通道二值化圖。
lines:將所有線的資料存在vector< Vec2f >,Vec2f為每個線的資料,分別有ρ、θ這兩個參數,ρ表示和左上角(0,0)的距離,θ是線的旋轉角度,單位弧度,垂直線的θ為0,水平線的θ為π/2。
rho:距離解析度,越小表示定位要求越準確,但也較易造成應該是同條線的點判為不同線。 1
theta:角度解析度,越小表示角度要求越準確,但也較易造成應該是同條線的點判為不同線。 CV_PI / 180
threshold:累積個數閾值,超過此值的線才會存在lines這個容器內。 10
srn:可有可無的距離除數。
stn:可有可無的角度除數。
*/
/*
vector<Vec2f> lines;
HoughLines(src_gray, lines, 1, CV_PI / 180, 140, 0, 0);
Scalar color = Scalar(0, 0, 255);
for (size_t i = 0; i < lines.size(); i++)
{
float rho = lines[i][0]; // 极坐标中的r长度
float theta = lines[i][1]; // 极坐标中的角度
Point pt1, pt2;
double a = cos(theta), b = sin(theta);
double x0 = a*rho, y0 = b*rho;
// 转换为平面坐标的四个点
pt1.x = cvRound(x0 + 1000 * (-b));
pt1.y = cvRound(y0 + 1000 * (a));
pt2.x = cvRound(x0 - 1000 * (-b));
pt2.y = cvRound(y0 - 1000 * (a));
line(dst, pt1, pt2, color, 1, CV_AA);
}
//*/
/*
OpenCV 直線偵測
void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0)
image:輸入圖,8位元單通道二值化圖。
lines:將所有線的資料存在vector< Vec4i >,Vec4i為每個線段的資料,分別有x1、y1、x2、y2這四個值,(x1,y1)和(x2,y2)分別表示線段的頭尾頂點。
rho:距離解析度,越小表示定位要求越準確,但也較易造成應該是同條線的點判為不同線。 1
theta:角度解析度,越小表示角度要求越準確,但也較易造成應該是同條線的點判為不同線。 CV_PI/180
threshold:累積個數閾值,超過此值的線才會存在lines這個容器內。 10
minLineLength :線段最短距離,超過此值的線才會存在lines這個容器內。 0
maxLineGap:最大間隔。 10
)
*/
//*
vector<Vec4i> lines;
HoughLinesP(src_gray, lines, 1, CV_PI/180, 10,0,10);
for( size_t i = 0; i < lines.size(); i++ )
{
Vec4i l = lines[i];//Vec4i 就是Vec<int, 4>,里面存放4个int
line( dst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 1, CV_AA);
//要划的线所在的图像:dst, 起点:Point(l[0], l[1]), 终点:Point(l[2], l[3]), 1 線寬 , 颜色:Scalar(0,0,255)
}
//*/
imshow(OUTPUT_TITLE, dst);
}
waitKey(0);
Pause();
return 0;
}