精华内容
下载资源
问答
  • 基于OpenCV多目标的模板匹配算法

    热门讨论 2013-11-26 11:00:20
    基于OpenCV多目标的模板匹配算法,可以从一副大图像中搜索出与模板相似的多个目标区域...
  • halcon 对于多目标的模板匹配 (基于形状的模板匹配方法) 通过该方法可对零件进行模板提取 进而对其进行模板匹配
  • 多目标模板匹配

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

    2020-05-22 12:00:31
    使用vs和opencv编写的多目标模板匹配代码,可以再图片中查找多个匹配目标模板位置。模板匹配是一种最原始、最基本模式识别方法,研究某一特定对象物图案位于图像什么地方,进而识别对象物,这就是一个匹配...
  • 在网上搜了许多文章和博客居然没有一个介绍如何使用java opencv 进行模板匹配多目标的,翻看了opencv官网的文档也都没有找到,网上基本上都是介绍如何用python 和 c++ 进行opencv操作的,哎~ 看来只能靠自己了,废话...

    Android OpenCV 模板匹配多目标、多匹配

    在网上搜了许多文章和博客居然没有一个介绍如何使用java opencv 进行模板匹配多目标的,翻看了opencv官网的文档也都没有找到,网上基本上都是介绍如何用python 和 c++ 进行opencv操作的,哎~ 看来只能靠自己了,废话不多说 先看效果图:
    在这里插入图片描述

    这里把小日本的图标都给匹配到了,用到的模板图片是下面这个:

    在这里插入图片描述

    具体代码

    
        public void Matching() {
            Mat muban = Imgcodecs.imread("/storage/emulated/0/muban2.jpg");     //todo  模板图
            Mat src = Imgcodecs.imread(getExternalFilesDir("") + "/jietu.jpg");     //todo 待匹配的图
            Mat clone = src.clone();
            if(muban.empty()){
                Log.e(TAG, "未找到资源");
                return;
            }
    
            int templatW, templatH, resultH, resultW;
            templatW = muban.width();
            templatH = muban.height();
    
            resultH = src.rows() - muban.rows() + 1;
            resultW = src.cols() - muban.cols() + 1;
            Mat result = new Mat(new Size(resultH,resultW), CvType.CV_32FC1);
            Imgproc.matchTemplate(clone, muban, result, Imgproc.TM_CCOEFF_NORMED);   //是标准相关性系数匹配  值越大越匹配
            Core.MinMaxLocResult mmr;
            mmr = Core.minMaxLoc(result);
            //在原图上的对应模板可能位置画一个绿色矩形
            Imgproc.rectangle(src, mmr.maxLoc, new Point( mmr.maxLoc.x + templatW, mmr.maxLoc.y + templatH), new Scalar(0, 255, 0),5);
            Log.e(TAG, "匹配的值:"+mmr.maxVal+"   ------坐标:"+mmr.maxLoc.x+","+mmr.maxLoc.y);
             for (int i=0;i<8;i++){
                if(mmr.maxVal>0.8){   //这里是判断相似程度的
                    mmr = getMaxLoc(clone,muban,templatW,templatH,mmr.maxLoc);
                    if(mmr.maxVal>0.8){
                        Imgproc.rectangle(src, mmr.maxLoc, new Point( mmr.maxLoc.x + templatW, mmr.maxLoc.y + templatH), new Scalar(0, 255, 0),5);
                        Log.e(TAG, "匹配的值:"+mmr.maxVal+"   ------坐标:"+mmr.maxLoc.x+","+mmr.maxLoc.y);
                    }
                }
              }
    
             //将结果输出到对应位置
            Imgcodecs.imwrite(getExternalFilesDir("") +"/匹配结果.jpeg", src);
        }
    

    这里自己写了个 getMaxLoc 方法循环调用把匹配的目标全部找出来

    
        private Core.MinMaxLocResult getMaxLoc(Mat clone,Mat result, int templatW, int templatH, Point maxLoc){
            int startY,startX,endY,endX;
    
            //计算大矩形的坐标
            startY = (int)maxLoc.y;
            startX = (int)maxLoc.x;
    
            //计算大矩形的的坐标
            endY = (int)maxLoc.y + templatH;
            endX = (int)maxLoc.x + templatW;
    
            //将大矩形内部 赋值为最大值 使得 以后找的最小值 不会位于该区域  避免找到重叠的目标
            int ch = clone.channels();     //通道数 (灰度: 1, RGB: 3, etc.)
            for (int i = startX; i < endX;  i++) {
                for (int j = startY; j < endY ;  j++) {
                    double[] data = clone.get(j, i);    //读取像素值,并存储在double数组中
                    for (int k = 0; k < ch; k++){        //RGB值或灰度值
                        data[k] =255;      //对每个像素值(灰度值或RGB通道值,取值0~255)进行处理
                    }
                    clone.put(j, i,data);         //把处理后的像素值写回到Mat
                }
            }
    
            int resultH = clone.rows() - result.rows() + 1;
            int resultW = clone.cols() - result.cols() + 1;
            Mat result2 = new Mat(new Size(resultH,resultW), CvType.CV_32FC1);
            Imgproc.matchTemplate(clone, result, result2, Imgproc.TM_CCOEFF_NORMED);   //是标准相关性系数匹配  值越大越匹配
    
    
    //        Imgcodecs.imwrite(getExternalFilesDir("") +"/匹配结果.jpeg", clone);
            //查找result中的最大值 及其所在坐标
           return Core.minMaxLoc(result2);
        }
    

    **思路主要是 循环调用 opencv的 matchTemplate 方法不断进行匹配,每次匹配的时候把上次的目标位置在图片中抹除,这样下次再匹配的时候就不会匹配到重复的目标,匹配是从大到小依次把目标位置筛选出来的
    在这里插入图片描述

    注意事项

    [1] 该博客是本人原创博客,转载时请注明出处~
    [2] 由于个人能力有限,上面实现的方案可能不是最优的,如果你有更好的实现方案,欢迎留言告诉我
    我会及时回复

    展开全文
  • 模板匹配-多目标匹配

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

    基于OpenCV的多目标模板匹配

    如图所示,输入原图和模板,算法将在原图上搜索模板,并返回定位结果
    模板匹配

    代码已开源:
    地址

    转载请注明作者和出处:http://blog.csdn.net/holamirai,未经允许请勿用于商业用途。

    展开全文
  • 基于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值大于某阈值。最终匹配结果如下图:

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

    热门讨论 2013-03-21 16:41:55
    基于opencv的多目标模板匹配,对车牌识别等有一定借鉴作用
  • 基于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

    展开全文
  • 用金字塔模型实现的快速模板匹配算法,可以一次检测目标,而且非常快,非常不错的模板匹配算法,附上源码和例子,亲测可用!
  • 复杂场景下目标跟踪的多模板匹配算法研究,可以学习一下。
  • 一、概述 目标跟踪是计算机视觉领域一个重要... 在这里我们一起来欣赏下“模板匹配”这个简单点跟踪算法。它思想很简单,我们把要跟踪的目标保存好,然后在每一帧来临时候,我们在整个图像中寻找与这个目...
  • 模板的模板匹配Halcon

    千次阅读 2020-06-07 20:11:21
    目标图 代码: * This example program shows how to use HALCON's shape-based matching * to find multiple different models in one call to find_shape_models. Note that this * is one mode of operation...
  • 首先,本人不是专业写代码,因此说不对地方,请各位大神指教!...模板取自图中某个小号“2”: 目标是找出目标图中所有“2”,并确定旋转角度,精度只能到1°了!!!再高精度还没
  • 基于形状的模板匹配在我们实际的项目中应用最广,同时在一些项目中,光是选中一个目标作为匹配的模板,效果可能还达不到我们所需要的精度要求,所以这个时候可以考虑模板匹配,增加限制 ...
  • Imgproc.matchTemplate(img, templ, result, match_method); 用模板匹配得到result也是个Mat类型,能从这个result中取出目标
  • 目标跟踪方法实现,通过模板匹配的方法进行跟踪 先用鼠标选择要跟踪的目标,再利用模板匹配的方法实现实时帧跟踪 附源代码和测试视频以及更视频网站链接
  • 目标跟踪之——尺度模板匹配

    千次阅读 2017-10-13 17:23:02
    %尺度模板匹配 %原理:根据原始模板图像预先产生一系列不同尺度的模板 %检测的时候分别用上述各个尺度的模板遍历图像%% clear; clc;srcImg_rgb=imread('0132.jpg'); tImg=imread('hh.jpg'); srcImg=rgb2gray(srcIm
  • (1)目标匹配函数: cvMatchTemplate( const CvArr* image, constCvArr* templ,  CvArr* result,int method ); ...Templ 模板图像 ...Result 匹配结果 用来存放通过以下方法计算出滑动窗口与模板的
  • 工具–NuGet包管理器—管理解决方案NuGet程序包 测试程序 打开位于\bin\Debug\netcoreapp2.1和dill文件同目录下lenna.jpg。 先添加引用:using OpenCvSharp; static void Main(string[] args) {...
  • } //模板匹配多目标 int MultiMatch () { //加载(读取)图片 IplImage *src = cvLoadImage("SrcPic.bmp");//待匹配源图片 IplImage *templat = cvLoadImage("templatePic.bmp"); //模板图片 IplImage *result; // ...
  • 其次,在原有的模板匹配方法的基础上加以改进,既保留了模板匹配快速查找目标的优点又引入个不同的模板,使其能够同时查找个目标;然后,对局部区域进行精匹配并且对每个模板做优势评估,以此来进一步优化改进后的字符...
  • 模板匹配

    2020-07-25 21:37:18
    使用模板匹配在一副图像中查找目标 模板匹配和卷积原理很像,模板在原图像上从原点开始滑动, 并与每一个位置对模板图像和其对应输入图像子区进行比较。 计算模板与(图像被模板覆盖地方)差别程度,这个...
  • 本文中提出了一种新颖框架,即任务模板匹配(MTTM),该框架可以从深度图像中找到目标对象最接近模板,同时预测分割蒙版以及模板与场景中检测到对象之间姿势变换使用对象区域相同特征图。所提出特征...
  • 针对大数据量导致模板匹配目标识别算法计算时间长,难以满足快速检测实际需求问题,在采用最新NVIDIA Tesla GPU构建CPU+GPU异构平台上,设计了一种模板匹配目标识别并行算法。通过对模板图像数据常量化、输入...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 418
精华内容 167
关键字:

多目标的模板匹配