OpenCV具有matchTemplate()通过在输出上滑动模板输入并生成与匹配项对应的数组输出来运行的功能。
在哪里可以了解有关如何解释六个TemplateMatchModes的更多信息?
我已根据本教程通读并实现了代码,但除了理解一个人在寻找TM_SQDIFF匹配的最小结果而在其余情况中寻找最大的结果之外,我不知道如何解释不同的方法以及一个方法的情况。会选择一个。
例如(取自本教程)
res = cv.matchTemplate(img_gray, template, cv.TM_CCOEFF_NORMED)
threshold = 0.8
loc = np.where(res >= threshold)
Run Code Online (Sandbox Code Playgroud)
和
R(x,y)= ?x?,y? (T?(x?,y?) ? I?(x+x?,y+y?))
?????????????????????????????????-------------
sqrt(?x?,y? T?(x?,y?)^2 ? ?x?,y? I?(x+x?,y+y?)^2)
Run Code Online (Sandbox Code Playgroud)
(摘自文档页面;不确定如何进行公式格式化)
我推断这TM_CCOEFF_NORMED将返回0到1之间的值,并且0.8阈值是任意的,但这只是假设。
是否需要更深入地研究在线方程式,针对标准数据集的性能度量,或有关不同模式以及何时以及为何使用一种模式的学术论文?
我正在使用模板匹配来检测大图像中的较小图像。检测到它后,我会抓取检测到的图像的主图片的中心点(xy)。
谁能建议我如何抓住特定中心点的阴影/颜色?
我理解模板匹配忽略颜色,基于这个例子,无论如何要获取特定像素的颜色强度?那个中心点
# Python program to illustrate
# template matching
import cv2
import numpy as np
import time
import sys
# Read the main image
img_rgb = cv2.imread('test.png')
# Convert it to grayscale
img_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)
# Read the template
template = cv2.imread('template.png',0)
# Store width and heigth of template in w and h
w, h = template.shape[::-1]
# Perform match operations.
res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
# Specify a threshold
threshold = 0.90
# Store the coordinates of matched …Run Code Online (Sandbox Code Playgroud) 这是我用于模板匹配的代码,min_val、max_val、min_loc、max_loc 是什么意思?它们有什么用?
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('C:\\machineLearning\\positive\\1.jpg', 0)
img2 = img.copy()
template = cv2.imread('C:\\machineLearning\\positive\\1_.jpg', 0)
w, h = template.shape[::-1]
img = img2.copy()
method = eval('cv2.TM_SQDIFF')
res = cv2.matchTemplate(img,template,method)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
top_left = min_loc
bottom_right = (top_left[0] + w, top_left[1] + h)
cv2.rectangle(img,top_left, bottom_right, 255, 2)
plt.subplot(121),plt.imshow(res,cmap = 'gray')
plt.title('Matching Result'), plt.xticks([]), plt.yticks([])
plt.subplot(122),plt.imshow(img,cmap = 'gray')
plt.title('Detected Point'), plt.xticks([]), plt.yticks([])
plt.suptitle('cv2.TM_SQDIFF')
plt.show()
Run Code Online (Sandbox Code Playgroud) 一如既往,我是世界上最差的正则表达者.但这次我真的尝试过.
所以我的目标是制作一个处理搜索相关内容的正则表达式.搜索查询可能是这样的:
但它应该能够分别检测它们.它应该能够检测直接匹配的引用.只有标题,必须在它后面有搜索查询,但其他条件可以是任何顺序.
现在我很困难..我设法做了这个正则表达式.它仅适用于状态:封闭类型:图像标题:堆栈溢出.()thingis 之间的点使它工作.如果我用|替换它,那么我得到第一部分匹配.但是,对于我而言,使用所有可能的查询格式来实现此功能是不可行的.
/(?:(?:status[:](closed|open)).(?:type[:](image|video)).(?:(?:title|author|actor|movie)[:](.+)))/i
Run Code Online (Sandbox Code Playgroud)
下面是工具,我试图做这一切:http://regexr.com/39an1我的涂鸦就在那里了.
这是针对搜索引擎类型的东西.所以我希望从匹配中获得结果,在PHP中很容易使用.此外,我认为有人可以从中受益,它会有一个解决方案.
如果有人能指出我的话,至少点对点 主要的()东西之间.感觉就像| =或者,但我想要有点像和/或东西.
最近,我一直在开发一个小型项目,需要能够在另一个图像中找到子图像的X和Y坐标.图像可能具有不同的分辨率,但总体而言图像分辨率相似且颜色应相同.我已经研究过OpenCV,但似乎OpenCV只返回一个匹配.我需要在超级图像中找到子图像的所有出现/实例.我已经拥有了所有要搜索的子图像,因此我只需要一种方法来查找超级图像中子图像的坐标.
这是我的意思的一个例子:
如果我们有red_circle.png:

