Open CV中的2D子图像检测

Sam*_*Sam 8 opencv image-processing template-matching

对于以下问题,OpenCV使用哪种最明智的算法或算法组合:

  • 我有一组小的2D图像.我想在更大的图像中检测这些子图像的位置.
  • 子图像通常约为32x32像素,较大的图像约为400x400.
  • 子图像并不总是正方形,因此包含alpha通道.
  • 可选地 - 较大的图像可以是颗粒状的,压缩的,3D旋转的,或者稍微变形的

我尝试过cvMatchTemplate,结果很差(很难正确匹配,大量的误报,所有的匹配方法).一些问题来自OpenCV似乎无法处理alpha通道模板匹配的事实.

我尝试过手动搜索,看起来效果更好,并且可以包含alpha通道,但速度非常慢.

谢谢你的帮助.

nav*_*nav 7

  1. cvMatchTemplate使用MSE(SQDIFF/SQDIFF_NORMED)类型的度量来进行匹配.这种度量将严重惩罚不同的α值(由于等式中的平方).您是否尝试过规范化的互相关?已知更好地模拟像素强度的线性变化.
  2. 如果NCC不能完成这项工作,您需要将图像转换为强度差异没有太大影响的空间.例如,计算边缘强度图像(canny,sobel等)并在这些图像上运行cvMatchTemplate.
  3. 考虑到图像尺度的巨大差异(~10x).必须使用图像金字塔来确定匹配的正确比例.建议您从比例开始(2 ^ 1/x:x是正确的比例)并将估计值传播到金字塔上.