颜色圆检测的步骤:
1.将原始图片的BGR颜色空间转换到HSV色彩空间
有关HSV的文章见下面:
http://blog.csdn.net/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; }
原图:
低阈值的图:
高阈值图:
高低阈值合并图:
最后的效果图: