小案例---颜色圆的检测

颜色圆检测的步骤:

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;
}

原图:



低阈值的图:



高阈值图:



高低阈值合并图:



最后的效果图:


猜你喜欢

转载自blog.csdn.net/linqianbi/article/details/78936612