我是emgu的新手,想要从哪里开始.
我已经看过形状检测,但它太复杂了我需要的东西..我想..而且我的例子不起作用.我收到此错误:
无论如何,这就是我想要做的:在图像B中找到图像A.图像A是一个简单的正方形,总是具有相同的灰色1像素边框并且总是相同的尺寸(我相信)但内部颜色可能是黑色或大约7种其他颜色之一(只有纯色).当我按下按钮时,我需要在图像b中找到图像A的坐标.见下图.
图B
和
图片A
我正在做一个项目,我必须检查药物泡罩包装是否缺少药片.
我正在尝试使用opencv的matchTemplate函数.让我展示代码,然后是一些结果.
int match(string filename, string templatename)
{
Mat ref = cv::imread(filename + ".jpg");
Mat tpl = cv::imread(templatename + ".jpg");
if (ref.empty() || tpl.empty())
{
cout << "Error reading file(s)!" << endl;
return -1;
}
imshow("file", ref);
imshow("template", tpl);
Mat res_32f(ref.rows - tpl.rows + 1, ref.cols - tpl.cols + 1, CV_32FC1);
matchTemplate(ref, tpl, res_32f, CV_TM_CCOEFF_NORMED);
Mat res;
res_32f.convertTo(res, CV_8U, 255.0);
imshow("result", res);
int size = ((tpl.cols + tpl.rows) / 4) * 2 + 1; //force size to be odd
adaptiveThreshold(res, …Run Code Online (Sandbox Code Playgroud) 对于matchTemplate()的CV_TM_CCORR_NORMED方法,我的老板和我不同意这是怎么回事; 在openCV中.
你能解释一下这里发生了什么,特别是这个等式的平方根方面.
OpenCV 3.0.0增加了在执行templateMatch时指定掩码的功能.当我指定一个掩码时,我收到此错误:error: (-215) (depth == CV_8U || depth == CV_32F) && type == _templ.type() && _img.dims() <= 2 in function matchTemplateMask
模板图像(带透明度的PNG):
来源图片:
码
# read the template emoji with the alpha channel
template = cv2.imread(imagePath, cv2.IMREAD_UNCHANGED)
channels = cv2.split(template)
zero_channel = np.zeros_like(channels[0])
mask = np.array(channels[3])
# all elements in alpha_channel that have value 0 are set to 1 in the mask matrix
mask[channels[3] == 0] = 1
# all elements in alpha_channel that have value 100 are set …Run Code Online (Sandbox Code Playgroud) 在阅读了文档并在互联网上搜索之后,我仍然不明白如何从openCV解释matchTemplate函数的输出.
我的理解:
result = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)
Run Code Online (Sandbox Code Playgroud)
据我所知,我得到了一个矩阵,它具有图片中每个部分的匹配值.此矩阵中的每个元素确定它与模板显示的相似程度.
例如,我可以过滤所有匹配值低于0.7的位置
numpy.where(result >= 0.7)
我不明白的是这些信息是如何存储在我从matchTemplate函数得到的输出中的,以及如何从输出中提取匹配的位置.
基本上我想做的是将几个模板匹配到一个图像,然后确定哪个模板最适合哪个位置(具有一个位置的所有应用模板的最大匹配值).
我的想法是将匹配值提取到每个模板的矩阵中,然后将矩阵(它们的元素)相互比较以找到最佳匹配.
谢谢你的帮助,请在我错的地方纠正我,
问候唐
我在GTX690上使用opencv GPU :: matchTemplate().
我在内部检查了函数,发现gpu :: matchTemplate()在这个过程中没有使用任何FFT,而它的CPU对应物却没有.
我的问题是,在GPU中不使用FFT的原因是什么?
我正在使用OpenCV 3.0.0将图像定位到另一个图像.先验函数matchTemplate是我需要使用的,但看到结果我不再确定了.
问题在于,根据输入图像,结果非常准确或完全不准确.
例1:
主图像

模板

结果

这里没有抱怨.在这种情况下匹配是完美的.但现在我替换我想要使用的图像和...
主图像

模板

结果

所以,根本不工作(图像右上角的结果矩形).任何方法(在此示例中为CORR NORMED)都会打印模板所在的矩形.所有结果都远非准确.
所以,我的问题是,matchTemplate的结果是否取决于主图像有多少种不同的颜色/形状?SURF或SIFT会帮助我吗?你们现在有什么功能可以帮助我将模板定位到另一个图像中吗?
先感谢您!
PS:我没有添加任何代码,因为我猜这不是那种问题,因为第一个例子效果很好.
我使用 JavaCV(不是 OpenCV)。Mat我的目标是从存储为资源的图像中获取对象。然后我将把它传递Mat给opencv_imgproc.matchTemplate方法。我设法编写了这个糟糕的代码:
InputStream in = getClass().getResourceAsStream("Lenna32.png");
BufferedImage image = ImageIO.read(in);
Frame f = new Java2DFrameConverter().getFrame(image);
Mat mat = new OpenCVFrameConverter.ToMat().convert(f);
Run Code Online (Sandbox Code Playgroud)
这在某些情况下有效。问题是:
对于具有透明通道(即 32BPP)的 png 图像,它会移动通道,从而R=00 G=33 B=66 A=FF变成R=33 G=66 B=FF

在我的目标环境中,我无法使用ImageIO
InputStream -> BufferedImage -> Frame -> Mat。我觉得应该有一个简单而有效的方法来做到这一点。从资源创建 Mat 的最佳方法是什么?
所以我有一个图像
和一个模板
我想在图像中找到模板图像,但我的代码没有找到任何东西。我尝试缩小尺寸但仍然没有检测到。请帮我举个例子:
import cv2
import imutils
import glob, os
import numpy as np
image = cv2.imread("mainimage.png")
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
h, w = gray.shape[:2]
for file in glob.glob("template.png"):
template = cv2.imread(file)
template = cv2.cvtColor(template, cv2.COLOR_BGR2GRAY)
found = None
(tH, tW) = template.shape[:2]
cv2.imshow("Template", template)
for scale in np.linspace(1, 0.2, 20)[::-1]:
resized = imutils.resize(gray, width=int(gray.shape[1] * scale))
r = gray.shape[1] / float(resized.shape[1])
if resized.shape[0] < tH or resized.shape[1] < tW:
break
edged = cv2.Canny(resized, 50, 200)
result = cv2.matchTemplate(edged, template, …Run Code Online (Sandbox Code Playgroud) 我正在努力解决这个问题,因为在我从相机拍摄的图像中,我需要找到一些模式的存在和位置.
为此,我发现使用matchTemplateopencv的方法.我使用了opencv样本中使用的图像并编写了代码但结果却不同.
http://opencv.itseez.com/doc/tutorials/imgproc/histograms/template_matching/template_matching.html
这是告诉我们matchTemplate的链接.
当我实现它时,它显示了结果: -

我的代码如下: -
-(void)matchPatchNet
{
IplImage *res;
CvPoint minloc, maxloc;
double minval, maxval;
int img_width, img_height;
int tpl_width, tpl_height;
int res_width, res_height;
NSString *pathPatron = [[NSBundle mainBundle] pathForResource:@"timage" ofType:@"jpg"];
UIImage *tim = [UIImage imageWithContentsOfFile:pathPatron];
NSString *pathPatron2 = [[NSBundle mainBundle] pathForResource:@"simage" ofType:@"jpg"];
UIImage *tim2 = [UIImage imageWithContentsOfFile:pathPatron2];
IplImage *img = [self CreateIplImageFromUIImage:tim2];//
IplImage *tpl = [self CreateIplImageFromUIImage:tim];
cv::Mat forground1 = [tim2 CVMat];
cv::Mat forground2 = [tim CVMat];
img_width = img->width;
img_height = img->height;
tpl_width …Run Code Online (Sandbox Code Playgroud)