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;
}

运行结果


【OpenCV】Hough检测相关推荐

  1. Hough 检测直线

    1.Hough变换 Hough变换是一种快速的形状匹配技术.经典的H ough变换适用于曲线形状可以用参数来描述.而曲线位置未知情况下的曲线检测.如下: 在笛卡儿坐标系中, 直线可以用斜截方程y = ...

  2. opencv霍夫变换检测圆cvHoughCircles和直线cvHoughLines2的应用

    opencv霍夫变换检测圆cvHoughCircles和直线cvHoughLines2的应用 1)cvHonghLines2:直线 2)cvHoughCircles:该函数用Hough变换在二值图像中 ...

  3. Pyhton,OpenCV对象检测之——Haar级联人脸及眼睛检测

    Pyhton,OpenCV对象检测之--Haar级联人脸及眼睛检测 1. 效果图 2. 原理 2.1 Haar人脸检测原理 2.2 Haar级联预训练的模型 3. 源码 3.1 图像面部及眼睛检测 3 ...

  4. 使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones)

    使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones) 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何只使用基本的图 ...

  5. 如何使用 OpenCV Python 检测颜色

    作者 | 小白 来源 | 小白学视觉 在这篇文章中,我们将看到如何使用 Python 中的 OpenCV 模块检测颜色,进入这个领域的第一步就是安装下面提到的模块. pip install openc ...

  6. OpenCV行人检测

    注:本文翻译自:Pedestrian Detection OpenCV. 你知道OpenCV里面已经内置的行人检测方法吗?在OpenCV里面,有一个预先训练好了的HOG+线性SVM模型,能够对图像和视 ...

  7. OpenCV SURF检测的实例(附完整代码)

    OpenCV SURF检测的实例 OpenCV SURF检测的实例 OpenCV SURF检测的实例 #include <iostream> #include "opencv2/ ...

  8. OpenCV方形检测Square Detection的实例(附完整代码)

    OpenCV方形检测Square Detection的实例 OpenCV方形检测Square Detection的实例 OpenCV方形检测Square Detection的实例 #include & ...

  9. OpenCV BLOB检测和过滤区域的实例(附完整代码)

    OpenCV BLOB检测和过滤区域的实例 OpenCV BLOB检测和过滤区域的实例 OpenCV BLOB检测和过滤区域的实例 #include <opencv2/core.hpp> ...

最新文章

  1. JavaScript正则表达式在线测试工具
  2. android多线程下载图片
  3. C#带按钮的文本框TextBoxContainButton
  4. 家装强电弱电布线图_家装水电施工标准(图文版),装修小白一眼也能看懂。...
  5. xshell修改编辑文件并保存
  6. 光伏并网matlab,基于MATLAB的光伏并网设计
  7. Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)
  8. C语言--求一元二次方程的根(分支)
  9. 荣耀 MagicBook pro 拆机图及硬盘安装过程
  10. 哈希表的应用之电话本
  11. win2008服务器系统玩红警,win10系统玩红警卡死的两种方法
  12. 2022.11.22 英语背诵
  13. Unity与讯飞的aiui交互
  14. [Web] [微信小程序-云开发] 商城 无服务器 加后台管理
  15. RIS前言技术讲座系列
  16. java计算机毕业设计医院远程诊断系统源代码+系统+数据库+lw文档
  17. 深度学习第四次培训(SVM算法)
  18. error怎么开机 fan_电脑开机后显示CPU Fan Error错误提示怎么办?分享六种解决方法...
  19. Linux云计算架构-docker容器命名和资源配额控制(2)
  20. 使用 Go 编程语言 66 个陷阱:Golang 开发者的陷阱和常见错误指北

热门文章

  1. log4j2 mysql_[简单]log4jdbc-log4j2配置简记
  2. AUTOSAR标准与产业发展动态
  3. 计算机组成原理 第七章 输入输出系统
  4. 技巧|BurpSuite实现监听代理流量,隐匿身份
  5. nlp-tutorial代码注释1-2,词向量、Word2Vec、Skip-gram简述
  6. 语义分割——上采样插值resize的学习笔记
  7. C#中的Invoke和BeginInvoke
  8. 如何在markdown(csdn)中打出某个字符上面的三角帽子符号
  9. windows的回车换行“\r\n“,Linux的回车换行“\n“
  10. Cubic interpolation立方插值