精华内容
下载资源
问答
  • 多目标模板匹配

    2018-11-10 10:34:40
    这个程序代码是关于单模板,在目标上进行模板匹配识别,基于MATLAB语言架构进行的程序编写。
  • 多目标模板匹配.rar

    2020-05-22 12:00:31
    使用vs和opencv编写的多目标模板匹配代码,可以再图片中查找个匹配目标模板的位置。模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配...
  • halcon 对于多目标模板匹配 (基于形状的模板匹配方法) 通过该方法可对零件进行模板提取 进而对其进行模板匹配
  • 多目标模板匹配结果如图——

    多目标模板匹配结果如图——



    程序如下——

    #include <iostream>   
    #include "cv.h"   
    #include "cxcore.h"   
    #include "highgui.h"   
    using namespace std;  
      
    CvPoint getNextMinLoc(IplImage *result, CvPoint minLoc, int maxVaule, int templatW, int templatH)  
    {  
      
        // 先将第一个最小值点附近两倍模板宽度和高度的都设置为最大值防止产生干扰   
        int startX = minLoc.x - templatW;  
        int startY = minLoc.y - templatH;  
        int endX = minLoc.x + templatW;  
        int endY = minLoc.y + templatH;  
        if(startX < 0 || startY < 0)  
        {  
            startX = 0;  
            startY = 0;  
        }  
        if(endX > result->width - 1 || endY > result->height - 1)  
        {  
            endX = result->width - 1;  
            endY = result->height - 1;  
        }  
        int y, x;  
        for(y = startY; y < endY; y++)  
        {  
            for(x = startX; x < endX; x++)  
            {  
                cvSetReal2D(result, y, x, maxVaule);  
            }  
        }  
        // 然后得到下一个最小值并且返回   
        double new_minVaule, new_maxValue;  
        CvPoint new_minLoc, new_maxLoc;  
        cvMinMaxLoc(result, &new_minVaule, &new_maxValue, &new_minLoc, &new_maxLoc);  
        return new_minLoc;  
      
    }  
    int main()  
    {  
        IplImage *src = cvLoadImage("E:\\shili\\match_src.jpg", 0);  
        IplImage *srcResult = cvLoadImage("E:\\shili\\match_src.jpg", 3);  //用来显示   
        IplImage *templat = cvLoadImage("E:\\shili\\match_template.jpg", 0);  
        IplImage *result;  // 用来存放结果   
        if(!src || !templat)  
        {  
            cout << "打开图片失败" << endl;  
            return 0;  
        }  
        int srcW, srcH, templatW, templatH, resultH, resultW;  
        srcW = src->width;  
        srcH = src->height;  
        templatW = templat->width;  
        templatH = templat->height;  
        if(srcW < templatW || srcH < templatH)  
        {  
            cout << "模板不能比原图小" << endl;  
            return 0;  
        }  
        resultW = srcW - templatW + 1;  
        resultH = srcH - templatH + 1;  
        result = cvCreateImage(cvSize(resultW, resultH), 32, 1);    //  匹配方法计算的结果最小值为float   
        cvMatchTemplate(src, templat, result, CV_TM_SQDIFF);     //方差最小,匹配最好
        double minValue, maxValue;  
        CvPoint minLoc, maxLoc;  
        cvMinMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);    
        cvRectangle(srcResult, minLoc, cvPoint(minLoc.x + templatW, minLoc.y+ templatH), cvScalar(0,0,255));  
        CvPoint new_minLoc;  
      
        // 计算下一个最小值   
        new_minLoc = getNextMinLoc(result, minLoc, maxValue, templatW, templatH);  
        cvRectangle(srcResult, new_minLoc, cvPoint(new_minLoc.x + templatW, new_minLoc.y+ templatH), cvScalar(0,0,255));  
        // 再下一个   
        new_minLoc = getNextMinLoc(result, new_minLoc, maxValue, templatW, templatH);  
        cvRectangle(srcResult, new_minLoc, cvPoint(new_minLoc.x + templatW, new_minLoc.y+ templatH), cvScalar(0,0,255));  
        cvNamedWindow("srcResult", 1);  
        cvNamedWindow("templat", 1);  
        cvShowImage("srcResult", srcResult);  
        cvShowImage("templat", templat);  
        cvWaitKey(0);  
        cvReleaseImage(&result);  
        cvReleaseImage(&templat);  
        cvReleaseImage(&srcResult);  
        cvReleaseImage(&src);  
        return 0;  

    展开全文
  • 基于Halcon的多目标模板匹配算法

    千次阅读 2016-10-17 22:19:21
    模板匹配,顾名思义,需要一个模板。然后在图像中寻找与模板能匹配得上的区域。Halcon中,基于灰度值的模板匹配的算法中,算法的基本原理比较简单,就是简单的灰度比对。
    1. 基于灰度值的模板匹配基本原理:
    模板匹配,顾名思义,需要一个模板。然后在图像中寻找与模板能匹配得上的区域。Halcon中,基于灰度值的模板匹配的算法中,算法的基本原理比较简单,就是简单的灰度比对。找出灰度值与模板区域相近的区域作为找到的目标区域,具体算法如下:
    即,当error满足阈值时,则该点与模板成功匹配。

    2. 实战算法框架:
    1. 选中模板区域,并将其创建为旋转模板;
    2. 运用模板匹配函数,寻找并标记处图片中的目标区域。

    3. 实战步骤:
    1. 选中要寻找的目标的模板,比如下图中的贴片电容(红色框中区域)
    2. 利用该ROI区域创建一个可旋转的匹配模板,函数为create_template_rot,旋转范围,步长,金字塔级数自选等等。为了提高效率,基于该应用,由于贴片电容的位置只有水平和竖直两种,所以步长设置为π/2。也就是说0-2π的范围内,有4个方位的模板。
    3. 之后利用匹配函数:best_match_rot_mg,进行再全图中寻找与模板相似目标。while循环,终止条件为上公式中error值大于某阈值。最终匹配结果如下图:

    欢迎关注微信公众号“智能算法”!
    展开全文
  • 基于opencv的多目标模板匹配

    千次阅读 2017-11-14 00:02:00
    利用opencv进行多目标模板匹配,只要是利用其matchTemplate函数,但在目标(这里是讨论目标图片中不同大小模板的匹配),以下贴出代码和图片,供大家参考: #include #include #include #include #include ...

    利用opencv进行多目标模板匹配,只要是利用其matchTemplate函数,但在多目标(这里是讨论目标图片中不同大小模板的匹配),以下贴出代码和图片,供大家参考:

    #include <opencv2\core\core.hpp>
    #include <opencv2\highgui\highgui.hpp>
    #include <opencv2\imgproc\imgproc.hpp>
    #include <iostream>
    #include <math.h>
    
    using namespace std;
    using namespace cv;
    
    Point getNextMinLoc(Mat &result, Point minLoc, int maxValue, int templatW, int templatH);
    
    int main(void)
    {
    	Mat src = imread("1_2.png");
    	Mat srcCopy = src.clone();
    	
    	Mat temp = imread("1_4.png");
    	Mat result;
    
    	if (src.empty() || temp.empty())
    	{
    		cout << "打开图片失败" << endl;
    		return 0;
    	}
    
    	vector<Mat> templat;
    	vector<float> minV;
    	vector<Point> minL;
    
    	int srcW, srcH, templatW, templatH, resultH, resultW;
    	srcW = src.cols;
    	srcH = src.rows;
    	templat.push_back(temp);
    	double minValue, maxValue;
    	Point minLoc, maxLoc;
    
    	for (int i=0;i<10;i++)
    	{
    		cout << i << ": ";
    		templatW = templat[i].cols;
    		templatH = templat[i].rows;
    
    		if (srcW < templatW || srcH < templatH)
    		{
    			cout << "模板不能比原图大" << endl;
    			return 0;
    		}
    
    		resultW = srcW - templatW + 1;
    		resultH = srcH - templatH + 1;
    
    		result.create(Size(resultW, resultH), CV_32FC1);
    		matchTemplate(src, templat[i], result, CV_TM_SQDIFF_NORMED);
    
    		minMaxLoc(result, &minValue, &maxValue, &minLoc, &maxLoc);
    
    		cout << "min1: " << minValue << endl;
    		if (minValue<=0.070055)
    		{
    			rectangle(srcCopy, minLoc, Point(minLoc.x + templatW, minLoc.y + templatH), Scalar(0, 0, 255), 2, 8, 0);
    
    			Point new_minLoc;
    			new_minLoc = getNextMinLoc(result, minLoc, maxValue, templatW, templatH);
    			
    			float *data = result.ptr<float>(new_minLoc.y);
    
    			cout << "min2: " << data[new_minLoc.x] << " ";
    			if (data[new_minLoc.x]<=0.5)
    			{
    				cout << "进这个函数了:" << i << ":" << new_minLoc.x;
    				cout << " " << new_minLoc.y;
    				rectangle(srcCopy, new_minLoc, Point(new_minLoc.x + templatW, new_minLoc.y + templatH),
    					Scalar(0, 255, 0), 2, 8, 0);
    				new_minLoc = getNextMinLoc(result, new_minLoc, maxValue, templatW, templatH);
    			}
    
    			float *data1 = result.ptr<float>(new_minLoc.y);
    			cout << "min3: " << data1[new_minLoc.x] << " " << endl;
    			if (data1[new_minLoc.x] <= 0.4)
    			{
    				
    				rectangle(srcCopy, new_minLoc, Point(new_minLoc.x + templatW, new_minLoc.y + templatH),
    					Scalar(255, 0, 0), 2, 8, 0);
    			}
    		}
    		cout << "#" << endl;
    		Mat temp_templat;
    		resize(templat[i], temp_templat, Size(templat[i].cols / 1.1, templat[i].rows / 1.1));
    		templat.push_back(temp_templat);
    	}
    
    	imshow("结果", srcCopy);
    	waitKey(0);
    	return 0;
    }
    
    Point getNextMinLoc(Mat &result, Point minLoc, int maxValue, int templatW, int templatH)
    {
    	//imshow("result", result);
    	//cout << "maxvalue: " << maxValue << endl;
    	int startX = minLoc.x - templatW / 3;
    	int startY = minLoc.y - templatH / 3;
    	int endX = minLoc.x + templatW / 3;
    	int endY = minLoc.y + templatH / 3;
    	if (startX < 0 || startY < 0)
    	{
    		startX = 0;
    		startY = 0;
    	}
    	if (endX > result.cols - 1 || endY > result.rows - 1)
    	{
    		endX = result.cols - 1;
    		endY = result.rows - 1;
    	}
    	int y, x;
    	for (y = startY; y < endY; y++)
    	{
    		for (x = startX; x < endX; x++)
    		{
    			float *data = result.ptr<float>(y);
    			
    			data[x] = maxValue;
    		}
    	}
    	double new_minValue, new_maxValue;
    	Point new_minLoc, new_maxLoc;
    	minMaxLoc(result, &new_minValue, &new_maxValue, &new_minLoc, &new_maxLoc);
    	//imshow("result_end", result);
    	return new_minLoc;
    }
    

    以下是结果图:

     

     

    转载于:https://my.oschina.net/u/3397950/blog/1573076

    展开全文
  • 首先,本人不是专业写代码的,因此说的不对的地方,请各位大神指教!一定要说啊。  对于非标自动化设备行业,利用工业相机做...目标是找出目标图中所有的“2”,并确定旋转角度,精度只能到1°了!!!再高的精度还没

    首先,本人不是专业写代码的,因此说的不对的地方,请各位大神指教!一定要说啊。

            对于非标自动化设备行业,利用工业相机做视觉识别,然后抓取工件的应用可谓非常成熟广泛,然后想着我要是也能略知一二那就好了,于是在工作之余研究了一下,自己画了一张图,就是下面这张:

    模板取自图中的某个小号的“2”:

    目标是找出目标图中所有的“2”,并确定旋转角度,精度只能到1°了!!!再高的精度还没研究,希望各位指教!!

    好了下面开始说下我的思路:

    Step1:以灰度图模式加载图片,就是imread(“...”,0);

    Step2:对模板图和目标图分别进行边沿检测:先blur(...),再canny(....);大家也可以尝试其他的边沿检测方法!

    Step3:由于目标图中存在有不同角度的旋转目标,所以最直接的做法是对模板图旋转1°,利用wrapAffine(...)得到新的模板图片后再与目标图的边沿图进行匹配,找出最佳匹配信息;

        Step3.1:create一个原模板图旋转任何角度都能不丢失内容的图片,该图片cols和rows都为模板图片对角线长

        Step3.2:定义一个仿射变换矩:确定旋转中心点,Point(对角线/2,对角线/2);缩放比例为1;

        Step3.3:getRotationMatrix2D(......)得到仿射变换矩;

        Step3.4:warpAffine(...)得到新的模板图

    Step4:将目标图的边沿图与上面得到新的模板图进行matchTemplate(...);

    Step5:由于是多目标查找,封装了一个函数GetNextMaxLoc(...); /*没错,是NextMax,这里参考      点击打开链接     中的                          getNextMinLoc(...)*/;  进行for循环;

        Step5.1:定义一个数据结构,包含信息有:新模板图的旋转角度,GetNextMaxLoc(...)获取的最佳匹配点maxLoc,           和最大匹配值maxVal;  

        Step5.2:定义一个元素为上述数据结构的vector;

        Step5.3:定义一个模板类,比较数据结构中的maxLoc元素是否为同一个点,参考: 在元素为结构体变量的vector中查找元素http://blog.chinaunix.net/uid-22431962-id-125367.html

    Step5.4:利用迭代器iterator进行过滤:如果容器中存在相同的maxLoc,比较相同maxLoc时两者的maxVal,如果新的                    maxVal比原maxVal大,则替换掉maxVal和此时的模板旋转角度;否则不做处理;

       如果不存在相同的maxLoc,则将此时的数据结构元素push_back(....)到5.2定义的容器中;

    Step6:对step3-5进行while循环,匹配过滤得到最终的最佳的目标匹配信息容器;

    Step7:对上述得到的匹配信息容器进行解析,在目标灰度图中用rotateRect类形的矩形标记,输出角度,匹配值,坐标信息

    下面贴出两张结果图:

    匹配信息输出

    标记结果

    这是我作为opencv初学者多目标匹配的方法,是最笨的,所以大家看到了,0-180°的查找时间用了5秒多!希望各位过客有更高效的方法能够传授一二!!

    感谢!!!

        

    展开全文
  • 关于OpenCv的模板匹配函数matchTemplate,这些地方都讲得都比较清楚,但我第一天看,还没没看到在C#上实现的,所以只能一步步写,函数定义,模仿,解决报错。 友情链接: OpenCV模板匹配函数matchTemplate...
  • 模板匹配-多目标匹配

    2020-05-21 18:36:30
    这里写自定义目录标题基于OpenCV的多目标模板匹配 基于OpenCV的多目标模板匹配 如图所示,输入原图和模板,算法将在原图上搜索模板,并返回定位结果 代码已开源: 地址 转载请注明作者和出处:...
  • 模板匹配多目标

    热门讨论 2013-03-21 16:41:55
    基于opencv的多目标模板匹配,对车牌识别等有一定的借鉴作用
  • 目标数字进行模板匹配,已打包数字模板和目标样本。小程序很实用,可在基础上加算法,实测C++,opencv2.4.9下运行无误。
  • 基于OpenCV多目标模板匹配算法

    热门讨论 2013-11-26 11:00:20
    基于OpenCV多目标模板匹配算法,可以从一副大图像中搜索出与模板相似的目标区域...
  • 用金字塔模型实现的快速模板匹配算法,可以一次检测目标,而且非常快,非常不错的模板匹配算法,附上源码和例子,亲测可用!
  • Android OpenCV 模板匹配多目标、多匹配具体代码注意事项 在网上搜了许多文章和博客居然没有一个介绍如何使用java opencv 进行模板匹配多目标的,翻看了opencv官网的文档也都没有找到,网上基本上都是介绍如何用...
  • 使用一张图像对Halcon模板匹配算子进行实例测试:单模板和多模板匹配
  • 复杂场景下目标跟踪的多模板匹配算法研究,可以学习一下。
  • 目标跟踪之——尺度模板匹配

    千次阅读 2017-10-13 17:23:02
    %尺度模板匹配 %原理:根据原始模板图像预先产生一系列不同尺度的模板 %检测的时候分别用上述各个尺度的模板遍历图像%% clear; clc;srcImg_rgb=imread('0132.jpg'); tImg=imread('hh.jpg'); srcImg=rgb2gray(srcIm
  • 目标跟踪方法实现,通过模板匹配的方法进行跟踪 先用鼠标选择要跟踪的目标,再利用模板匹配的方法实现实时帧的跟踪 附源代码和测试视频以及更视频的网站链接
  • 匹配输出与模板匹配的第一个目标的位置,并在目标图片中框出
  • 模板匹配发查找目标

    万次阅读 2018-06-08 15:39:44
    使用模板匹配在图像中查找目标 学习函数cv2.matchTemplate(),cv2.minMaxLoc() 原理: 模板匹配是在一副图像中寻找模板图像的方法。opencv中有函数cv2.matchTemplate()来实现。与2D卷积一样...
  • 基于自适应模板匹配的红外弱小目标检测 [日期:2005-8-24] 来源:电子技术应用 作者:顾静良 张 卫 万 敏 [字体:大 中 小]    摘要:提出了一种红外弱小目标识别的新方法。从实际应用出发,考虑复杂...
  • 基于目标轮廓的图像匹配,首先...能够抗一定的光照影响,遮挡影响,耗时比传统图像的模板匹配快。如果需要旋转角度的话,可以使用二分法或者每隔一定角度重复调用。 该代码是基于opencv2的,可以很方便的修改成opencv3
  • 1.模板匹配opencv函数 链接:http://www.opencv.org.cn/opencvdoc/2.3.2/html/modules/imgproc/doc/object_detection.html?highlight=matchtemplate#cv.MatchTemplate   matchTemplate(InputArray image, Input...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 83,580
精华内容 33,432
关键字:

多目标模板匹配