先上一张图
代码下载地址:http://download.csdn.net/download/jason_er/10246496
之后在更新步骤。
我这里更新一下识别颜色的主要步骤,是我上面的代码的主体部分。
首先是头文件和命名空间
#include
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
using namespace std;
在main()函数里首先建立三个拖动条,方便用来调节HSV空间的三个值的阈值。HSV空间网上有很多资料,自行百度,有问题可以评论问我。
namedWindow("Control", CV_WINDOW_AUTOSIZE); //create a window called "Control"
int iLowH = 100;
int iHighH = 140;
int iLowS = 90;
int iHighS = 255;
int iLowV = 90;
int iHighV = 255;
//Create trackbars in "Control" window
cvCreateTrackbar("LowH", "Control", &iLowH, 180); //Hue (0 - 179)
cvCreateTrackbar("HighH", "Control", &iHighH, 180);
cvCreateTrackbar("LowS", "Control", &iLowS, 255); //Saturation (0 - 255)
cvCreateTrackbar("HighS", "Control", &iHighS, 255);
cvCreateTrackbar("LowV", "Control", &iLowV, 255); //Value (0 - 255)
cvCreateTrackbar("HighV", "Control", &iHighV, 255);
接下来是把RGB颜色空间转换到HSV空间,并且利用阈值和滤波来得到想要的图像。一个while搞定
while (true)
{
Mat imgOriginal,src;
src = imread("photo.jpg"); //选择源图像
resize(src, imgOriginal, Size(src.cols / 4, src.rows / 4), 0, 0, INTER_AREA); //图像太大可以通过resize变小
Mat imgHSV;
vector hsvSplit;
cvtColor(imgOriginal, imgHSV, COLOR_BGR2HSV); //Convert the captured frame from BGR to HSV
//因为我们读取的是彩色图,直方图均衡化需要在HSV空间做
split(imgHSV, hsvSplit);
equalizeHist(hsvSplit[2], hsvSplit[2]);
merge(hsvSplit, imgHSV);
Mat imgThresholded;
inRange(imgHSV, Scalar(iLowH, iLowS, iLowV), Scalar(iHighH, iHighS, iHighV), imgThresholded); //Threshold the image
//开操作 (去除一些噪点)
Mat element = getStructuringElement(MORPH_RECT, Size(5, 5));
morphologyEx(imgThresholded, imgThresholded, MORPH_OPEN, element);
//闭操作 (连接一些连通域)
morphologyEx(imgThresholded, imgThresholded, MORPH_CLOSE, element);
imshow("Thresholded Image", imgThresholded); //输入图像
imshow("Original", imgOriginal); //输出图像
char key = (char)waitKey(300);
if (key == 27)
break;
}
最后上几张效果图。
通过调节空间的control窗口的HSV的阈值,就可以改变输出图像。然后再读取图像相应块的颜色保存起来就行了,这是我上面发的代码干的事情。