如何在图片1中查找图片2的位置

tongyongmc 2008-12-05 06:04:44
原本是想实现 按键精灵中的 FindPic() 函数,参数:BMP格式的图片。返回值的是这个图片在桌面窗口中的左上角坐标。
另外这个函数还可以
1、查找近似图片(尽管不清楚他怎么定义“近似”这个词,但主观上是和要查找的图片大体相似)
2、查找镂空的图片(图片不规则,将需要镂空部分设置成统一的单色)
这个函数是别人的,效率慢了点,另外也不是完全符合我的要求,比如找出桌面窗口中全部符合的坐标,效率就太慢了。

简单说一下我的思路。我手上有两幅图片A、B,分别称为大图和小图,目的是要在大图中找到小图的位置。
把小图分成 (n/2)*(m/2)份(n,m=2,4,6,8,...),其中每一小块矩形称为Pa,左上角第一块矩形称为Pa1
把大图分成 n*m 份,其中每一小块为Pb ,有Pa=4Pb,左上角第一块矩形称为Pb1

可以证明:如果小图在大图中的话,那么必定Pa1包含Pb1。
比较是否包含我用的是最简单的循环语句,就是说Pa1中的每个值都应该大于等于Pb1。否者这个Pb1肯定不是我们要的,直接比较下一个Pb2和Pa1,直到大图的全部矩形块和小图的Pa1比较完毕,这样就完成了第一遍过滤。
重新定位Pa1的位置,重复上面的步骤,就可以找到小图在大图中的大概位置(大图的块数只会越来越少)。

BOOL InHistogram(CvHistogram* hist_trg,CvHistogram *hist_src,int HistBlock,int IG_H=0)
{ /*hist_src是Pa1的灰度直方图,hist_trg是Pb1的灰度直方图,HistBlock=256,IG_H这个判断是我打算保留到后面使用的*/
for (int j=0; j<HistBlock;j++)
{
if (j==IG_H)
continue ;
if ((((CvMatND*)hist_src->bins)->data.fl[j])<(((CvMatND*)hist_trg->bins)->data.fl[j]))
return FALSE ;
}
return TRUE ;
}
附件是我对程序运行后的结果,比较意外的是第一遍过滤就只有一个结果(大图中白色线条的矩形)。
问题也来了,现在得到的只是一个近似位置,如何快速精确到1个象素上?
查找镂空的图片我想可以在InHistogram中做点文章,把IG_H派上用场。
但如何查找相似的图片,要可量化的(0-1,1表示完全相同),还没有好的思路。
...全文
240 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,446

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