OpenCV(三十六):霍夫直线检测

简介: OpenCV(三十六):霍夫直线检测

1.检测直线的霍夫变换原理

2.检测直线函数HoughLines()

检测直线流程:

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

)

参数说明:

  • image:输入的二值图像,通常是经过边缘检测后的图像。
  • lines:输出参数,包含检测到的直线的向量。
  • rho:极径参数ρ的精确度,以像素为单位。
  • theta:角度参数θ的精确度,以弧度为单位。
  • threshold:参数空间中投票阈值,用于确定检测到的直线。
  • srn、stn、min_theta、max_theta:这些参数是可选的,用于进一步细化直线检测的精度和范围。

示例代码:

void drawLine(Mat &img,//要标记直线的图像
              vector<Vec2f> lines,//检测的直线数据
              double rows,//原图像的行数(高)
              double cols,//原图像的列数(宽)
              Scalar scalar,//绘制直线的颜色
              int n//绘制直线的线宽
              ){
    Point pt1,pt2;
    for(size_t i=0;i<lines.size();i++){
        float rho=lines[i][0];//直线距离坐标原点的距离
        float theta=lines[i][1];//直线过坐标原点垂线
        double a=cos(theta);//夹角的余弦值
        double b=sin(theta);//夹角的正弦值
        double x0=a*rho,y0=b*rho;//直线与坐标原点的垂线的交点
        double length=max(rows,cols);//图像高宽的最大值
        //计算直线上的一点
        pt1.x= cvRound(x0+length*(-b));
        pt1.y= cvRound(y0+length*(a));
        //计算直线上的另一点
        pt2.x= cvRound(x0-length*(-b));
        pt2.y= cvRound(y0-length*(a));
        //两点绘制一条直线
        line(img,pt1,pt2,scalar,n);
    }
}
//霍夫直线检测
void Hough_linear_detection(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Mat edge;
    //检测边缘图像,并二值化
    Canny(gray,edge,80,180,3, false);
    //用不同的累加器进行检测直线
    vector<Vec2f> 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进行检测直线:

3.检测直线函数 HoughLinesP()

void cv::HoughLinesP ( InputArray   image,

OutputArray lines,

double     rho,

double    theta,

int        threshold,

double   minLineLength =0,

double   maxLineGap = 0

)

  • image:待检测直线的原图像,必须是CV_8C的单通道二值图像
  • lines:霍夫变换检测到的直线输出量,每一条直线都由4个参数进行描述,分别是直线两个端点的坐标
  • rho:以像素为单位的距离分辨率。
  • theta: 以弧度为单位的角度分辨率
  • threshold:累加器的阈值
  • minLineLength: 直线的最小长度,当检测直线的长度小于该数值时将会被剔除
  • maxLineGap:允许将同一行两个点连接起来的最大距离。

示例代码:

//霍夫直线检测
void Hough_linearP_detection(Mat image){
    Mat gray;
    cvtColor(image,gray,COLOR_BGR2GRAY);
    Mat edge;
    //检测边缘图像,并二值化
    Canny(gray,edge,80,180,3, false);
    //利用渐进概率式霍夫变换提取直线
    vector<Vec4i> 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<linesP1.size();i++){
        line(img1,Point(linesP1[i][0],linesP1[i][1]),
             Point(linesP1[i][2],linesP1[i][3]),Scalar(255),3);
    }
    //绘制两个点连接最大距离30直线检测结果
    Mat img2;
    image.copyTo(img2);
    for(size_t i=0;i<linesP2.size();i++){
        line(img2,Point(linesP2[i][0],linesP2[i][1]),
             Point(linesP2[i][2],linesP2[i][3]),Scalar(255),3);
    }
    //显示图像
    imwrite("/sdcard/DCIM/img10.png",img1);
    imwrite("/sdcard/DCIM/img20.png",img2);
}

绘制两个点连接最大距离10直线检测结果:

绘制两个点连接最大距离30直线检测结果:

目录
相关文章
|
算法 计算机视觉
OpenCV(四十三):Shi-Tomas角点检测
OpenCV(四十三):Shi-Tomas角点检测
709 0
|
计算机视觉
OpenCV(三十八):二维码检测
OpenCV(三十八):二维码检测
1286 0
|
计算机视觉 索引
OpenCV(三十五):凸包检测
OpenCV(三十五):凸包检测
490 0
|
存储 资源调度 算法
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
Opencv(C++)系列学习---SIFT、SURF、ORB算子特征检测
1493 0
|
计算机视觉
Opencv学习笔记(八):如何通过cv2读取视频和摄像头来进行人脸检测(jetson nano)
如何使用OpenCV库通过cv2模块读取视频和摄像头进行人脸检测,并提供了相应的代码示例。
588 1
|
存储 算法 计算机视觉
OpenCV(四十二):Harris角点检测
OpenCV(四十二):Harris角点检测
762 0
|
XML 机器学习/深度学习 人工智能
使用 OpenCV 和 Python 轻松实现人脸检测
本文介绍如何使用OpenCV和Python实现人脸检测。首先,确保安装了OpenCV库并加载预训练的Haar特征模型。接着,通过读取图像或视频帧,将其转换为灰度图并使用`detectMultiScale`方法进行人脸检测。检测到的人脸用矩形框标出并显示。优化方法包括调整参数、多尺度检测及使用更先进模型。人脸检测是计算机视觉的基础技术,具有广泛应用前景。
887 10
|
机器学习/深度学习 计算机视觉
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
本文介绍了如何使用OpenCV进行特定区域的目标检测,包括人脸检测实例,展示了两种实现方法和相应的代码。
662 1
目标检测笔记(六):如何结合特定区域进行目标检测(基于OpenCV的人脸检测实例)
|
机器学习/深度学习 传感器 算法
OpenCV4工业缺陷检测的六种方法
OpenCV4工业缺陷检测的六种方法
|
算法 计算机视觉 Python
圆形检测算法-基于颜色和形状(opencv)
该代码实现了一个圆检测算法,用于识别视频中的红色、白色和蓝色圆形。通过将图像从RGB转换为HSV颜色空间,并设置对应颜色的阈值范围,提取出目标颜色的区域。接着对这些区域进行轮廓提取和面积筛选,使用霍夫圆变换检测圆形,并在原图上绘制检测结果。
917 0