OpenCV:霍夫变换HoughLines vs HoughCircles( 三 )


       }
       waitKey();
       return 0;
}

OpenCV:霍夫变换HoughLines vs HoughCircles



OpenCV:霍夫变换HoughLines vs HoughCircles



5霍夫圆变换:
对直线来说, 一条直线由参数极径极角(rho, theta)暗示;
对圆来说, 需要三个参数来暗示一个圆;(center_x,center_y,r);其对应一条三维空间的曲线;
那么与二维的霍夫线变换同样的事理,
对于多个边缘点越多这些点对应的三维空间曲线交于一点, 那么他们颠末的配合圆上的点就越多,
近似的我们也就可以用同样的阈值的方式来判定一个圆是否被检测到, 这就是尺度霍夫圆变换的道理,
但也恰是在三维空间的计较量年夜年夜增添的原因, 尺度霍夫圆转变很难被应用到现实中;
出于对运算效率的考虑, OpenCV实现的是一个比尺度霍夫圆变换更为矫捷的检测方式: 霍夫梯度法, 也叫2-1霍夫变换(21HT),
道理:依据是圆心必然是在圆上的每个点的模标的目的量上, 这些圆上点模标的目的量的交点就是圆心, 霍夫梯度法的第一步就是找到这些圆心, 如许三维的累加平面就又转化为二维累加平面.;
第二步按照所有候选中间的边缘非0像素对其的撑持水平来确定半径.;

OpenCV:霍夫变换HoughLines vs HoughCircles



6霍夫圆变换示例:
#include <opencv2\opencv.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\features2d\features2d.hpp>
#include <opencv2\core\core.hpp>
#include <opencv2\imgproc\imgproc.hpp>
using namespace std; 
using namespace cv; 
int main()
{
       Mat srcImage = imread("test5.jpg"); 
       Mat midImage, dstImage;
       imshow("srcImg", srcImage);
       cvtColor(srcImage, midImage, CV_BGR2GRAY);
       GaussianBlur(midImage, midImage, Size(9, 9), 2, 2);
       //霍夫圆变换 
       vector<Vec3f> circles;
       HoughCircles(midImage, circles, CV_HOUGH_GRADIENT, 1.5, 10, 200, 150, 0, 0);
       //注重第七的参数为阈值, 可以自行调整, 值越年夜, 检测的圆更精准
       //依次在图中绘制出圆 
       for (size_t i = 0; i < circles.size(); i++)
       {
              Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
              int radius = cvRound(circles[i][2]);
              //绘制圆心 
              circle(srcImage, center, 3, Scalar(0, 255, 0), -1, 8, 0);
              //绘制圆轮廓 
              circle(srcImage, center, radius, Scalar(155, 50, 255), 3, 8, 0);

猜你喜欢