OpenCV读取图片并对比(可窗口显示)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lzcggg/article/details/9950777
#include "cv.h"
#include "cxcore.h"
#include "highgui.h"
#include <stdio.h>
#include <stdlib.h>
#include <iostream>




#define CV_COMP_CORREL 0
#define CV_COMP_CHISQR 1
#define CV_COMP_INTERSECT 2
#define CV_COMP_BHATTACHARYYA 3




int HistogramBins = 256;
float HistogramRange1[2]={0,255};
float *HistogramRange[1]={&HistogramRange1[0]};






int main()
{

//目标图片
IplImage *Image1=cvLoadImage("c:\\face\\s1\\10.jpg",0);// //("C:\\ruita\\2013-8\\openCV_from_2013.8.5\\CVprj01\\CVprj01\\1.jpg",0);//如果没有对象,直接输出为完美匹配
//IplImage *Image1=cvLoadImage("c:\\face\\pgm\\s1\\10.jpg",0);
char path[20]="c:\\face\\s";//
//char path[20]="c:\\face\\pgm\\s";
char who[20][20]={"1\\","2\\","3\\","4\\","5\\","6\\"}; //c:\\face\\s1\\//
char s[11][3]={"1","2","3","4","5","6","7","8","9","10"};      //c:\\face\\s1\\1
char way[20]="c:\\face\\s";
double thre = 20.0;//阈值//下面的程序推荐5000以下,其实也不可能用到5000,官方给的更大1.7*10^308
double res;//对比结果
double sum_res=5000.0,avr_res=5001.0,ores[3]={5000.0,5000.0,5000.0};//对比结果总和,对比结果平均值,上一个结果

char res_TM[99]={123,234,456};//结果排列数组                         //大小与人脸库有关
char TM[99][3]={"0","1","2","3","4","5","6","7","8","9","10"};    //组别,用于读取组别,记录最优结果


/*//字符串测试。。。
for(int j=0;j<3;j++){
for(int i=0;i<5;i++){//组内图片数
strcat(path,who[j]);
strcat(path,s[i]);
strcat(path,".jpg");
printf("%s\n",path);
strcpy(path,way);
}
}
*/
printf("Reading...\n");

int limitpeople=5; //对比总人数
int limitpic=5; //对比时每人的头像数
printf("阈值=%.2f,总人数=%d,其中每人提供的头像数=%d\n",thre,limitpeople,limitpic);
for(int readTM=0;readTM<limitpeople;readTM++){//人数//


sum_res=0;
avr_res=0;


for(int readID=0;readID<limitpic;readID++){//每人头像数

strcat(path,who[readTM]); //c:\\face\\s1\\     //
strcat(path,s[readID]); //c:\\face\\s1\\1        
strcat(path,".jpg"); //c:\\face\\s1\\1.jpg
IplImage *Image2=cvLoadImage(path,0); 
//printf("\n%s  ",path); //打印路径
strcpy(path,way); //还原
  
CvHistogram *Histogram1=cvCreateHist(1,&HistogramBins,CV_HIST_ARRAY,HistogramRange); 
CvHistogram *Histogram2=cvCreateHist(1,&HistogramBins,CV_HIST_ARRAY,HistogramRange); 
  
cvCalcHist(&Image1,Histogram1,0,0); 
cvCalcHist(&Image2,Histogram2,0,0); 
  
cvNormalizeHist(Histogram1,1); 
cvNormalizeHist(Histogram2,1); 
  
//越大越好
printf("相关CV_COMP_CORREL : %.4f\n",cvCompareHist(Histogram1,Histogram2,CV_COMP_CORREL));//相关
//越大越好
printf("直方图CV_COMP_INTERSECT : %.4f\n",cvCompareHist(Histogram1,Histogram2,CV_COMP_INTERSECT));//直方图
//越小越好
printf("巴氏距离CV_COMP_BHATTACHARYYA : %.4f\n",cvCompareHist(Histogram1,Histogram2,CV_COMP_BHATTACHARYYA));//巴氏距离
//越小越好
double res=cvCompareHist(Histogram1,Histogram2,CV_COMP_CHISQR);
printf("卡方 %.3f\n",res);//卡方 


if(res>thre){sum_res=5000.0;;avr_res=5000.0;break;} //s如若超过阈值,返回一个极大值,并跳出识别
sum_res+=res;//求出每人的距离总和
}
//输出合适结果
if(sum_res<5000.0){avr_res=sum_res/5;printf("★%d`s sum= %.2f,avr= %.2f\n",readTM,sum_res,avr_res);}
//输出超范围结果
else printf("☆%d cannot be reach beyond your threshould!!!\n",readTM,sum_res,avr_res);

if(avr_res<ores[0])//如果本次比记录的结果小,把他放进第一位
{
//改变均值队列
ores[2]=ores[1];
ores[1]=ores[0];
ores[0]=avr_res;//代替第一位
//改变结果队列
res_TM[2]=res_TM[1];
res_TM[1]=res_TM[0];
res_TM[0]=readTM;
//printf("0\n");


}
else if(avr_res<ores[1])
{
//改变均值队列
ores[2]=ores[1];
ores[1]=avr_res;//代替第一位
//改变结果队列
res_TM[2]=res_TM[1];
res_TM[1]=readTM;
//printf("1\n");


}
else if(avr_res<ores[2])
{
//改变均值队列
ores[2]=avr_res;//代替第一位
//改变结果队列
res_TM[2]=readTM;
//printf("2\n");


}

//printf("最像%d(%.2f),次像%d(%.2f),或像%d(%.2f)\n",res_TM[0],ores[0],res_TM[1],ores[1],res_TM[2],ores[2]);


}
/**/


 /*//显示窗口
cvNamedWindow("Image1",1); 
cvNamedWindow("Image2",1); 
cvShowImage("Image1",Image1); 
cvShowImage("Image2",Image2); 
*/
printf("最像%d(%.2f),次像%d(%.2f),或像%d(%.2f)\n",res_TM[0],ores[0],res_TM[1],ores[1],res_TM[2],ores[2]);
printf("\nFinish!");
    cvWaitKey(0);
while(1);
        return 0;


}

猜你喜欢

转载自blog.csdn.net/lzcggg/article/details/9950777