• 霍夫直线变换


    霍夫直线变换主要用于直线特征的检测,其主要思想如下

    1.将图形中的点从空域坐标(x,y)转化为极坐标 x=ρcosθ,y=ρsinθ,R2=(ρcosθ)2+(ρsinθ)2

    2.对极坐标进行变换,转化为θ与R的关系

      R2=R2cos2θ+R2sin2θ

      R=Rcos2θ+Rsin2θ

      R=xcosθ+ysinθ,将xy看成定值,该公式表达R与θ的关系,可以在坐标系中用曲线表示,横坐标为θ,纵坐标为R

    3.检测多个R-θ曲线的交点

    为什么找交点?

     以上图为例,如果右边两个区线相交,表示不同的点(x1,y1),(x2,y2)具有相同的θ和R,也就是说我们检测的这两个点在极坐标表示中是处于同一条直线上的,对于要检测的直线,如果它上面的点画出的曲线都可以相交于一点,那么说明他是一条直线

    示例代码

    #include<iostream>
    #include<opencv2/opencv.hpp>
    
    using namespace std;
    using namespace cv;
    
    int main(int argc, char** argv)
    {
        Mat src, src_gray, dst;
        src = imread("1.jpg");
        if (!src.data)
        {
            printf("load img error
    ");
            return -1;
        }
    
        char INPUT_TITLE[] = "Input img";
        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, 20);
        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(OUTPUT_TITLE, dst);
        waitKey(0);
        return 0;
    }

    先进行灰度转化,然后将检测结果颜色设为红色,以向量形式存放

    HoughLinesP就是opencv中的霍夫直线变换api前两个是输入输出,1表示极坐标生成时扫描像素的步长,∏/180是横坐标取点的频率,第一个10表示最少重合点个数,第二个10表示两点间隔最大距离

    结果如图

  • 相关阅读:
    Understanding FiddlerScript
    RPG游戏地牢设计的29个要点
    《皇室战争》中关于兰彻斯特方程的应用及数值设计
    写给想做主策的策划师们
    AI设计的若干规则阐述
    Unreal引擎术语表
    UDK编辑器 49条小提示
    UE3代码阅读需知
    Framework配置错误
    迅雷的笔试题
  • 原文地址:https://www.cnblogs.com/wangtianning1223/p/13239328.html
Copyright © 2020-2023  润新知