【问题标题】:OpenCV Template Matching for Round Images in JavaJava中圆形图像的OpenCV模板匹配
【发布时间】:2015-01-03 05:39:43
【问题描述】:

我并不总是有方形/矩形图像,有时我也应该匹配圆形图像。下面以 2 张图片为例。 Ball 是模板图像,第二个是 Source 应搜索模板的位置。我可以使模板的背景透明,但这会产生错误,将其设置为白色会降低匹配分数,因为正如您在源图像上看到的那样,球周围没有白色。这些只是 2 个示例图片。您有什么建议/解决方案吗?

【问题讨论】:

    标签: java image opencv image-processing template-matching


    【解决方案1】:

    我认为您也可以为此使用直方图反投影。在那里,您也可以使用任意形状的蒙版。将遮罩与反投影图像进行卷积,您将在图像中出现对象的区域检测到一个峰值,如下图(颜色映射和缩放)所示。

    反投影:

    卷积:

    编辑:

    这是基于此paper。我正在试验它,并希望在博客中发布。 这是用 C++ 编写的。

    // model histogram: this is the football template
    calcHist(&model32fc3, 1, (const int*)channels, modelMask, histModel, 3, (const int*)histSize, (const float**)ranges, true, false);
    // image histogram
    calcHist(&image32fc3, 1, (const int*)channels, Mat(), histImage, 3, (const int*)histSize, (const float**)ranges, true, false);
    // ratio histogram
    divide(histModel, histImage, histRatio);
    cv::min(histRatio, 1.0, histRatio);
    // backproject ratio histogram
    calcBackProject(&image32fc3, 1, (const int*)channels, histRatio, backprj, (const float**)ranges);
    // convolve the kernel with the backprojected image
    filter2D(backprj, conv, CV_32F, modelMask);
    

    【讨论】:

    • 你能举个例子吗?或制作此教程的链接?
    • 添加了代码。我还在试验它。如果我有机会在以后的博客中发布此代码,我会更新代码或提供链接。
    • 我知道 C++,但不能用 Java 工作,你能用 Java 发布吗?或者你完全完成后我会自己尝试。
    • 抱歉,我没有在 Java 中使用过 OpenCV。我说我正在试验,因为我没有对它进行广泛的测试,但它对于不受光照变化影响的图像效果很好。而且我忘了提到我使用的是 RBG 色彩空间。
    【解决方案2】:

    没关系,您仍然可以使用matchTemplate() 并获得出色的结果:

    You can find a decent tutorial on OpenCV's documentation。顺便说一下,这是那里分享的演示的输出。

    【讨论】:

    • 模板匹配找到最佳结果,即使模板不在源中,它也会标记一个正方形。如果搜索到的图像确实在源中,那么分数就像 0.9987... 但在这种情况下,白人的分数将为 0.7... 我会说 1000 次比较不同的图像,有些会有绿色,有些会有蓝色,一些灰色的背景。这将始终影响匹配分数。我根据为我的案例找到或未找到的分数图像设置阈值,并且具有随机阈值将是一个问题。我知道它会一直高于 0.6...但仍然...
    【解决方案3】:

    如果你知道属于模板的像素,你可以编写你的匹配器

    绝对差之和试验(伪代码)

    Mat I, T // image and template
    vector<Point> template_pixels
    Rect sliding_window
    vector<double> match_rates
    
    for all rows in image
    update sliding_window
        for all cols in image
        update sliding_window
        Mat W = I(sliding_window)
        sum = 0
             for all rows in template
                  for all cols in template
                  if(template_pixels contains pixel i)
                       sum += abs(W(i) - T(i))
                  end for
             end for
        match_rates.pushback(sum)
        end for
    end for
    
    minMaxLoc(match_rates)
    

    并在图像行上使用多线程对其进行优化

    【讨论】:

    • 我不知道 python 如果这是 python 我可能会尝试 :) 我在 berky 中写了这个。它是一种非常简单但功能强大的语言 - 并且很棒,正如你已经想出来的那样 - 很难习惯.. 8)
    • 你说得对,Python 有点不同。如果这是 Java 代码,我肯定会 +1。
    猜你喜欢
    • 2013-02-28
    • 1970-01-01
    • 2017-06-17
    • 2014-12-18
    • 2013-03-25
    • 1970-01-01
    • 2015-10-06
    • 2015-12-27
    • 2014-03-11
    相关资源
    最近更新 更多