基于C++语言,实现使用OpenCV的霍夫圆检测算法HoughCircles实现石头检测和直径输出。
- #include
- #include
- #include
-
- using namespace cv;
- using namespace std;
-
- #include
- std::string Convert(float Num)
- {
- std::ostringstream oss;
- oss << Num;
- std::string str(oss.str());
- return str;
- }
-
- //霍夫圆检测
- int main()
- {
- //【1】载入原始图和Mat变量定义
- Mat srcImage = imread("D:\\Test\\test.jpg");
- Mat midImage, dst, canny;//临时变量和目标图的定义
- if (srcImage.empty()) {
- printf("cloud not load inage...");
- return -1;
- }
-
- //namedWindow("opencv", WINDOW_AUTOSIZE);
-
- //【2】显示原始图
- //imshow("【原始图】", image);
-
- int lineType = 12;
-
- //medianBlur(image, midImage, 3);//中值滤波
- GaussianBlur(srcImage, midImage, Size(3, 3), 2, 2);
- //【3】转为灰度图并进行图像平滑
- cvtColor(midImage, midImage, CV_BGR2GRAY);//滤波的图为灰度图
- //【4】进行霍夫圆检测
- vector
circles; - //cv.HoughCircles(image, method, dp, minDist, circles, param1, param2, minRadius, maxRadius)
- HoughCircles(midImage, circles, CV_HOUGH_GRADIENT, 1, 30, 20, 20, 10, 22);
- srcImage.copyTo(dst);
- //【5】依次在图中绘制出圆
- for (size_t i = 0; i < circles.size(); i++)
- {
- Vec3f cc = circles[i];
- circle(dst, Point(cc[0], cc[1]), cc[2], Scalar(0, 255, 0), 1, LINE_AA);//画圆
-
- std::string data = Convert(cc[2]*2); //每个圆的直径信息
- cout << "Please output the radius*2:" << data <
//输出的是直径信息 - Point p1 = Point(cc[0], cc[1]);
- putText(dst, data, p1 , FONT_HERSHEY_PLAIN, 1, Scalar(0, 0, 255), 0.3, LINE_AA); //在图上添加每个圆的直径信息
- circle(dst, Point(cc[0], cc[1]), 2, Scalar(255,0, 0), 2, LINE_AA);//圆心点
- //参数定义
-
- }
-
- //【6】显示效果图
- //imshow("canny", dst);
- imshow("【效果图】", dst);
- waitKey(0);
- return 0;
-
- }
在X-Y平面内,任意一圆可以用公式(1)所示:
其中(a,b)为圆心,r为圆半径,可将其视为二元函数f(x,y)= ,霍夫圆检测是将X-Y平面上的圆转换到a-b-r空间,a-b-r空间内的圆函数表示用公式(2)表示:
此时x,y为常数,可以将其视为三元函数f(a,b,r)=0,也就是说X-Y平面中圆上的一点便对应a-b-r空间内一条三维曲线,且X-Y平面的圆上所有点对应的a-b-r空间内的所有曲线都相交于一点(a_0,b_0,r_0),该点也就是对应X_Y平面空间上的圆的圆心和半径。这就是霍夫圆检测的原理,霍夫圆检测将图像中的每一个像素点都假设为圆上的点,再通过观察这些点的a-b-r空间内组成的三维曲线相交的情况,当相交数量大于一定的阈值时,就认为这些曲线对应的X-Y平面内的点构成一个圆。
参考往期教程:
教你用OpenCV 和 Python实现圆物检测,点击跳转。
最后运行代码,需要下载C++版本的编译过了的OpenCV安装包文件,并且在电脑中配置环境变量、Visual Studio中进行opencv的相关属性配置,不然不能使用OpenCV库函数。

后台回复关键字:项目实战,可下载完整代码和OpenCV安装包。
·········· END ··············