霍夫变换直线检测

一、霍夫变换直线检测:

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;
}

 

实验结果:

输入                                       边缘检测                                 霍夫直线检测

 

posted @ 2019-09-09 08:21  量子与太极  阅读(798)  评论(0编辑  收藏  举报