参考:https://blog.csdn.net/qq_15971883/article/details/80583364
image: 必须是二值图像,推荐使用canny边缘检测的结果图像;
rho: 线段以像素为单位的距离精度,double类型的,推荐用1.0
theta: 线段以弧度为单位的角度精度,推荐用numpy.pi/180
threshod: 累加平面的阈值参数,int类型,超过设定阈值才被检测出线段,值越大,基本上意味着检出的线段越长,检出的线段个数越少。根据情况推荐先用100试试
lines:这个参数的意义未知,发现不同的lines对结果没影响,但是不要忽略了它的存在
minLineLength:线段以像素为单位的最小长度,根据应用场景设置
maxLineGap:同一方向上两条线段判定为一条线段的最大允许间隔(断裂),超过了设定值,则把两条线段当成一条线段,值越大,允许线段上的断裂越大,越有可能检出潜在的直线段
#include <opencv2/opencv.hpp> #include <iostream> #include <math.h> #include <vector> using namespace cv; using namespace std; Mat src, dst,dst2,gray_src; char* INPUT_WIN = "input image"; char* OUTPUT_WIN = "binary image"; int t1_value = 50; int max_value = 255; int main() { src = imread(".//pic//LDW.bmp"); namedWindow(INPUT_WIN, CV_WINDOW_AUTOSIZE); imshow(INPUT_WIN, src); Mat src_gray; 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, 50, 20, 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); } imshow("直线检测", dst); waitKey(0); return 0; }