整整一天我已经尝试了很多东西来获得子图像中的所有相关匹配(使用matchtemplate函数),这是我已经使用mousecallback函数从原始图像中提取的ROI.所以我的代码在下面是匹配功能
////Matching Function
void CTemplate_MatchDlg::OnBnTemplatematch()
{
namedWindow("reference",CV_WINDOW_AUTOSIZE);
while(true)
{
Mat ref = imread("img.jpg"); // Original Image
mod_ref = cvCreateMat(ref.rows,ref.cols,CV_32F);// resizing the image to fit in picture box
resize(ref,mod_ref,Size(),0.5,0.5,CV_INTER_AREA);
Mat tpl =imread("Template.jpg"); // TEMPLATE IMAGE
cvSetMouseCallback("reference",find_mouseHandler,0);
Mat aim=roiImg1.clone(); // SUB_IMAGE FROM ORIGINALIMAGE
// aim variable contains the ROI matrix
// next, want to perform template matching in that ROI // and display results on original image
if(select_flag1 == 1)
{
// imshow("ref",aim);
Mat res(aim.rows-tpl.rows+1, aim.cols-tpl.cols+1,CV_32FC1);
matchTemplate(aim, tpl, res, CV_TM_CCOEFF_NORMED);
threshold(res, res, …Run Code Online (Sandbox Code Playgroud) 我的问题在这里显示:问题陈述.我有一个模板图像,我必须在相机图像中检测.在检测到之后,我必须通过使用仿射变换来标准化相机图像.我的工作目标是识别十字架.我尝试使用SURF功能进行图像归一化步骤,但模板图像非常规则,不适合SURF匹配.有什么想法可以做到这一点?也许某种轮廓匹配?
opencv image-processing pattern-matching computer-vision template-matching
是否可以从正在运行的应用程序中替换模板库的手势模板?我正在建立一个手写识别系统,其中手势库文件中有字母模板.所以基本上在代码中加载库后我比较用户输入手势,如:
public void onGesturePerformed(GestureOverlayView overlay, Gesture gesture) {
ArrayList<Prediction> predictions = gesturelib.recognize(gesture);
if (predictions.size() > 1) {
for(Prediction prediction: predictions){
//i compare prediction name here and if matches print it in an edittext
}
Run Code Online (Sandbox Code Playgroud)
这应该工作得很好,直到用户给出与我在构建库模板期间所做的相同的模式.但是我想让用户在预测不匹配时灵活地用他的手写模式替换模板项.
因为下面2个手写的手势样本在模式方面有所不同,而不是作为一个字母.假设,我的系统支持第一个图像模式,我想当用户给出第二个图像模式时系统会要求用户确认将其替换为A的库模式然后在确认之后将其替换.所以下次系统将更好地识别用户模式.
任何帮助将不胜感激.

我正在使用OpenCV和C++.我想检查图像是否是另一个图像的一部分,并且已经找到了一个matchTemplate正在工作的函数.但是如果模板图像有点不同呢?有没有一个函数或类似方法matchTemplate检查模板是否是源图像的一部分,但是具有公差参数,如位置,角度,大小甚至可能变形?或者我需要一个完全不同的方法而不是模板匹配?
这是我到目前为止的代码,它在源图像中找到模板图像,但没有(或几乎没有)容差.
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <opencv2\imgproc\imgproc.hpp>
#include <opencv2\highgui\highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
using namespace std;
/// Global Variables
Mat img; Mat templ; Mat result;
const char* image_window = "Source Image";
const char* result_window = "Result window";
int match_method;
int max_Trackbar = 5;
/// Function Headers
void MatchingMethod( int, void* );
/**
* @function main
*/
int main( int, char** argv )
{
/// …Run Code Online (Sandbox Code Playgroud) c++ opencv image-processing computer-vision template-matching
我搜索了很多以找到下面提到的方法的阈值。
methods = ['cv2.TM_CCOEFF', 'cv2.TM_CCOEFF_NORMED', 'cv2.TM_CCORR',
'cv2.TM_CCORR_NORMED', 'cv2.TM_SQDIFF', cv2.TM_SQDIFF_NORMED']
Run Code Online (Sandbox Code Playgroud)
我也试图自己弄清楚它们,但我只能找到最大值为 1.0 的 3 种方法的阈值。其他方法的值在 10^5 的范围内。我想知道这些方法的界限。
有人可以指出我正确的方向。我的议程是遍历模板匹配的所有方法并获得最佳结果。我浏览了文档和源代码,但没有运气。
这些是我得到的值,我可以理解 *NORMED 方法的值是 0-1。
cv2.TM_CCOEFF -- 25349100.0
cv2.TM_CCOEFF_NORMED -- 0.31208357214927673
cv2.TM_CCORR -- 616707328.0
cv2.TM_CCORR_NORMED -- 0.9031367897987366
cv2.TM_SQDIFF -- 405656000.0
cv2.TM_SQDIFF_NORMED -- 0.737377941608429
Run Code Online (Sandbox Code Playgroud) 根据此链接,我正在尝试使用 opencv python 在图像中查找多个模板。
但问题是,单个对象返回的多个点在位置上略有不同。像这样的东西:
我不想使用,cv2.minMaxLoc()因为图像中有多个模板。我写了一个删除平仓的函数,但我想知道这个问题有什么简单的解决方案吗?谢谢。
python opencv image-processing computer-vision template-matching
我正在构建一个跟踪未知对象的对象跟踪程序.用户必须在实时视频流中选择应跟踪的区域.我的项目与此视频类似.
http://www.youtube.com/watch?v=G5GLIKIkd6E
我尝试了一种方法,但它不够健壮,跟踪器移动了很多.所以我再次从头开始.
任何人都知道如何在视频中提出一个方法?我是emgucv的新手,截至目前我真的不知道从哪里开始.
我怎样才能得到一个绝对值,告诉我模板在它最匹配的地方匹配了多少?我知道 minMaxLoc() ,但这只能告诉我最大的值是多少,但我不知道 MAXIMUM 值是多少,因此我可以了解它的匹配程度。
我见过有人说你可以使用归一化得到一个百分比,但这并没有真正帮助我,因为最大的值总是 100%。我错过了什么吗?
我正在尝试匹配这张图片
在这张图片中
然而,我找不到超过一个的头目敌人。我需要做什么才能找到其他人?
图片加载
struct XYposition{
float X;
float Y;
};
std::vector<cv::Mat> bossList;
std::string bossStrings[1] = { "sprites\\boss\\bossUp.png" };
for (int i = 0; i < 1; i++){
cv::Mat pic = cv::imread(bossStrings[i], CV_LOAD_IMAGE_GRAYSCALE);
bossList.push_back(pic);
}
multipleTemplateMatch(screenImage, bossList);
Run Code Online (Sandbox Code Playgroud)
模板匹配
std::vector<XYposition> multipleTemplateMatch(cv::Mat &img, std::vector<cv::Mat> tplList){
std::vector<XYposition> matches;
cv::Mat convertImg(img.rows, img.cols, CV_8UC3);
cv::cvtColor(img, convertImg, CV_BGRA2GRAY);
double threshold = 0.8;
int imgint = convertImg.type();
for(cv::Mat tpl : tplList){
int tplint = tpl.type();
cv::Mat result(convertImg.rows - tpl.rows + 1, convertImg.cols - tpl.cols + 1,
CV_32FC1); …Run Code Online (Sandbox Code Playgroud) 所以,最后我已经将 BoofCV 安装到 Android Studio(本网站上的 Tx 到 Q&A)并且所有示例都通过打开弹出窗口(包括模板匹配和网络摄像头捕获)完美运行:
但是事件日志中的消息[说],“将项目迁移到 Gradle?该项目不使用 Gradle 构建系统。我们建议您迁移到使用 Gradle 构建系统。那么,我应该怎么做!?
我想通过网络摄像头创建模板匹配的应用程序。是否可以忽略上述警告消息来创建我的应用程序。!?
提前致谢。
template-matching android-studio android-gradle-plugin boofcv