利用霍夫圆变换HoughCircles()函数进行圆检测,此方法可以统计一些圆形物体的个数,比如硬币、乒乓球等。
#include "stdafx.h"
#include <opencv2\opencv.hpp>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include"opencv2/imgproc/imgproc.hpp"
using namespace std;
using namespace cv;
int main() {
Mat srcImage = imread("1.jpg");
Mat midImage, dstImage;
cvtColor(srcImage, midImage, COLOR_BGR2GRAY);//灰度
imshow("灰度", midImage);
GaussianBlur(midImage, midImage, Size(9, 9), 2, 2);//高斯滤波
imshow("高斯", midImage);
vector<Vec3f> cicles;
HoughCircles(midImage, cicles,HOUGH_GRADIENT, 1, 15, 80, 100, 0, 0);//霍夫圆 变换
cout << "count:" << cicles.size();
for (size_t i = 0; i < cicles.size(); i++)
{
Point center(cvRound(cicles[i][0]), cvRound(cicles[i][1]));
int radius = cvRound(cicles[i][2]);
circle(srcImage, center, 3, Scalar(0, 255, 0), -1, 8, 0);
circle(srcImage, center, radius, Scalar(155, 50, 255), 3, 8, 0);
}
imshow("效果", srcImage);
waitKey(0);
return 0;
}
不得不承认,少算了一毛钱。主要原因是后面的几个参数没有设置恰当。
void HoughCircles(InputArray image,//输入图像,8位的单通道灰度图
OutputArray circles,//检测圆的输出矢量,每个圆由包含了3元素浮点型的向量(x,y,r)
int method,//检测方法,看 cv::HoughModes里面
double dp,//如果dp=2,累加器是输入图像一半的高度和宽度
double minDist,//圆心之间的最小距离,如果太小多个相邻圆可能被错误的检测成一个
//重合圆。如果太大,某些圆可能检测不出来。
double param1 = 100,//Canny算子的高阈值,低阈值为它的一半
double param2 = 100,//最小投票数,越小,越多假的圆被检测出来。
int minRadius = 0, int maxRadius = 0);//默认
更改下参数:
HoughCircles(midImage, cicles,HOUGH_GRADIENT, 1, 15, 60, 100, 0, 0);//霍夫圆 变化
就是这个样子。