标签: template-matching

Open CV中的2D子图像检测

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

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

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

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

谢谢你的帮助.

opencv image-processing template-matching

8
推荐指数
1
解决办法
4110
查看次数

实时模板匹配 - OpenCV,C++

我正在尝试使用模板实现实时跟踪.我希望每帧更新模板.我所做的主要修改是:

1)将模板匹配和minmaxLoc分别分离成单独的模块,即TplMatch()minmax()函数.

2)在track()函数内部,select_flag始终保持为true,以便在每次迭代时将新模板复制到"myTemplate".

3)函数track()的最后3行是更新模板(roiImg).

4)另外,我已经删除了track()函数的任何参数,因为imgroiImg是全局变量,因此不需要将它们传递给函数.

以下是代码:

#include <iostream>
#include "opencv2/opencv.hpp"
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/objdetect/objdetect.hpp>

#include <sstream>


using namespace cv;
using namespace std;

Point point1, point2; /* vertical points of the bounding box */
int drag = 0;
Rect rect; /* bounding box */
Mat img, roiImg; /* roiImg - the part of the image in the bounding box */
int select_flag = …
Run Code Online (Sandbox Code Playgroud)

c++ opencv image-processing computer-vision template-matching

8
推荐指数
1
解决办法
4万
查看次数

提高Tesseract检测质量

我正在尝试从用消费者相机(包括移动电话)拍摄的图像中提取不形成有意义字的字母数字字符(a-z0-9).字符具有相同的大小和字体类型,并且不格式化.实际处理在Windows下完成.

下图显示了原始输入: 原始图像

透视处理后,我将以下内容应用于OpenCV:

  • 从RGB转换为灰色
  • 适用cv::medianBlur于去除噪音
  • 使用自适应阈值将图像转换为二进制 cv::adaptiveThreshold
  • 我知道网格的行数和列数.因此,我只使用此信息提取每个网格单元.

完成所有这些步骤后,我得到的图像与以下相似:

在此输入图像描述

在此输入图像描述

在此输入图像描述

然后我分别在每个提取的细胞图像上运行tesseract(带有最新训练数据的最新SVN版本)(我尝试了不同的-psm-l值):

tesseract.exe -l eng -psm 11 sample.png outtext
Run Code Online (Sandbox Code Playgroud)

tesseract产生的结果不是很好:

  • 大多数字符无法识别.
  • 网格线有时被解释为"l"或"i"字符.

我已经尝试过形态学操作(开放,闭合,侵蚀,扩张)并用OTSU阈值(THRESH_OTSU)替换自适应阈值,但结果变得更糟.

还有什么可以尝试提高识别质量?或者除了使用tesseract之外,还有更好的方法来提取字符(例如模板匹配?)?

编辑(21-12-2014): 我测试了简单的模板匹配(使用标准化的互相关和LMS,但结果更差).但是我通过提取每个字符findCountours然后运行仅包含一个字符的tesseract以及将-psm 10每个输入图像解释为单个字符的选项向前迈出了一大步.Additonaly我在后处理步骤中删除了非字母数字字符.第一批结果令人鼓舞,检出率达到90%且更好.主要问题是"9","g"和"q"字符的错误检测.

问候,

c++ ocr opencv tesseract template-matching

8
推荐指数
1
解决办法
1559
查看次数

什么是OpenCV模板匹配Max Min值范围?需要用作theshold/c ++/java

我正在使用模板匹配创建一个简单的openCV应用程序,我需要比较在大图像中查找小图像并返回结果为true(如果匹配找到)或false(未找到匹配项).

    Imgproc.matchTemplate(largeImage, smallImage, result, matchMethod);
    Core.normalize(result, result, 0, 1, Core.NORM_MINMAX, -1, new Mat());

    MinMaxLocResult mmr = Core.minMaxLoc(result);

    double minMaxValue = 1;
    if (matchMethod== Imgproc.TM_SQDIFF || matchMethod== Imgproc.TM_SQDIFF_NORMED)
    {
        minMaxValue = mmr.minVal;
        useMinThreshold = true;
    }
    else
    {
        minMaxValue = mmr.maxVal;
    }
Run Code Online (Sandbox Code Playgroud)

现在的问题是使用这个minMaxValue做出决定(真/假).我知道上面两种方法TM_SQDIFF和TM_SQDIFF_NORMED返回低值,而其他方法返回高值,所以我可以有2个不同的阈值并比较一个阈值(取决于模板方法类型).

因此,如果有人可以解释MinMaxLocResult返回的minVal和maxVal范围是多么好.

它是0到1范围?

如果是,对于Max类型模板方法,值1是否完美匹配?

c++ java opencv image-processing template-matching

7
推荐指数
1
解决办法
9044
查看次数

为什么非专业模板胜过部分专业模板?

我正在尝试创建一个模板化can_stream结构,该结构继承自 std::false_typestd::true_type取决于是否operator<<为 type 定义T

#include <iostream>

struct S {
    int i;
};

std::ostream& operator<< (std::ostream& os, S const& s) {
    os << s.i << std::endl;
    return os;
};

struct R {
    int i;
};

template<
    typename T,
    typename Enable = void
> struct can_stream : std::false_type {
};

template<
    typename T
> struct can_stream< T, decltype( operator<<( std::declval< std::ostream& >(), std::declval< T const& >())) > : std::true_type {
};

int main() …
Run Code Online (Sandbox Code Playgroud)

c++ sfinae template-matching template-meta-programming

7
推荐指数
1
解决办法
181
查看次数

颜色上的模板匹配行为

