魔方颜色识别

 

先上一张图

魔方颜色识别_第1张图片

 

 

代码下载地址: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;
	}

最后上几张效果图。

输入图像魔方颜色识别_第2张图片

运行的截图魔方颜色识别_第3张图片

 通过调节空间的control窗口的HSV的阈值,就可以改变输出图像。然后再读取图像相应块的颜色保存起来就行了,这是我上面发的代码干的事情。

你可能感兴趣的:(魔方机器人)