图像模板匹配的有关问题,多谢各位了

求救图像模板匹配的问题,谢谢各位了
现在做一个模板匹配的优化问题,所以想先实现基础的穷举模板匹配,不考虑效率问题,问题如下:
图像模板匹配的有关问题,多谢各位了图像模板匹配的有关问题,多谢各位了图像模板匹配的有关问题,多谢各位了
后面两张图片都是直接从第一张剪切出来的,分别把他们变成灰度图片处理。穷举匹配,但是发现剪切出来的图片灰度值矩阵并不刚好等于第一张图的一部分,这是什么原因啊。。。部分代码如下:

if(srcPtr[x]==desPtr[0])   // 假如原图的某一个点灰度值与模板第一个点灰度值相同,进入compare匹配整个矩阵
{
isFinish=GrayCompare(graySource,grayDestination,x,y);
}
bool GrayCompare(IplImage* src,IplImage* des,int x,int y)
{
char * srcPtr = src->imageData+y*src->width+x;
char * desPtr = des->imageData;
for(int i=0;i<des->height;i++,y++)
{
char * srcPtr = src->imageData+y*src->width+x;
char * desPtr = des->imageData+i*des->width;
//cout<<"aftercompare:"<<(int)srcPtr[0]<<endl;
for(int j=0;j<des->width;j++)
{
cout<<j<<":"<<(int)desPtr[j]<<endl;
if((int)srcPtr[j]!=(int)desPtr[j])
return false;
}
}

return true;
}

麻烦大家帮下忙,谢谢
------解决方案--------------------
引用:
Quote: 引用:


if(srcPtr[x]==desPtr[0])   // 假如原图的某一个点灰度值与模板第一个点灰度值相同,进入compare匹配整个矩阵
{
isFinish=GrayCompare(graySource,grayDestination,x,y);               
}

这个也应该是个循环,因为灰度值是0~255,这么多点,肯定会有灰度值相同的

是一个循环,就是穷举整个图片的所有矩阵去匹配,比如模板是10*10,原图是100*100,那么我的模板将会逐一去跟矩阵{(0,0),(10,10)},{(0,1),(10,11)}……匹配,只有100个灰度值都相等是才认为是匹配的,现在出现的问题是原图没有一个子矩阵是跟模板相同的,为什么会出现这种情况,图片明明是我从原图剪切下来的

8bit Bitmap, 1 pixel = 1 char. (right)
24bit Bitmap, 1 pixel = 3 char (R, G, B).(wrong)
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

Quote: 引用:


if(srcPtr[x]==desPtr[0])   // 假如原图的某一个点灰度值与模板第一个点灰度值相同,进入compare匹配整个矩阵
{
isFinish=GrayCompare(graySource,grayDestination,x,y);               
}

这个也应该是个循环,因为灰度值是0~255,这么多点,肯定会有灰度值相同的

是一个循环,就是穷举整个图片的所有矩阵去匹配,比如模板是10*10,原图是100*100,那么我的模板将会逐一去跟矩阵{(0,0),(10,10)},{(0,1),(10,11)}……匹配,只有100个灰度值都相等是才认为是匹配的,现在出现的问题是原图没有一个子矩阵是跟模板相同的,为什么会出现这种情况,图片明明是我从原图剪切下来的

8bit Bitmap, 1 pixel = 1 char. (right)
24bit Bitmap, 1 pixel = 3 char (R, G, B).(wrong)


我用ps处理成8bit的灰度图像了……
ps处理这不行吧,这可能会有误差的
ps处理后在剪切过也行
------解决方案--------------------
也可以,不过用画图版就够了,还有一个要确定你的模版是否真的属于某幅图片,把两个图片的灰度值用数字的形式打印到文本文件里,直观的看看你匹配的内容是否真和你预期的相同,你程序虽然结构不好,逻辑是对的,当然前提是你处理的是8bit位图
------解决方案--------------------
手写一个:

bool match(const IplImage* src,const IplImage* dst)
{
assert(src && dst && src->width < dst->width && src->height < dst->height);

for(int srcY=0;srcY<(src->height-dst->height);srcY++)
{
for(int srcX=0;srcX<(src->width-dst->width);srcX++)
{
//match the sub image
for(int dstY=0;dstY<dst->height;dstY++)
{
char * srcPtr = src->imageData+srcY*src->width+srcX;
char * dstPtr = dst->imageData+dstY*dst->width;
if(memcmp(srcPtr,dstPtr,dst->width))
{
return false;
}
}
}
}
return true;
}