我正在评估模板匹配算法来区分相似和不相似的对象。我发现令人困惑的是,我的印象是模板匹配是一种比较原始像素强度值的方法。因此,当像素值变化时,我预计模板匹配会给出较低的匹配百分比。

我有一个模板和搜索图像,其形状和大小相同,仅颜色不同(附图)。当我进行模板匹配时,令人惊讶的是我得到的匹配百分比大于 90%。

img = cv2.imread('./images/searchtest.png', cv2.IMREAD_COLOR)
template = cv2.imread('./images/template.png', cv2.IMREAD_COLOR)
res = cv2.matchTemplate(img, template, cv2.TM_CCORR_NORMED)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
print(max_val)
Run Code Online (Sandbox Code Playgroud)

模板图片:模板图像

搜索图片:搜索图片

有人可以告诉我为什么会这样吗?我什至在 HSV 色彩空间、完整 BGR 图像、完整 HSV 图像、B、G、R 的单独通道和 H、S、V 的单独通道中尝试过此操作。在所有情况下,我都获得了不错的百分比。

任何帮助都将非常感激。

opencv colors image-processing template-matching

6
推荐指数
1
解决办法
1万
查看次数

OpenCV模板匹配,多模板

我正在尝试为游戏制作机器人。基本上它从地上捡起物品,事情是这些物品有时看起来不同,例如。角度不同,或者它们躺在不同颜色的地面上等。为了使一切正常,我需要多个模板。有没有办法做到这一点?如果你不明白,请在评论中告诉我。这是我到目前为止尝试过的:

files = ["bones_{}.png".format(x) for x in range(6)]

    for i in range(6):
        img_gray = cv2.cvtColor(imageGrab(), cv2.COLOR_BGR2GRAY)
        f = str(files[i])
        template = cv2.imread(f, 0)
        w, h = template.shape[:: -1]
        res = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)
        threshhold = 0.70
        loc = np.where( res >= threshhold)
Run Code Online (Sandbox Code Playgroud)

这有效,但可能会更好。你有什么想法?

python templates opencv template-matching

6
推荐指数
1
解决办法
4771
查看次数

使用矩阵乘法的 numpy 模板匹配

我试图通过沿图像移动模板来将模板与二值图像(仅黑白)匹配。并返回模板和图像之间的最小距离,该图像具有该最小距离确实发生的对应位置。例如:

图片:

0 1 0
0 0 1
0 1 1
Run Code Online (Sandbox Code Playgroud)

模板:

0 1
1 1
Run Code Online (Sandbox Code Playgroud)

该模板与位置 (1,1) 处的图像最佳匹配,然后距离将为 0。到目前为止,事情并不太困难,我已经得到了一些可以解决问题的代码。

def match_template(img, template):
    mindist = float('inf')
    idx = (-1,-1)
    for y in xrange(img.shape[1]-template.shape[1]+1):
        for x in xrange(img.shape[0]-template.shape[0]+1):
        #calculate Euclidean distance
        dist = np.sqrt(np.sum(np.square(template - img[x:x+template.shape[0],y:y+template.shape[1]])))
        if dist < mindist:
            mindist = dist
            idx = (x,y)
    return [mindist, idx]
Run Code Online (Sandbox Code Playgroud)

但是对于我需要的大小的图像(500 x 200 像素之间的图像和 250 x 100 之间的模板)这已经需要大约 4.5 秒,这太慢了。而且我知道使用矩阵乘法可以更快地完成同样的事情(在 matlab 中我相信这可以使用 im2col 和 repmat 完成)。谁能解释我如何在 python/numpy 中做到这一点?

顺便提一句。我知道有一个 opencv matchTemplate 函数可以完全满足我的需要,但是由于我稍后可能需要更改代码,因此我更喜欢我完全理解并且可以更改的解决方案。 …

python numpy template-matching

5
推荐指数
1
解决办法
3550
查看次数

OpenCV 模板匹配:限制搜索区域

我有使用 python 编写的工作 OpenCV 模板匹配代码。现在我正在寻找一种方法来告诉 OpenCV 仅在提供的区域(x,y,w,h)中搜索,这可能吗?

问候, 菲利普

python opencv image-processing computer-vision template-matching

5
推荐指数
1
解决办法
3906
查看次数

在 Python 中使用金字塔进行快速模板匹配

我正在尝试在 Python 中实现以下 C++ 代码:https : //opencv-code.com/tutorials/fast-template-matching-with-image-pyramid/

如果你检查C++ 代码,你会看到这个循环:

for (int i = 0; i < contours.size(); i++)
{
    cv::Rect r = cv::boundingRect(contours[i]);
    cv::matchTemplate(
        ref(r + (tpl.size() - cv::Size(1,1))), 
        tpl, 
        res(r), 
        CV_TM_CCORR_NORMED
    );
}
Run Code Online (Sandbox Code Playgroud)

我的Python代码:

for i in range(0, np.size(contours)-1):
    x, y, w, h = cv.boundingRect(contours[i][0])
    tpl_X = curr_template.shape[1]-1
    tpl_Y = curr_template.shape[0]-1

    result[y:h, x:w] = cv.matchTemplate(
                           curr_image[y:h+tpl_Y, x:w+tpl_X],
                           curr_template, cv.TM_CCORR_NORMED)
Run Code Online (Sandbox Code Playgroud)

当我不断收到时出现问题:ValueError:无法将输入数组从形状(53,51)广播到形状(52,52)

这个数字 (53, 51) (52,52) 可能会改变,因为我只是稍微修改了结果或 curr_image 中的坐标,但这不是正确的答案。

这是我当前的代码:

import cv2 as cv …
Run Code Online (Sandbox Code Playgroud)

python opencv template-matching

5
推荐指数
1
解决办法
4161
查看次数