学习opencv第七章7.2

来源:互联网 发布:淘宝网客服 编辑:程序博客网 时间:2024/06/04 17:42
#include "cv.h"#include "highgui.h"#include <IOSTREAM.H>#pragma comment(lib,"cv.lib")#pragma comment(lib,"highgui.lib")#pragma comment(lib,"cxcore.lib")CvHistogram* createMyHist(IplImage* image, const char* windowName ){if (image->nChannels != 3){return NULL;}IplImage* hsv = cvCreateImage(cvGetSize(image),image->depth,3);cvCvtColor(image,hsv,(image->channelSeq == "RGB")?CV_RGB2HSV:CV_BGR2HSV);//转换成HSV图像IplImage* h_plane = cvCreateImage(cvGetSize(image),8,1);IplImage* s_plane = cvCreateImage(cvGetSize(image),8,1);IplImage* v_plane = cvCreateImage(cvGetSize(image),8,1);cvCvtPixToPlane(hsv,h_plane,s_plane,v_plane,0);//分成H,S,V三个通道IplImage* planes[] = {h_plane,s_plane};//还是准备Hist所需的各种参数int h_bins = 30; //h分量分成30分int s_bins = 32; //s分量分成32份float h_ranges[] = {0,180};//h分量的范围float s_ranges[] = {0,255};//S分量的范围    int hist_size[] = {h_bins, s_bins};float* ranges[] = {h_ranges, s_ranges};CvHistogram* hist = cvCreateHist(2,hist_size,CV_HIST_ARRAY,ranges,1);cvCalcHist(planes,hist,0,0);// 计算直方图cvNormalizeHist(hist,1.0); //归一化    int scale = 10;//构造一个图像,用于显示直方图IplImage* hist_image = cvCreateImage(cvSize(scale*h_bins, scale*s_bins),IPL_DEPTH_8U,3);cvZero(hist_image);float max_value = 0;cvGetMinMaxHistValue(hist,NULL,&max_value,NULL,NULL);//获取最大值   for (int h = 0; h<h_bins; h++)   {   for (int s = 0; s<s_bins; s++)   {   float bin_value = cvQueryHistValue_2D(hist, h,s);   int intensity = cvRound(bin_value*255/max_value);   cvRectangle(hist_image,cvPoint(h*scale, s*scale),cvPoint((h+1)*scale-1,(s+1)*scale -1),CV_RGB(intensity,intensity,intensity),CV_FILLED);   }   }   cvNamedWindow(windowName);   cvShowImage(windowName,hist_image);   return hist;}int main(int argc, char** argv){IplImage* image1 = cvLoadImage("hand1.bmp",CV_LOAD_IMAGE_ANYCOLOR);assert(image1 != NULL);IplImage* image2 = cvLoadImage("hand2.bmp",CV_LOAD_IMAGE_ANYCOLOR);assert(image2 != NULL);IplImage* image3 = cvLoadImage("hand3.bmp",CV_LOAD_IMAGE_ANYCOLOR);assert(image3 != NULL);CvHistogram* hist1;    CvHistogram* hist2;CvHistogram* hist3;//IplImage* hsv1 = cvCreateImage(cvGetSize(image1),IPL_DEPTH_8U,3);hist1 = createMyHist(image1,"hist_image1");hist2 = createMyHist(image2,"hist_image2");//室外图像直方图hist3 = createMyHist(image3,"hist_image3");double cpm1 = cvCompareHist(hist1, hist2,CV_COMP_CORREL);    double cpm2 = cvCompareHist(hist1, hist2,CV_COMP_CHISQR);double cpm3 = cvCompareHist(hist1, hist2,CV_COMP_INTERSECT);double cpm4 = cvCompareHist(hist1, hist2,CV_COMP_BHATTACHARYYA);    cout << "相关:"<<cpm1 <<"卡方:"<<cpm2<<"相交:"<<cpm3<<"距离:"<<cpm4<<endl;cvWaitKey(0);    return 1;}

原创粉丝点击