改进 OpenCV 的模板匹配算法

信息处理 图像处理 算法 opencv 物体识别
2022-02-21 13:07:39

使用 OpenCV 进行汽车检测

我正在做一个小型个人项目,我必须知道显示的图像是否是汽车。我正在使用基于基本 OpenCV python 的模板匹配。

正面形象/模板形象

车顶视图:-

顶视图

通过使用另一个正图像之一的简单模板匹配给出了所需的结果。

负面形象

但是当我们使用负面图像时

负面形象

模板查找器发现这是一个正匹配。

尝试和失败的方法:-

  1. 增加模板匹配的阈值:- 增加阈值会导致许多实际的正图像停止匹配

  2. OpenCV 中存在的不同类型的模板匹配技术:- 没有给出更好的结果

  3. 使用多个模板来加强正负匹配:- 不适用于所有情况

有没有更好的方法来删除与我们得到的误报匹配的模板。是否有任何基于特征匹配或边缘检测的技术可以用来代替模板匹配来改进我的算法。

2个回答

我假设图像在尺寸方面具有相同的比例。有了这个,我建议尝试使用以下内容:

  1. 把你的形象分成几部分。(模板图像以及测试图像。根据您的选择可以是3个或4个。)
  2. 然后对每个部分进行模板匹配。考虑每个模板部分的共同阈值,然后仅当所有部分都给出肯定结果时才将其计为肯定。

(PS 在其他一些帖子上提出了类似的解决方案。我不完全记得是哪个帖子。)

更新:在完全相同的点对模板和测试图像进​​行分区。

通过将匹配算法与直方图比较相结合,我极大地改进了我的匹配算法。

我的最终匹配概率是这样计算的:

probability = (matchingProbability * 2 + histProbability) / 3

我还发现反转图像可以进一步改善模板匹配。

this.tmplMeanStdDev = getMeanStdDev(tmpl)
const meanArr = tmpl.mean()
const mean = (meanArr.x + meanArr.y + meanArr.z) / 3

if (this.tmplMeanStdDev < 140) {
  // low contrast
  this.matchMethod = TM_CCOEFF_NORMED
} else {
  // normal contrast
  this.matchMethod = TM_SQDIFF_NORMED
  if (mean > 65) {
    // bright template image -> invert
    this.tmpl = this.tmpl.bitwiseNot()
    this.image = this.image.bitwiseNot()
  }
}

我可以建议设置一个包含大量输入的测试环境来自动检查您的结果。然后调整阈值和参数,直到达到最佳状态。