OpenCV的霍夫变换(Hough Transform)圆检测
2017-10-20 20:17
585 查看
Hough变换检测圆
霍夫变换也可以用于检测其他几何形体,事实上,可以用参数方程表示的几何体都可以尝试用霍夫变换进行检测。比如圆形,它对应的参数方程为:r2=(x-x0)2+(y-y0)2
该函数包含三个参数,分别是圆心的坐标和圆的半径,这意味着需要三维的累加器。
OpenCV中实现的霍夫圆检测算法通常是两个步骤:
1. 二维累加器用于寻找可能为圆的位置。由于在圆周上的点的梯度应该指向半径的方向,因此对于每一个点,只有沿着梯度方向的项才得到增加(需要预先设定最大和最小的半径);
2. 若找到了圆心,则构建一维的半径的直方图,这个直方图的峰值对应的是检测到的圆的半径。
OpenCV中的霍夫变换圆检测函数 cv::HoughCircles:
它整合了Canny检测和霍夫变换,输出是cv::Vec3f向量,每个元素包含检测圆的圆心坐标和半径(cx, cy, radius)。
另外,在进行霍夫变换之前,先对操作图像进行平滑,以减少可能引起误检测的噪声点。
#include "opencv2/highgui.hpp" #include "opencv2/core.hpp" #include "opencv2/imgproc.hpp" class CircleFinder{ private: std::vector<cv::Vec3f> circles; double dp; // 累加器的分辨率(图像尺寸/2) double minDist; // 两个圆之间的最小距离 double th; // Canny中的高阈值 double minVote; // 最小投票数 int minR; int maxR; // 有效半径的最小值和最大值 public: CircleFinder() { dp = 1.0, minDist = 1.0; th = 300; minVote = 80; minR = 1, maxR = 100; } void setDPandThreshold(double dp, double th) { dp = dp; th = th; } void setMinVote(double minv) { minVote = minv; } void setCircleParams(double minD, int minR, int maxR) { minDist = minD; minR = minR; maxR = maxR; } // Hough变换检测圆 void findCircles(cv::Mat& imageBlur) { circles.clear(); cv::HoughCircles(imageBlur, circles, CV_HOUGH_GRADIENT, dp, minDist, th, minVote, minR, maxR); } void drawDetectedCircles(cv::Mat &image, cv::Scalar color = cv::Scalar(255)) { std::vector<cv::Vec3f>::const_iterator itc = circles.begin(); while (itc != circles.end()) { cv::Point pt((*itc)[0], (*itc)[1]); cv::circle(image, pt, int((*itc)[2]), cv::Scalar(255), 2); //画圆 ++itc; } } }; int main(int argc, char *argv[]) { cv::Mat image = cv::imread("D:/VS_exercise/images/coin3.jpg"); cv::Mat imageGray; cv::cvtColor(image, imageGray, cv::COLOR_RGB2GRAY); // 在调用cv::HoughCircles函数前对图像进行平滑,减少误差 cv::Mat imageBlur; cv::GaussianBlur(imageGray, imageBlur, cv::Size(5, 5), 1.5); // Hough变换检测 CircleFinder finder; finder.setDPandThreshold(2, 300); finder.setMinVote(25); finder.setCircleParams(20, 5, 100); finder.findCircles(imageBlur); finder.drawDetectedCircles(image); // 显示 cv::namedWindow("Detected Lines with Hough"); cv::imshow("Detected Lines with Hough", image); cv::waitKey(0); return 0; }
相关文章推荐
- OpenCV的霍夫变换(Hough Transform)直线检测
- OpenCV使用霍夫变换检测图像中的形状
- opencv 霍夫变换检测直线
- 在OpenCV下利用霍夫变换进行直线检测和圆检测
- opencv检测直线方法——霍夫变换
- OpenCV-Python教程(9、使用霍夫变换检测直线)
- 霍夫变换检测直线及openCV代码
- 利用霍夫变换做直线检测的原理及OpenCV代码实现
- Hough Transform(霍夫变换)检测Circle(圆)的几种方法
- 【OpenCV】图像变换(四-1)-霍夫变换线段检测
- 【OpenCV】图像变换(四-2)霍夫变换圆检测
- OpenCV2编程手册笔记之 7.3使用霍夫变换检测直线
- Opencv学习笔记-----霍夫变换直线检测及原理理解
- opencv 霍夫变换检测圆cvHoughCircles
- 霍夫变换(Hough Transform)直线检测
- opencv 图像处理 形态学操作 腐蚀 膨胀 开闭运算 阈值二值化 图像卷积 图像金字塔 Sobel算子 Laplacian 算子 candy边缘检测 霍夫变换 直方图
- Hough Transform(霍夫变换)检测Circle(圆)的几种方法
- 通过圆的颜色并结合霍夫变换检测目标圆的OpenCV代码
- python+opencv实现霍夫变换检测直线
- OpenCV-Python教程(9)(10)(11): 使用霍夫变换检测直线 直方图均衡化 轮廓检测