【Opencv学习笔记】7.2霍夫变换

霍夫变换的原理

基本内容

【参考】
http://baike.baidu.com/link?url=OgGcz6JlkOX4noLuAEVHlFC-YTxs3KtVNEGbJ14RdDUEIHXVhj7JA-JSkK6LB0p26uk2pwXdSPN-R6Hd0ophHq

百度百科中这一段叙述的非常好!这里就不多说了,简而言之:

将待检测画面上的无数小线段都延伸为直线,直线必然会通过某点,如果某点被通过的次数非常多,那说明相同方向的小线段非常多,多到形成一个足够通过检测的直线(线段)。
同理,将笛卡尔坐标系转换为极坐标系,就可以求得一点 r0,θ0) 来确定一条直线,而通过该点的直线多得超过某个阈值,就说明画面上存在一条足够长的直线(线段)可以被检测到。


代码

关于对毛星云先生《Opencv3编程入门》这本书,这一章节的代码部分提出一点修改建议。

1、在Opencv3中,头文件包括 opencv2/opencv.hpp 即可。
2、在Opencv3中,Canny()函数的输入图像必须是单通道图像,因此,在该书p273页示例程序中,读取srcImage时应读入灰度图像,在进行Canny边缘检测后不需要转换颜色模型。

#include<opencv2/opencv.hpp>
#include<vector>

using namespace cv;
using namespace std;

int main(){
    Mat scrImage = imread("C:/Users/eva72/Documents/VS2013_Projects/Projects/StudyOpenCV/EE.jpg");
    Mat midImage;
    cvtColor(scrImage, midImage, CV_RGB2GRAY);
    Canny(midImage, midImage, 50, 150);
    vector<Vec2f> lines;
    HoughLines(midImage, lines, 1, CV_PI / 360, 150);
    for (int i = 0; i < lines.size(); i++){
        float rho = lines[i][0]; float theta = lines[i][1];
        //根据求得的极坐标划线
        Point x, y;
        x.x = (int)(rho / cos(theta));
        x.y = 0;
        y.x = 0;
        y.y = (int)(rho / sin(theta));
        line(scrImage, x, y, Scalar(55, 100, 195));
    }
    imshow("效果", scrImage);
    waitKey(6000);
    return 0;
}

如有错误之处还请指正。

效果

这里写图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值