霍夫变换直线检测
一、霍夫变换直线检测:
1.众所周知, 一条直线在图像二维空间可由两个变量表示. 如:
<1>在笛卡尔坐标系: 可由参数: 斜率和截距(m,b)表示。
<2>在极坐标系: 可由参数: 极径和极角(r, θ)表示。
可以用极坐标系来表示直线. 因此, 直线的表达式可为:
化简便可得到:
有经验的人可以使用:
代码:
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> using namespace cv; using namespace std; int main(int argc, char** argv) { Mat src, src_gray, dst; src = imread("L:/7.png"); if (!src.data) { printf("could not load image...\n"); return -1; } 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); Canny(src, src_gray, 100, 200); cvtColor(src_gray, dst, CV_GRAY2BGR); imshow("edge_image", src_gray); vector<Vec4f> plines; //定义的一个数组 HoughLinesP(src_gray, plines, 1, CV_PI / 180.0, 10, 0, 10); // Scalar color = Scalar(0, 0, 255); for (size_t i = 0; i < plines.size(); i++) { Vec4f hline = plines[i]; line(dst, Point(hline[0], hline[1]), Point(hline[2], hline[3]), color, 3,LINE_AA ); //Poinnt为起始点位置, 颜色,3为线条粗,LINE_AA为线条类型。 /* 线条类型: LINE_8 (or 0) - 8-connected line(8邻接)连接 线。 LINE_4 - 4-connected line(4邻接)连接线。 LINE_AA - antialiased 线条。 */ } imshow(OUTPUT_TITLE, dst); waitKey(0); return 0; }
实验结果:
输入 边缘检测 霍夫直线检测