并且shapes.png:

我需要获得各种形状(超级图像)图片中所有红色圆圈(red_circle.png;子图像)的X和Y坐标shapes.png.
理想情况下,我希望能够做到这样的事情:
/* code to read in red_cirlce.png and shapes.png as BufferedImages */
ArrayList<Point> instancesOfRedCircle = new ArrayList<>();
findAllSubimageInstances( shapesObj, // Super-Image
redCircleObj, // Subimage
instancesOfRedCircle // ArrayList to put points in
);
Run Code Online (Sandbox Code Playgroud)
有没有人知道这样做的方法(例如,库,函数等)?
我正在使用opencv cvMatchTemplate在一堆图像中查找商标图案.
现在我所做的就是查看图片,从商标中找到一些独特的补丁,并将其用作我的模板.我发现使用整个商标图片并不一定比使用它的一部分更好.我的问题是
这是正常的吗?或者我做错了.
如果是正常的,我如何选择一个好的模板来进行更准确的匹配?
换句话说,选择好模板背后是否有任何数学理论,这可以帮助我选择最佳模板.
我没有使用特征检测,因为我发现模板匹配不准确.
我正在尝试使用opencv在图像中找到一些模板。尽管opencv有几种模板匹配方法,但要通过看一下它们的数学等式来理解它们的区别以及何时使用它们是很麻烦的:
有人可以用非数学的方式解释所有这些方法之间的主要区别吗?
我有一个程序,应该在图像和模板上进行模板匹配,这是代码:
int main()
{
IplImage* imgOriginal = cvLoadImage("image.jpg", 0);
IplImage* imgTemplate = cvLoadImage("template.jpg", 0);
IplImage* imgResult = cvCreateImage(cvSize(imgOriginal->width-imgTemplate->width+1, imgOriginal->height-imgTemplate->height+1), IPL_DEPTH_32F, 1);
cvZero(imgResult);
cvMatchTemplate(imgOriginal, imgTemplate, imgResult, CV_TM_CCORR_NORMED);
double min_val=0, max_val=0;
CvPoint min_loc, max_loc;
cvMinMaxLoc(imgResult, &min_val, &max_val, &min_loc, &max_loc);
cvRectangle(imgOriginal, max_loc, cvPoint(max_loc.x+imgTemplate->width, max_loc.y+imgTemplate->height), cvScalar(0), 1);
printf("%f", max_val);
cvNamedWindow("result");
cvShowImage("result", imgOriginal);
cvWaitKey(0);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
包含文件:
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include "stdio.h"
using namespace cv;
using namespace std;
Run Code Online (Sandbox Code Playgroud)
运行代码时,出现此错误:
templateMatching.cpp:16:75: error: ‘cvMatchTemplate’ was not declared in this scope
Run Code Online (Sandbox Code Playgroud)
知道是什么问题吗?预先感谢,马特
假设我有一张图像,我想将其扫描到屏幕上(截取屏幕截图并进行检查)。有谁知道我应该研究哪些科目以及在哪里?我真的很感激任何对我的算法的帮助。