//计算用户确定的4块位置与其周围位置的颜色对(颜色对现采取用相邻两块的直方图的欧氏距离表示) pBmp->CalculateColorPair(obj_set.m_x1,obj_set.m_y1); pBmp->CalculateColorPair(obj_set.m_x2,obj_set.m_y2); pBmp->CalculateColorPair(obj_set.m_x3,obj_set.m_y3); pBmp->CalculateColorPair(obj_set.m_x4,obj_set.m_y4); file://其实在以上的4部计算中,已经形成了初步的颜色对表,在此只不过是将表中的数据从大到小排列出来//并且祛除差值小于某一域值的颜色对 file://计算颜色对结束,形成颜色对表 pBmp->SortColorPair(); file://颜色对表计算出来,表中的数据既是用户输入的该图像的代表特征 pDC->TextOut(10,168,"检索结果:"); CBmpProc *pDestBmp; CString comp_pic_path; int disp=0; int space=-128; file://读取带比较的图像(在此初定15幅--现定义这15幅图像即图片数据库) for(int comp_pic=1;comp_pic<=15;comp_pic++){ comp_pic_path.Format("image%d.bmp",comp_pic); bmp.LoadFromFile(comp_pic_path); // 从库中读入位图 pDestBmp = (CBmpProc*)new(CBmpProc); // 用new分配类目标 pDestBmp->LoadFromObject(bmp, &CRect(0,0,128,128)); // 从bmp中的指定区域读入图像 file://计算当前被比较的图像的颜色直方图 pDestBmp->CalculateColor(*pDC); int match=0; file://颜色对匹配数目 double ave=0; file://确定匹配时候不能使用精确匹配,所以需要一个差值小于某一域值时的域值 for(int s=0;spair_count;s++){ ave+=pBmp->pair[s].o_dis; } ave=ave/pBmp->pair_count; file://这个域值的基数即是用户输入的图片的颜色对表中颜色对的平均值 ave=ave*0.02; file://确定误差小于2%的颜色对均属于这个域值
int pairflag[32]; file://颜色对匹配标志数组,即某一颜色对如果在目标图像中找到,下一次就不能再匹配 for(int t=0;t<32;t++){ pairflag[t]=-1; } for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ file://按顺序计算目标图像中一子块与其周围子块的颜色对,然后在用户输入的图像的颜色对表中查询计算出//来的颜色对 pDestBmp->CalculateColorPair(i,j); for(int scan=0;scan<8;scan++){ if(pDestBmp->pair[scan].x==-1) break; } for(int comp=0;compfor(int count=0;countpair_count;count++){ if((fabs(pBmp->pair[count].o_dis-pDestBmp->pair[comp].o_dis))file://差值小于某域值,则匹配到 pairflag[count]=0; file://置颜色对匹配标志位 match++; file://匹配数加一 break; } } } file://重新置目标图像的颜色对表为空,因为现在的实现方式是在计算某一子块的颜色对时已经写过了颜色对//表,为保证颜色对表的真确性,必须在查询下一子块的时候重新置颜色对表为空 for(int re=0;repDestBmp->pair[re].x=-1; } } file://如果有60%以上的特征颜色对匹配到,就说明该图像已经被检索到 if(match>=(pBmp->pair_count*0.60)){ file://以下是对检索到的图像的界面上的排版显示 disp++; space+=128; file://画图像边框 pDC->Rectangle(10+space-1,190-1,138+space+1,318+1); pDestBmp->Draw(*pDC, &CRect(10+space,190,138+space,318)); // 将pBmp中的图像绘入DC的指定区域 space+=6; } delete (CBmpProc*)pDestBmp; // 删除类目标,delete会自动调用CBmpProc类的析构函数。 } delete (CBmpProc*)pBmp; // 删除类目标,delete会自动调用类的CBmpProc析构函数。 AfxMessageBox("检索完成"); |