if(sum <THRESHOLD){//找到满足条件的区域
//下面的代码把找到的区域的边框设置成为白色
for(i =-RADIUS;i<=RADIUS;i++)
{
lOffset = this->PixelOffset(ImPoint->y-RADIUS,ImPoint->x+i,wBytesPerLine);
*(lpData+lOffset++) = 255;
*(lpData+lOffset++) = 255;
*(lpData+lOffset++) = 255;
}
for(i =-RADIUS;i<=RADIUS;i++)
{
lOffset = this->PixelOffset(ImPoint->y+RADIUS,ImPoint->x+i,wBytesPerLine);
*(lpData+lOffset++) = 255;
*(lpData+lOffset++) = 255;
*(lpData+lOffset++) = 255;
}
for(i =-RADIUS;i<=RADIUS;i++)
{
lOffset = this->PixelOffset(ImPoint->y+i,ImPoint->x+RADIUS,wBytesPerLine);
*(lpData+lOffset++) = 255;
*(lpData+lOffset++) = 255;
*(lpData+lOffset++) = 255;
}
for(i =-RADIUS;i<=RADIUS;i++)
{
lOffset = this->PixelOffset(ImPoint->y+i,ImPoint->x-RADIUS,wBytesPerLine);
*(lpData+lOffset++) = 255;
*(lpData+lOffset++) = 255;
*(lpData+lOffset++) = 255; }
GlobalUnlock(hDIB);
return true;
}
else AfxMessageBox("Can't find the corresponding point!");
GlobalUnlock(hDIB);
return false;
匹配得到的特征区域如图15所示。
图15 匹配得到的特征区域图
完成了特征区域的匹配之后要进行的是相似度判定。相似度判定就是考察两幅图片像素颜色差别的大小。其中包括图片对齐的过程,对齐是按照特征区域对齐的方法来进行的,即把两个特征区域的中心点重叠,然后考察两幅图片中对应像素的差值。最后根据得到的差值,综合确定两幅图片是否相似。
2) 相似度判定的函数ComPareImg
//下面的函数比较两幅图片的相似度
BOOL DIB::ComPareImg(HANDLE hDIB1, HANDLE hDIB2 ,CPoint pt1,CPoint pt2)
{
if(abs(pt1.x-pt2.x)>3 || abs(pt1.y -pt2.y)>3)//图像偏差过大
{
AfxMessageBox("Imgs Offset are too big");
return false;
}
LPBITMAPINFOHEADER lpbi1,lpbi2;
lpbi1 = (LPBITMAPINFOHEADER)GlobalLock(hDIB1);
int width1 = lpbi1->biWidth;
int height1 = lpbi1->biHeight;
lpbi2 = (LPBITMAPINFOHEADER)GlobalLock(hDIB2);
int width2 = lpbi2->biWidth;
int height2 = lpbi2->biHeight;
if(width1 != width2 || height1 != height2)//图像长宽尺寸不同
{
GlobalUnlock(hDIB1);
GlobalUnlock(hDIB2);
AfxMessageBox("Img is not same size");
return false;
}
LPBYTE lpData1,lpData2;
lpData1 = this->FindDIBBits(hDIB1);
lpData2 = this->FindDIBBits(hDIB2);
WORD wBytesPerLine = this->BytePerLine(hDIB1);
int xleft,xright,ytop,ybottom;
//下面的一段代码实现图像对齐
if(pt1.x>=pt2.x)//第一幅图得特征中心点比第二幅图偏右
{
xleft = pt2.x;//要处理得左边得象素点个数
xright =width-pt1.x-1;//要处理得右边得象素点个数
}
else//第一幅图得特征中心点比第二幅图偏左
{
xleft = pt1.x;
xright = width1-pt2.x-1;
}
if(pt1.y >=pt2.y)//第一幅图得特征中心点得位置偏上
{
ytop = pt2.y;//要处理得中心点上面得象素个数
ybottom = height1-pt1.y-1;//要处理得中心点下面得象素个数
}
else//第一幅图得特征中心点得位置偏下
{
ytop = pt1.y;
ybottom = height1-pt2.y-1;
}
long sum=0;
long lOffset;
//计算两幅图片交叉区域得象素差值
for(int i=-ytop;i<=ybottom;i++)
for(int j=-xleft;j<=xright;j++)
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] ... 下一页 >>