【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;
}
运行结果
【OpenCV】Hough检测相关推荐
- Hough 检测直线
1.Hough变换 Hough变换是一种快速的形状匹配技术.经典的H ough变换适用于曲线形状可以用参数来描述.而曲线位置未知情况下的曲线检测.如下: 在笛卡儿坐标系中, 直线可以用斜截方程y = ...
- opencv霍夫变换检测圆cvHoughCircles和直线cvHoughLines2的应用
opencv霍夫变换检测圆cvHoughCircles和直线cvHoughLines2的应用 1)cvHonghLines2:直线 2)cvHoughCircles:该函数用Hough变换在二值图像中 ...
- Pyhton,OpenCV对象检测之——Haar级联人脸及眼睛检测
Pyhton,OpenCV对象检测之--Haar级联人脸及眼睛检测 1. 效果图 2. 原理 2.1 Haar人脸检测原理 2.2 Haar级联预训练的模型 3. 源码 3.1 图像面部及眼睛检测 3 ...
- 使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones)
使用Python,OpenCV+OCR检测护照图像中的机器可读区域(MRZ Machine-Readable Zones) 1. 效果图 2. 原理 3. 源码 参考 这篇博客将介绍如何只使用基本的图 ...
- 如何使用 OpenCV Python 检测颜色
作者 | 小白 来源 | 小白学视觉 在这篇文章中,我们将看到如何使用 Python 中的 OpenCV 模块检测颜色,进入这个领域的第一步就是安装下面提到的模块. pip install openc ...
- OpenCV行人检测
注:本文翻译自:Pedestrian Detection OpenCV. 你知道OpenCV里面已经内置的行人检测方法吗?在OpenCV里面,有一个预先训练好了的HOG+线性SVM模型,能够对图像和视 ...
- OpenCV SURF检测的实例(附完整代码)
OpenCV SURF检测的实例 OpenCV SURF检测的实例 OpenCV SURF检测的实例 #include <iostream> #include "opencv2/ ...
- OpenCV方形检测Square Detection的实例(附完整代码)
OpenCV方形检测Square Detection的实例 OpenCV方形检测Square Detection的实例 OpenCV方形检测Square Detection的实例 #include & ...
- OpenCV BLOB检测和过滤区域的实例(附完整代码)
OpenCV BLOB检测和过滤区域的实例 OpenCV BLOB检测和过滤区域的实例 OpenCV BLOB检测和过滤区域的实例 #include <opencv2/core.hpp> ...
最新文章
- JavaScript正则表达式在线测试工具
- android多线程下载图片
- C#带按钮的文本框TextBoxContainButton
- 家装强电弱电布线图_家装水电施工标准(图文版),装修小白一眼也能看懂。...
- xshell修改编辑文件并保存
- 光伏并网matlab,基于MATLAB的光伏并网设计
- Java反射学习总结终(使用反射和注解模拟JUnit单元测试框架)
- C语言--求一元二次方程的根(分支)
- 荣耀 MagicBook pro 拆机图及硬盘安装过程
- 哈希表的应用之电话本
- win2008服务器系统玩红警,win10系统玩红警卡死的两种方法
- 2022.11.22 英语背诵
- Unity与讯飞的aiui交互
- [Web] [微信小程序-云开发] 商城 无服务器 加后台管理
- RIS前言技术讲座系列
- java计算机毕业设计医院远程诊断系统源代码+系统+数据库+lw文档
- 深度学习第四次培训(SVM算法)
- error怎么开机 fan_电脑开机后显示CPU Fan Error错误提示怎么办?分享六种解决方法...
- Linux云计算架构-docker容器命名和资源配额控制(2)
- 使用 Go 编程语言 66 个陷阱:Golang 开发者的陷阱和常见错误指北
热门文章
- log4j2 mysql_[简单]log4jdbc-log4j2配置简记
- AUTOSAR标准与产业发展动态
- 计算机组成原理 第七章 输入输出系统
- 技巧|BurpSuite实现监听代理流量,隐匿身份
- nlp-tutorial代码注释1-2,词向量、Word2Vec、Skip-gram简述
- 语义分割——上采样插值resize的学习笔记
- C#中的Invoke和BeginInvoke
- 如何在markdown(csdn)中打出某个字符上面的三角帽子符号
- windows的回车换行“\r\n“,Linux的回车换行“\n“
- Cubic interpolation立方插值