OpenCV——概率霍夫检测

概率霍夫变换是一种基于泛洪算法的直线检测算法。相较于传统霍夫变换,概率霍夫变换可以在保证一定的精度前提下,大大提高了直线检测效率。下面是  OpenCV  C++  实现概率霍夫检测的示例代码:

#include <opencv2/opencv.hpp>
#include <iostream>
#include <math.h>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{
    Mat src, dst, color_dst;
    if (argc != 2 || !(src = imread(argv[1], IMREAD_GRAYSCALE)).data)
        return -1;
    Canny(src, dst, 50, 200, 3);
    cvtColor(dst, color_dst, COLOR_GRAY2BGR);
    vector4i> lines;
    HoughLinesP(dst, lines, 1, CV_PI / 180, 50, 50, 10);
    for (size_t i = 0; i < lines.size(); i++)
    {
        Vec4i l = lines[i];
        line(color_dst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA);
    }
    namedWindow("Source", WINDOW_NORMAL);
    imshow("Source", src);
    namedWindow("Detected Lines", WINDOW_NORMAL);
    imshow("Detected Lines", color_dst);
    waitKey(0);
    return 0;
}

代码解释如下:

-  首先读入一张灰度图片并进行  Canny  边缘检测。

-  然后调用`cv::HoughLinesP`  函数进行概率霍夫检测,检测到的直线存储在`std::vector<Vec4i>`  中。

对于  HoughLinesP  函数几个参数的含义:

-`dst`:输入图像;
-`lines`:输出的直线集合;
-`1`:表示直线的检测步长,单位为像素;
-`CV_PI  /  180`:表示角度的检测步长,单位为弧度;
-`50`:表示累加阈值,累加值低于该值则被丢弃;
-`50`:表示最小线段长度,小于该值的线条会被丢弃;
-`10`:表示最大线段间隙,同一条线段中断的间隙超过该值则会被分为两条线段。

-  最后,将检测到的直线可视化,并显示原始灰度图和检测结果。

注意,我们使用`Vec4i`  类型来存储概率霍夫检测得到的直线。`Vec4i`  是一个长度为  4  的定长向量,分别表示直线的起点和终点坐标。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值