检测直线流程:
Step1:将参数空间的坐标轴离散化。
Step2:将图像中每个非0像素通过映射关系求取在参数空间通过的方格
Step3:统计参数空间内每个方格出现的次数,选取次数大于某一值的方格作为表示直线的方格
Step4:将参数空间中表示直线的方格的参数作为图像中直线的参数
void cv::HoughLines ( InputArray image
OutputArray lines,
double rho,
double theta,
int threshold.
double srn = 0,
double stn =0,
double min_theta = 0,
double max_theta = CV_PI
)
参数说明:
示例代码:
void drawLine(Mat &img,//要标记直线的图像
vector lines,//检测的直线数据
double rows,//原图像的行数(高)
double cols,//原图像的列数(宽)
Scalar scalar,//绘制直线的颜色
int n//绘制直线的线宽
){
Point pt1,pt2;
for(size_t i=0;i lines1,lines2;
HoughLines(edge, lines1,1,CV_PI/180,50,0,0);
HoughLines(edge, lines2,1,CV_PI/180,150,0,0);
//在原图像中绘制直线
Mat img1,img2;
image.copyTo(img1);
image.copyTo(img2);
drawLine(img1,lines1,edge.rows,edge.cols,Scalar(255),2);
drawLine(img2,lines2,edge.rows,edge.cols,Scalar(255),2);
//显示图像
imwrite("/sdcard/DCIM/edge.png",edge);
imwrite("/sdcard/DCIM/img1.png",img1);
imwrite("/sdcard/DCIM/img2.png",img2);
}
Canny算子边缘检测后图片 :
用累加器为50进行检测直线:
用累加器为150进行检测直线:
void cv::HoughLinesP ( InputArray image,
OutputArray lines,
double rho,
double theta,
int threshold,
double minLineLength =0,
double maxLineGap = 0
)
示例代码:
//霍夫直线检测
void Hough_linearP_detection(Mat image){
Mat gray;
cvtColor(image,gray,COLOR_BGR2GRAY);
Mat edge;
//检测边缘图像,并二值化
Canny(gray,edge,80,180,3, false);
//利用渐进概率式霍夫变换提取直线
vector linesP1,linesP2;
HoughLinesP(edge, linesP1,1,CV_PI/180,150,30,10);//两个点连接最大距离10
HoughLinesP(edge, linesP2,1,CV_PI/180,150,30,30);//两个点连接最大距离30
//绘制两个点连接最大距离10直线检测结果
Mat img1;
image.copyTo(img1);
for(size_t i=0;i
绘制两个点连接最大距离10直线检测结果: