level 1
ct疯狂
楼主

程序如下#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
Mat src = imread("E:\1\timg.jpg");//读取原图
Mat mid, dst;//mat类型的中间变量和目标图像
dst = src.clone();//原图像深拷贝到目标图像
cvtColor(dst, mid, COLOR_BGR2GRAY); //转化为灰度图像存放在中间变量
GaussianBlur(mid, mid, Size(9, 9), 2, 2); //高斯滤波
//进行霍夫圆变换
vector<Vec3f>circles;
HoughCircles(mid, circles, CV_HOUGH_GRADIENT,
1.5, //累加器图像的分辨率,增大则分辨率变小
10, //很重要的一个参数,告诉两个圆之间的距离的最小距离,如果已知一副图像,可以先行计
//算出符合自己需要的两个圆之间的最小距离。
200, //canny算法的阈值上限,下限为一半(即100以上为边缘点,50以下抛弃,中间视是否相连而定)
150, //决定成圆的多寡 ,一个圆上的像素超过这个阈值,则成圆,否则丢弃
0, //最小圆半径,这个可以通过图片确定你需要的圆的区间范围
20 //最大圆半径
);
//依次在图中绘制出圆
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(dst, center, 3, Scalar(0, 255, 0), -1, 8, 0);
circle(dst, center, radius, Scalar(155, 50, 255), 3, 8, 0);
}
//显示原图
namedWindow("原图", CV_WINDOW_AUTOSIZE);//namedWindow函数第一个参量为串口名字,第二个参量为串口类型autosize为自动调整到最合适的窗口
imshow("原图", src);
//显示效果图
namedWindow("效果图", CV_WINDOW_AUTOSIZE);
imshow("效果图",dst);
imwrite("E:\1\timg.jpg", dst);
waitKey(0);
return 0;
}