// //IplImage* hue = cvCreateImage( cvGetSize(hsv), 8, 1 );
//
// // 高斯模糊
// //cvSmooth(roi,src_tmp1,CV_GAUSSIAN,3,3); //高斯模糊
//
// //// hue色度,saturation饱和度,value纯度
// //cvCvtColor(src_tmp1, hsv, CV_BGR2HSV );//颜色转换
// //cvCvtPixToPlane(hsv,H,S,V,0);//分为3个通道
//
// //cvInRangeS(H,cvScalar(0.0,0.0,0,0),cvScalar(20.0,0.0,0,0),tmpH1);
// //cvInRangeS(S,cvScalar(75.0,0.0,0,0),cvScalar(200.0,0.0,0,0),tmpS1);
// //cvAnd(tmpH1,tmpS1,tmpH1,0);
//
//// cvCalcHist( &hue, hist, 0, mask ); // 计算直方图
//
// if (1)
// {
// float velue[] = {0,0,0};
// float d = sqrt(pow(colorVelue[0][0]-velue[0],2)+pow(colorVelue[0][1]-velue[1],2)+pow(colorVelue[0][2]-velue[2],2));
//
// cout<
// }
// cvNamedWindow( "hsv", 1 );
// cvShowImage("hsv",roi);
// //cvWaitKey(0);
//
// cvReleaseImage(&hsv);
// cvDestroyWindow("hsv");
// cvReleaseImage(&tmpH1);
// cvReleaseImage(&tmpS1);
// cvReleaseImage(&tmpH2);
// cvReleaseImage(&tmpS2);
// cvReleaseImage(&tmpH3);
// cvReleaseImage(&tmpS3);
// cvReleaseImage(&H);
// cvReleaseImage(&S);
// cvReleaseImage(&V);
// cvReleaseImage(&src_tmp1);
// return *type;
//}
int Color_difference_RGB( cv::Mat car, Rect r )
{
int type = 0;
//复制ROI区域图像
if ( r.width==0 || r.height==0 )
{
return -1;
}
cv::Mat roiImage = cvCreateImage( cvSize(r.width, r.height), 8, 3 );
car(r).copyTo(roiImage);
IplImage* roi = &roiImage.operator IplImage();
IplImage* R = cvCreateImage( cvGetSize(roi), IPL_DEPTH_8U, 1);
IplImage* B = cvCreateImage( cvGetSize(roi), IPL_DEPTH_8U, 1);
// 高斯模糊
//cvSmooth(roi,roi,CV_GAUSSIAN,3,3); //高斯模糊 ,作用
cvCvtPixToPlane(roi,B,G,R,0);//分为3个通道,OpenCV中不管是Windows中Load的还是摄像头取得的都是BGR顺序排列的
cvShowImage("R",R);
cvShowImage("hsv",roi);
cvShowImage("G",G);
cvShowImage("B",B);
//为这四幅图创建对应的直方图结构。
int hist_size = 28; //划分bin的个数
int hist_height = 100;
float range[] = {0,255};
float* ranges[]={range};
CvHistogram* r_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
CvHistogram* g_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
CvHistogram* b_hist = cvCreateHist(1,&hist_size,CV_HIST_ARRAY,ranges,1);
//计算直方图,创建用于显示直方图的图像
cvCalcHist( &R, r_hist, 0, 0 );
cvCalcHist( &G, g_hist, 0, 0 );
cvCalcHist( &B, b_hist, 0, 0 );
cvNormalizeHist(r_hist,1.0);
cvNormalizeHist(g_hist,1.0);
cvNormalizeHist(b_hist,1.0);
//开始显示,这里对直方图进行了标准化处理,不然的话无法观察到明显的变化
int scale = 256/hist_size;
IplImage* hist_image = cvCreateImage(cvSize(hist_size*scale,hist_height*3),8,3);
cvZero(hist_image);
float bmax_value = 0,rmax_value=0,gmax_value=0;
float min_value;
int rmin_idx, rmax_idx,gmin_idx, gmax_idx,bmin_idx,bmax_idx;
float rmax=0,gmax=0,bmax=0; //保存最高峰值
float ridx=0,gidx=0,bidx=0; //保存最高峰值的元素值
cvGetMinMaxHistValue(r_hist, 0,&rmax_value,0,&rmax_idx);
cvGetMinMaxHistValue(g_hist, 0,&gmax_value,0,0);
cvGetMinMaxHistValue(b_hist, 0,&bmax_value,0,0);
//cout<<"R最大值"<<(1-rmax_value)*255<<" "<
for(int i=0;i
float bin_val = cvQueryHistValue_1D(r_hist,i);//返回相应bin中的值
int intensity = cvRound(bin_val*hist_height/rmax_value);
cvRectangle(hist_image,cvPoint(i*scale,hist_height),cvPoint((i+1)*scale - 1, hist_height - intensity),CV_RGB(255,0,0));
float k = (i+1)*255.f/hist_size;
if (rmax
rm