颜色圆检测的步骤:
1.将原始图片的BGR颜色空间转换到HSV色彩空间
有关HSV的文章见下面:
http://blog.youkuaiyun.com/viewcode/article/details/8203728
2.根据红色在HSV中的范围,对图像进行阈值分割,红色的圆被保留(白色),其他的变成黑色
3.对步骤二检测到的高低阈值的颜色圆进行合并,找出属于红色的圆
4.利用霍夫圆检测算法找出步骤3中的圆
5.在原图中绘制出红色的圆
下面放上源代码:
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<iostream>
#include<vector>
using namespace cv;
using namespace std;
int main()
{
Mat srcImage = imread("circle.png");
if(!srcImage.data)
{
printf("could not load image...\n");
return -1;
}
imshow("srcImage", srcImage);
Mat resultImag = srcImage.clone();
//中值滤波
medianBlur(srcImage, srcImage, 3);
//转换成HSV颜色空间
Mat hsvImage;
cvtColor(srcImage, hsvImage, CV_BGR2HSV);
//颜色阈值化处理
//定义高低阈值
Mat lowMat;
Mat upperMat;
//红色H的范围是[0,10] [160,180]
inRange(hsvImage, Scalar(0, 100, 100), Scalar(10, 255, 255), lowMat);
inRange(hsvImage, Scalar(160, 100, 100), Scalar(179, 255, 255), upperMat);
imshow("lowMat", lowMat);
imshow("upperMat", upperMat);
//将高低阈值合并
Mat redMat;
addWeighted(lowMat, 1, upperMat, 1, 0, redMat);
imshow("redMat", redMat);
//高斯滤波
GaussianBlur(redMat, redMat, Size(9, 9), 2, 2);
//霍夫圆加测
vector<Vec3f> circles;
HoughCircles(redMat, circles, CV_HOUGH_GRADIENT,1,redMat.rows/8,100,20,0,0);
//如果没有检测到圆
if (circles.size() == 0)
return -1;
for (int i = 0; i < circles.size(); i++)
{
//求出圆心的位置和圆半径的大小
Point center(cvRound(circles[i][0]), cvRound(circles[i][1]));
int radius = cvRound(circles[i][2]);
circle(resultImag, center, radius, Scalar(0, 255, 0), 5);
}
imshow("resultImag", resultImag);
waitKey(0);
return 0;
}
原图:
低阈值的图:
高阈值图:
高低阈值合并图:
最后的效果图: