int main(){ Mat src = imread("test.jpg");//载入原始图 Mat src1, src2, src3, src4,dst; namedWindow("效果图窗口", 1);//定义窗口 Canny(src, src1, 50, 200, 3);//进行一此canny边缘检测 cvtColor(src1, src2, CV_GRAY2BGR);//转化边缘检测后的图为灰度图 vector<Vec4i> lines;定义一个矢量结构lines用于存放得到的线段矢量集合 //HoughLines(src1, lines, 1, CV_PI / 180, 150, 0, 0); HoughLinesP(src1, lines, 1, CV_PI / 180, 80, 50, 10);//进行霍夫线变换 for (size_t i = 0; i < lines.size(); i++) { float rho = lines[i][0], 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)); Vec4i l = lines[i]; line(src2, pt1, pt2, Scalar(55, 100, 195), 1, CV_AA); } imshow("效果图窗口", src1); waitKey(3000); imshow("效果图窗口", src2); waitKey(3000); return 0; }
C++: void HoughLinesP(InputArray image, OutputArray lines, double rho, double theta, int threshold, double minLineLength=0, double maxLineGap=0 )
第一个参数,InputArray类型的image,输入图像,即源图像,需为8位的单通道二进制图像,可以将任意的源图载入进来后由函数修改成此格式后,再填在这里。
第二个参数,InputArray类型的lines,经过调用HoughLinesP函数后后存储了检测到的线条的输出矢量,每一条线由具有四个元素的矢量(x_1,y_1, x_2, y_2) 表示,其中,(x_1, y_1)和(x_2, y_2) 是是每个检测到的线段的结束点。第三个参数,double类型的rho,以像素为单位的距离精度。另一种形容方式是直线搜索时的进步尺寸的单位半径。第四个参数,double类型的theta,以弧度为单位的角度精度。另一种形容方式是直线搜索时的进步尺寸的单位角度。第五个参数,int类型的threshold,累加平面的阈值参数,即识别某部分为图中的一条直线时它在累加平面中必须达到的值。大于阈值threshold的线段才可以被检测通过并返回到结果中。第六个参数,double类型的minLineLength,有默认值0,表示最低线段的长度,比这个设定参数短的线段就不能被显现出来。第七个参数,double类型的maxLineGap,有默认值0,允许将同一行点与点之间连接起来的最大的距离。