opencv3学习之霍夫变换

霍夫变换分为霍夫线变换和霍夫圆变换。

1.霍夫线变换分为三种:标准霍夫变换、多尺度霍夫变换、累计概率霍夫变换。前两个由HoughLines调用,第三个 由HoughLinesP调用。

   霍夫线变换的原理:其实就是笛卡尔坐标和极坐标之间的转换,公式:r=x*cosθ+y*sinθ

对于给定的x,y一点,对于笛卡尔坐标中的任意一点x,y都可以根据公式作出一个图像,也就是一条曲线,如果两个点(x1,y1),(x2,y2)的图像能够交于一点,那么说明这两点在同一条直线上。可以通过设置阈值,来限定多少点交于一点则认为它们在一条直线上。

代码如下:

#include <opencv2/opencv.hpp>

#include <opencv2/highgui/highgui.hpp>

#include <opencv2/imgproc/imgproc.hpp>

using namespace cv;

using namespace std;

int main(){

    Mat srcImage,midImage,dstImage;

    srcImage=imread("/Users/oumoemoe/Downloads/timg-2.jpeg");

    

    Canny(srcImage, midImage, 50, 200,3);

    cvtColor(midImage, dstImage, CV_GRAY2BGR);

    

    vector<Vec2f> lines;

    HoughLines(midImage, lines, 1, CV_PI/180, 150,0,0);

    

    for(size_t i=0;i<lines.size();i++){

        float rho=lines[i][0],theta=lines[i][1];//lines是一个矢量,它有两个参数,第一个参数是rho也就是当前点到坐标原点的距离,第二个参数是角度。用i做变量是因为我们要获取每个点的信息,对每个点进行处理。

        double a=cos(theta),b=sin(theta);

        double x0=rho*a,y0=rho*b;

        Point pt1,pt2;

        pt1.x=cvRound(x0+1000*(-b));

        pt1.y=cvRound(y0+1000*a);

        pt2.x=cvRound(x0-1000*(-b));

        pt2.y=cvRound(y0+1000*(-a));

//上面这些式子,可以用下面这个图来解释,其中这个1000,是随意取得,就是说上下到(x0,y0)这个点各1000

//pt1,pt2两点的坐标就是通过下面的几何变换推倒出来的,这个图是我自己画的


        

       





  line(dstImage, pt1, pt2, Scalar(55, 10,195),1,LINE_AA);//pt1,pt2分为代表直线的起点和终点,毕竟两个点就能确定一条直线

    }

    imshow("1", midImage);

    imshow("2", dstImage);

    waitKey(0);

    return 0;

}



  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值