对于以下问题,OpenCV使用哪种最明智的算法或算法组合:
我尝试过cvMatchTemplate,结果很差(很难正确匹配,大量的误报,所有的匹配方法).一些问题来自OpenCV似乎无法处理alpha通道模板匹配的事实.
我尝试过手动搜索,看起来效果更好,并且可以包含alpha通道,但速度非常慢.
谢谢你的帮助.
我正在尝试使用模板实现实时跟踪.我希望每帧更新模板.我所做的主要修改是:
1)将模板匹配和minmaxLoc分别分离成单独的模块,即TplMatch()和minmax()函数.
2)在track()函数内部,select_flag始终保持为true,以便在每次迭代时将新模板复制到"myTemplate".
3)函数track()的最后3行是更新模板(roiImg).
4)另外,我已经删除了track()函数的任何参数,因为img和roiImg是全局变量,因此不需要将它们传递给函数.
以下是代码:
#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 = …c++ opencv image-processing computer-vision template-matching
我正在尝试从用消费者相机(包括移动电话)拍摄的图像中提取不形成有意义字的字母数字字符(a-z0-9).字符具有相同的大小和字体类型,并且不格式化.实际处理在Windows下完成.
下图显示了原始输入:

透视处理后,我将以下内容应用于OpenCV:
cv::medianBlur于去除噪音cv::adaptiveThreshold完成所有这些步骤后,我得到的图像与以下相似:



然后我分别在每个提取的细胞图像上运行tesseract(带有最新训练数据的最新SVN版本)(我尝试了不同的-psm和-l值):
tesseract.exe -l eng -psm 11 sample.png outtext
tesseract产生的结果不是很好:
我已经尝试过形态学操作(开放,闭合,侵蚀,扩张)并用OTSU阈值(THRESH_OTSU)替换自适应阈值,但结果变得更糟.
还有什么可以尝试提高识别质量?或者除了使用tesseract之外,还有更好的方法来提取字符(例如模板匹配?)?
编辑(21-12-2014): 
我测试了简单的模板匹配(使用标准化的互相关和LMS,但结果更差).但是我通过提取每个字符findCountours然后运行仅包含一个字符的tesseract以及将-psm 10每个输入图像解释为单个字符的选项向前迈出了一大步.Additonaly我在后处理步骤中删除了非字母数字字符.第一批结果令人鼓舞,检出率达到90%且更好.主要问题是"9","g"和"q"字符的错误检测.
问候,
我正在使用模板匹配创建一个简单的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;
    }
现在的问题是使用这个minMaxValue做出决定(真/假).我知道上面两种方法TM_SQDIFF和TM_SQDIFF_NORMED返回低值,而其他方法返回高值,所以我可以有2个不同的阈值并比较一个阈值(取决于模板方法类型).
因此,如果有人可以解释MinMaxLocResult返回的minVal和maxVal范围是多么好.
它是0到1范围?
如果是,对于Max类型模板方法,值1是否完美匹配?
我正在尝试创建一个模板化can_stream结构,该结构继承自
std::false_type或std::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() …我正在评估模板匹配算法来区分相似和不相似的对象。我发现令人困惑的是,我的印象是模板匹配是一种比较原始像素强度值的方法。因此,当像素值变化时,我预计模板匹配会给出较低的匹配百分比。
我有一个模板和搜索图像,其形状和大小相同,仅颜色不同(附图)。当我进行模板匹配时,令人惊讶的是我得到的匹配百分比大于 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)
有人可以告诉我为什么会这样吗?我什至在 HSV 色彩空间、完整 BGR 图像、完整 HSV 图像、B、G、R 的单独通道和 H、S、V 的单独通道中尝试过此操作。在所有情况下,我都获得了不错的百分比。
任何帮助都将非常感激。
我正在尝试为游戏制作机器人。基本上它从地上捡起物品,事情是这些物品有时看起来不同,例如。角度不同,或者它们躺在不同颜色的地面上等。为了使一切正常,我需要多个模板。有没有办法做到这一点?如果你不明白,请在评论中告诉我。这是我到目前为止尝试过的:
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)
这有效,但可能会更好。你有什么想法?
我试图通过沿图像移动模板来将模板与二值图像(仅黑白)匹配。并返回模板和图像之间的最小距离,该图像具有该最小距离确实发生的对应位置。例如:
图片:
0 1 0
0 0 1
0 1 1
模板:
0 1
1 1
该模板与位置 (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]
但是对于我需要的大小的图像(500 x 200 像素之间的图像和 250 x 100 之间的模板)这已经需要大约 4.5 秒,这太慢了。而且我知道使用矩阵乘法可以更快地完成同样的事情(在 matlab 中我相信这可以使用 im2col 和 repmat 完成)。谁能解释我如何在 python/numpy 中做到这一点?
顺便提一句。我知道有一个 opencv matchTemplate 函数可以完全满足我的需要,但是由于我稍后可能需要更改代码,因此我更喜欢我完全理解并且可以更改的解决方案。 …
我有使用 python 编写的工作 OpenCV 模板匹配代码。现在我正在寻找一种方法来告诉 OpenCV 仅在提供的区域(x,y,w,h)中搜索,这可能吗?
问候, 菲利普
python opencv image-processing computer-vision template-matching
我正在尝试在 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
    );
}
我的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)
当我不断收到时出现问题:ValueError:无法将输入数组从形状(53,51)广播到形状(52,52)
这个数字 (53, 51) (52,52) 可能会改变,因为我只是稍微修改了结果或 curr_image 中的坐标,但这不是正确的答案。
这是我当前的代码:
import cv2 as cv …