基于vs2010和opencv的图像转化到hsv空间再emd匹配

来源:互联网 发布:淘宝贷款是真的吗 编辑:程序博客网 时间:2024/04/30 01:22
float emd_hsvhisto(Mat frame,Mat frame_get)
{
Mat imghsv1,imghsv2;
//imghsv1.create(frame.size(),CV_32FC3);
//imghsv2.create(frame_get.size(),CV_32FC3);






cvtColor(frame,imghsv1, COLOR_BGR2HSV);
cvtColor(frame_get,imghsv2, COLOR_BGR2HSV);


int h_bins=8,s_bins=5,v_bins=5;


const int histsize[]={8,5,5};


float h_range[]={0,360};
float s_range[]={0,1};
float v_range[]={0,1};


const float*histRange[]={h_range,s_range,v_range};
bool uniform=true;
bool accumulate=false;


Mat hist1,hist2;
int channels[]={0,1,2};


calcHist( &imghsv1, 1, channels, Mat(), hist1, 3, histsize, histRange, uniform, accumulate );
normalize(hist1, hist1);


calcHist( &imghsv2, 1, channels, Mat(), hist2, 3, histsize, histRange, uniform, accumulate );
normalize(hist2, hist2);


Mat sig1,sig2;
int numrows=h_bins*s_bins*v_bins;
sig1=Mat(numrows,4,CV_32FC1,Scalar::all(0));
sig2=Mat(numrows,4,CV_32FC1,Scalar::all(0));


float value;


for(int h=0;h<h_bins;h++)
{
for(int s=0;s<s_bins;s++)
{
for(int v=0;v<v_bins;v++)
{
value=hist1.at<float>(h,s,v);
float* data1=sig1.ptr<float>(h*s*v);
data1[0]=value;
data1[1]=h;
data1[2]=s;
data1[3]=v;


value=hist2.at<float>(h,s,v);
float* data2=sig2.ptr<float>(h*s*v);
data2[0]=value;
data2[1]=h;
data2[2]=s;
data2[3]=v;


}
}
}
float emd_distance;
emd_distance=EMD(sig1,sig2,CV_DIST_L2);
emd_distance=1-emd_distance;
emd_distance=emd_distance*100;


return emd_distance;


}

这是先把rgb空间的图像转化到hsv空间,然后利用emd进行图像匹配的一个函数程序   有问题,希望指教啊 ,菜鸟一枚

0 0
原创粉丝点击