【OpenCV】Hough检测

Hough直线检测

  使用 HoughLines()和HoughLinesP() 检测图像中的直线。

void cv::HoughLines (   InputArray  image,  OutputArray     lines,
                        double  rho,        double  theta,
                        int     threshold,  double  srn = 0,
                        double  stn = 0,    double  min_theta = 0,
                        double  max_theta = CV_PI 
)   

void cv::HoughLinesP(   InputArray  image,  OutputArray     lines,
                        double  rho,        double  theta,
                        int     threshold,  double  minLineLength = 0,
                        double  maxLineGap = 0 
)   

说明:image是输入的8位单通道二进制图像,lines是线的输出向量,
     rho是累加器的距离分辨率,theta是累加器角度分辨率弧度,threshold是阈值。


  在Hough变换中,我们使用极坐标而非笛卡尔坐标。


  原理参考:https://docs.opencv.org/master/d9/db0/tutorial_hough_lines.html


代码示例

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    Mat src, dst, cdst, cdstP;
    char* filename = "../data/sudoku.png";
    src = imread(filename, IMREAD_GRAYSCALE);
    if (src.empty()) { return -1; }

    Canny(src, dst, 50, 200, 3);                // Canny算子边缘检测
    cvtColor(dst, cdst, COLOR_GRAY2BGR);        // 转换灰度图像
    cdstP = cdst.clone();

    vector<Vec2f> lines;
    HoughLines(dst, lines, 1, CV_PI / 180, 150, 0, 0);  // hough检测
    for (size_t i = 0; i < lines.size(); i++)           // 绘制线条
    {
        float rho = lines[i][0], theta = lines[i][1];
        Point pt1, pt2;
        double a = cos(theta), b = sin(theta);
        double x0 = a*rho, y0 = b*rho;
        pt1.x = cvRound(x0 + 1000 * (-b));
        pt1.y = cvRound(y0 + 1000 * (a));
        pt2.x = cvRound(x0 - 1000 * (-b));
        pt2.y = cvRound(y0 - 1000 * (a));
        line(cdst, pt1, pt2, Scalar(0, 0, 255), 3, CV_AA);
    }

    vector<Vec4i> linesP;
    HoughLinesP(dst, linesP, 1, CV_PI / 180, 50, 50, 10);
    for (size_t i = 0; i < linesP.size(); i++)
    {
        Vec4i l = linesP[i];
        line(cdstP, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 3, LINE_AA);
    }

    imshow("Source", src);
    imshow("HoughLines", cdst);
    imshow("HoughLinesP", cdstP);

    waitKey();
    return 0;
}


运行结果


Hough圆检测

void cv::HoughCircles   (   InputArray  image,    OutputArray   circles,
                            int    method,        double    dp,
                            double minDist,    
                            double param1 = 100,  double    param2 = 100,
                            int   minRadius = 0,  int maxRadius = 0 
)   

说明:dp是累加器分辨率与图像分辨率的反比。例如,如果dp = 1,则累加器具有与输入图像相同的分辨率。如果dp = 2,则累加器的宽度和高度只有一半。
     minDist指检测到的圆圈中心之间的最小距离。
     param1:用于Canny的边缘阀值上限,下限被置为上限的一半。
     param2:累加器的阀值。

代码示例

#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"

using namespace cv;
using namespace std;

int main(int argc, char** argv)
{
    char* filename = "../data/smarties.png";
    Mat src = imread(filename, IMREAD_COLOR);
    if (src.empty()) { return -1; }

    Mat gray;
    cvtColor(src, gray, COLOR_BGR2GRAY);
    medianBlur(gray, gray, 5);              // 中值滤波,滤除噪声,避免错误检测

    vector<Vec3f> circles;
    HoughCircles(gray, circles, HOUGH_GRADIENT, 1, gray.rows / 16, 100, 30, 1, 30); // Hough圆检测

    for (size_t i = 0; i < circles.size(); i++)
    {
        Vec3i c = circles[i];
        Point center = Point(c[0], c[1]);
        circle(src, center, 1, Scalar(0, 100, 100), 3, LINE_AA);                    // 画圆
        int radius = c[2];
        circle(src, center, radius, Scalar(255, 0, 255), 3, LINE_AA);
    }

    imshow("detected circles", src);

    waitKey();
    return 0;
}


运行结果


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是关于OpenCV中霍夫变换的介绍: 1. 霍夫变换概述 霍夫变换是一种图像处理技术,用于检测几何形状,例如直线、圆和椭圆等。它的基本思想是将图像空间中的点映射到参数空间中,从而在参数空间中检测几何形状。 2. OpenCV中的霍夫线变换 OpenCV中的霍夫线变换有三种:标准霍夫变换(Standard Hough Transform, SHT),由HoughLines函数调用;多尺度霍夫变换(MSHT),由HoughLines函数调用;累计概率霍夫变换(PPHT),由HoughLinesP函数调用。 3. 霍夫线变换的原理 霍夫线变换的基本原理是将图像中的每个点转换为参数空间中的一条线,然后在参数空间中找到交点,这些交点表示了图像中的直线。在标准霍夫变换中,参数空间由两个参数组成:极角和极径。在累计概率霍夫变换中,参数空间由两个参数组成:直线的起点和终点。 4. 标准霍夫变换:HoughLines()函数 标准霍夫变换由HoughLines函数调用。该函数将图像转换为二值图像,并在二值图像中查找直线。它返回一个包含检测到的直线的数组。 5. 累计概率霍夫变换:HoughLinesP()函数 累计概率霍夫变换由HoughLinesP函数调用。该函数与HoughLines函数类似,但它使用概率方法来查找直线。它返回一个包含检测到的直线的数组。 6. 霍夫圆变换 霍夫圆变换是一种检测圆形的技术。它的基本思想是将圆心和半径映射到参数空间中,从而在参数空间中检测圆形。 6.1 霍夫梯度法的原理 霍夫梯度法是一种检测圆形的技术。它的基本思想是在图像中查找梯度,并在梯度方向上查找圆形。 6.2 霍夫梯度法的缺点 霍夫梯度法的缺点是它对噪声敏感,并且它只能检测较大的圆形。 6.3 霍夫圆变化:HoughCircles()函数 霍夫圆变换由HoughCircles函数调用。该函数在图像中查找圆形,并返回一个包含检测到的圆形的数组。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值