opencv顏色識別

#include <imgproc/imgproc.hpp>  
#include <opencv2/core/core.hpp>  
#include<opencv2/highgui/highgui.hpp>
#include <iostream>  
#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<string> 
#include<vector>

#define BIGGEST(a,b,c) (a>b?(a>c?a:c):(b>c?b:c))

#define RED 1
#define GREEN 2
#define BLUE 3

//HSV範圍 
//紅色HSV範圍
#define iLowH_R  125
#define iHighH_R  155
#define iLowS_R  43
#define iHighS_R  255
#define iLowV_R  46
#define iHighV_R  255
//綠色HSV範圍
#define iLowH_G  35
#define iHighH_G  77
#define iLowS_G  43
#define iHighS_G  255
#define iLowV_G  46
#define iHighV_G  255
//藍色HSV範圍
#define iLowH_B  100
#define iHighH_B  124
#define iLowS_B  128
#define iHighS_B  255
#define iLowV_B  102
#define iHighV_B  255

using namespace cv;
using namespace std;

Mat WhiteBalance(Mat image);
double PixelTotal(Mat mask);
int HSV(Mat img);

int main() {

	IplImage* example = cvLoadImage("C:\\Users\\Lenovo\\Desktop\\Picprocess\\DDD.jpg", 1);
	Mat Img, exampleWB;
	int color;
	Img = cvarrToMat(example);
	exampleWB = WhiteBalance(Img);
	color = HSV(exampleWB);
	printf("return value:%d\n",color);

}

Mat WhiteBalance(Mat image) {
	vector<Mat> imageRGB;

	//RGB三通道分離  
	split(image, imageRGB);

	//求原始圖像的RGB分量的均值  
	double R, G, B;
	B = mean(imageRGB[0])[0];
	G = mean(imageRGB[1])[0];
	R = mean(imageRGB[2])[0];

	//需要調整的RGB分量的增益  
	double KR, KG, KB;
	KB = (R + G + B) / (3 * B);
	KG = (R + G + B) / (3 * G);
	KR = (R + G + B) / (3 * R);

	//調整RGB三個通道各自的值  
	imageRGB[0] = imageRGB[0] * KB;//藍色
	imageRGB[1] = imageRGB[1] * KG;//綠色
	imageRGB[2] = imageRGB[2] * KR;//紅色

								   //RGB三通道圖像合併  
	merge(imageRGB, image);
	waitKey(0);
	return image;
}//白平衡子函數

double PixelTotal(Mat mask) {
	IplImage *image;
	image = &IplImage(mask);
	double i, j, pixel = 0;
	CvScalar s;
	for (i = 0; i < image->height; i++) {
		for (j = 0; j < image->width; j++) {
			s = cvGet2D(image, i, j);
			pixel += s.val[0];
		}
	}
	return pixel;
}

int HSV(Mat img) {//Mat imgOutR, Mat imgOutB, Mat imgOutG) {
	Mat imgHSV;
	Mat imgGray;

	cvtColor(img, imgHSV, COLOR_BGR2HSV);//轉爲HSV  
	cvtColor(img, imgGray, COLOR_RGB2GRAY);

	imwrite("C:\\Users\\Lenovo\\Desktop\\Picprocess\\hsv.jpg", imgHSV);
	Mat maskR, maskG, maskB;

	inRange(imgHSV, Scalar(iLowH_G, iLowS_G, iLowV_G), Scalar(iHighH_G, iHighS_G, iHighV_G), maskG); //Threshold the image    
	inRange(imgHSV, Scalar(iLowH_R, iLowS_R, iLowV_R), Scalar(iHighH_R, iHighS_R, iHighV_R), maskR);
	inRange(imgHSV, Scalar(iLowH_B, iLowS_B, iLowV_B), Scalar(iHighH_B, iHighS_B, iHighV_B), maskB);

	//開操作 (去除一些噪點)  
	Mat element = getStructuringElement(MORPH_RECT, Size(10, 10));
	morphologyEx(maskG, maskG, MORPH_OPEN, element);//如果二值化後圖片干擾部分依然很多,增大下面的size
	morphologyEx(maskR, maskR, MORPH_OPEN, element);
	morphologyEx(maskB, maskB, MORPH_OPEN, element);

	imwrite("C:\\Users\\Lenovo\\Desktop\\Picprocess\\G.jpg", maskG);
	imwrite("C:\\Users\\Lenovo\\Desktop\\Picprocess\\B.jpg", maskB);
	imwrite("C:\\Users\\Lenovo\\Desktop\\Picprocess\\R.jpg", maskR);

	double x_r = 0, x_b = 0, x_g = 0, x_total = 0;

	x_r = PixelTotal(maskR);
	x_g = PixelTotal(maskG);
	x_b = PixelTotal(maskB);
	x_total = BIGGEST(x_b, x_g, x_r);

	if (x_total == x_b) {
		printf("This is blue, pixel %lf\n", x_total);
		return BLUE;
	}
	else if (x_total == x_g) {
		printf("This is green, pixel %lf\n", x_total);
		return GREEN;
	}
	else {
		printf("This is red, pixel %lf\n", x_total);
		return RED;
	}
	waitKey(0);

}//RGB轉化爲HSV,並將圖像二值化,根據需求得到需要的色塊處理圖像

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章