精华内容
下载资源
问答
  • 基于Opencv的图像多目标模板匹配算法
    2020-12-15 12:42:09

    龙源期刊网

    http://www.qikan.com.cn

    基于

    Opencv

    的图像多目标模板匹配算法

    作者:王丛政

    李启光

    来源:《电子技术与软件工程》

    2018

    年第

    05

    在箱体的图像采集与分割过程中,由于角度、光线的影响,使得模板图像与待匹配

    图像中相同目标图像因为角度变化和色差等原因影响,使得匹配成功率并不理想,存在无法匹

    配到目标箱体或者匹配偏差较大的问题。这里创新性的采用了一种新的图像预处理方法,使用

    边缘检测算子与膨胀的组合方法,对模板与待匹配图像进行处理,使用处理后的图像进行匹

    配。通过与传统方法的实验对比,实验结果表明,新的方法在图像在存在色差和一定旋转角度

    时,仍然具有较高的匹配率。

    【关键词】边缘检测

    模板匹配

    膨胀

    角度

    匹配率

    随着京东天猫自营仓库的发展,大型的仓库应运而生,人力取货装箱的运作方式越来越不

    能满足公司运作的要求,企业迫切的需要一种高效的取货方式代替人工取货。

    随着视觉与机器人技术的发展,采用视觉结合机器人取货的方式变成了一种可能,国内外

    各大网商纷纷开始了机器人取货的尝试,亚马逊在研究和实践上走在了前沿,采用托盘机器人

    将放置货物的货架运送到装箱人员的工位,员工取货后,物流小车将货架再运回货架原来所在

    的地方。但是此种方法在货物较小,货架较小,货架数量不多的情况下可以运行良好,但是对

    于货物体积过大,数量较多,货架体积较大,层数过多的情况下,采用物流车运送货架移动的

    方式显然不够优秀。所以采用货架固定,机械手在货架上上下左右移动取货的方式被提出并得

    到尝试。

    箱体分割方法最常用的方法是边缘检测的方法,采用

    canny

    算子等边缘检测算法检测采集

    来的箱体边缘,使用矩形边缘检测算子,将单独箱体的轮廓找到进而实现独立箱体的分割。此

    种方法在箱体图案较为简单,箱体之间的边缘较为清晰的时候,可以取得较好的效果,但是当

    箱体图案较为复杂,箱体显色较重,箱体之间靠的过于紧密,箱体之间缝隙过窄,将会造成边

    缘检测时无法检测出轮廓,或者检测出过多错误边缘的情况存在。对于独立箱体分割,本文提

    出了一种全新的独立箱体搜索提取方法。

    1

    实现过程

    模板匹配是在一幅图像中寻找一个特定目标的方法之一,这种方法的原理非常简单,遍历

    图像中的每一个可能的位置,比较各处与模板是否

    相似

    ,当相似度足够高时,就认为找到了

    我们的目标。以模板匹配为基础,结合一定的循环算法,便可实现多模板多目标的检测和分

    割。模板匹配实现函数为:

    matchTemplate

    (

    g_srcImage

    g_templateImage

    g_resultImage1

    g_nMatchMethod

    );

    更多相关内容
  • 多目标模板匹配

    2018-11-10 10:34:40
    这个程序代码是关于单模板,在目标上进行模板匹配识别,基于MATLAB语言架构进行的程序编写。
  • halcon 对于多目标模板匹配 (基于形状的模板匹配方法) 通过该方法可对零件进行模板提取 进而对其进行模板匹配
  • 多目标模板匹配.rar

    2020-05-22 12:00:31
    使用vs和opencv编写的多目标模板匹配代码,可以再图片中查找个匹配目标模板的位置。模板匹配是一种最原始、最基本的模式识别方法,研究某一特定对象物的图案位于图像的什么地方,进而识别对象物,这就是一个匹配...
  • OpenCv多目标模板匹配

    2020-12-15 12:42:09
    具体思路如下:首先,通过cvMatchTemplate模板进行匹配匹配完成之后会产生一张结果单通道的灰色图像,再利用cvMinMaxLoc函数查找数组中全局最小值。每次最小值肯定只有一个,所以需要把每次找到的最小值(数组区域...

    具体思路如下:首先,通过cvMatchTemplate模板进行匹配,匹配完成之后会产生一张结果单通道的灰色图像,再利用cvMinMaxLoc函数查找数组中全局最小值。每次最小值肯定只有一个,所以需要把每次找到的最小值(数组区域处理其它值,本文处理为最大值,也就是匹配最不像的值),这样就可以继续查找全局接剩余较小的区域了。

    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;

    }

    for(int y = startY; y < endY; y++)

    for(int 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:/src.jpg");

    IplImage *templat = cvLoadImage("E:/template.jpg");

    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(src, minLoc, cvPoint(minLoc.x + templatW, minLoc.y+ templatH), cvScalar(0,0,255));

    CvPoint new_minLoc;

    // 计算下一个最小值

    new_minLoc = getNextMinLoc(result, minLoc, maxValue, templatW, templatH);

    cvRectangle(src, new_minLoc, cvPoint(new_minLoc.x + templatW, new_minLoc.y+ templatH), cvScalar(0,0,255));

    cvNamedWindow("srcResult", 1);

    cvNamedWindow("templat", 1);

    cvShowImage("srcResult", src);

    cvShowImage("templat", templat);

    cvWaitKey(0);

    cvReleaseImage(&result);

    cvReleaseImage(&templat);

    cvReleaseImage(&src);

    return 0;

    }

    展开全文
  • 可以批量匹配单图中目标 import cv2 from skimage import transform from matplotlib import pyplot as plt import numpy as np import glob,os from skimage import io,morphology,color,transform def ...

    可以批量匹配文件夹下单图中多个目标

    1、准备好模板图和要裁剪的子图

    目录中template.png表示用于匹配的模板图,其余jpg后缀的图片是用于匹配的图

     2、运行以下代码,裁剪目标

    import cv2
    from skimage import transform
    from matplotlib import pyplot as plt
    import numpy as np
    import glob,os
    from skimage import io,morphology,color,transform
    def calculate_IoU(predicted_bound, ground_truth_bound):
        pxmin, pymin, pxmax, pymax = predicted_bound
        gxmin, gymin, gxmax, gymax = ground_truth_bound
     
        parea = (pxmax - pxmin) * (pymax - pymin)  # 计算P的面积
        garea = (gxmax - gxmin) * (gymax - gymin)  # 计算G的面积
     
        # 求相交矩形的左下和右上顶点坐标(xmin, ymin, xmax, ymax)
        xmin = max(pxmin, gxmin)  # 得到左下顶点的横坐标
        ymin = max(pymin, gymin
    展开全文
  • 目标数字进行模板匹配,已打包数字模板和目标样本。小程序很实用,可在基础上加算法,实测C++,opencv2.4.9下运行无误。
  • 使用一张图像对Halcon模板匹配算子进行实例测试:单模板和多模板匹配
  • 通过聚类对模板多目标匹配匹配框进行过滤,每个目标只保留一个最优的匹配框。

    模板匹配场景:

    实现多目标匹配:
    为了实现多目标匹配,我选用opencv和sklearn两个库中的模板匹配和聚类算法来实现。


    问题描述:

    在进行多目标匹配是,同一匹配区域内,会出现多个冗余的框:

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn import cluster
    
    # 读取图片和模板
    img_rgb = cv2.imread('d:/opencvData/lena2.png')
    img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)#转换成灰度图片
    template = cv2.imread('d:/opencvData/face.png',0)
    h,w = template.shape[:2]
    
    # 进行模板匹配,方法采用的归一化相关系数
    res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
    
    # 设置置信度阈值
    threshold = 0.9
    # 取匹配程度大于90%的坐标
    loc = np.argwhere(res>=threshold)
    
    # 显示匹配框,并用圆圈标记左上角点
    for pt in loc[,::-1]:      # 图片和数组的x对应列,y对应行,所以需要前后交换坐标
        bottom_right = (pt[0]+w,pt[1]+h)
        cv2.rectangle(img_rgb,pt,bottom_right,(0,0,255),2)
        cv2.circle(img_rgb,pt,5,(255,255,255),2)
    
    #显示图像
    cv2.imshow('img_rgb',img_rgb)
    cv2.waitKey(0)
    

    在这里插入图片描述


    原因分析:

    因为筛选的方法是通过设置阈值,而满足设置的阈值会有多个备选框。而单目标匹配的时候,是选择最大值,它只产生一个备选框。


    解决方案:

    借助单目标检测的思路,也只选置信度最大值的那个框。
    不同点在于如果全图范围只选一个最大置信度,那么会只保留一个匹配框,这与我们的多目标匹配的目标不一致。
    为了解决这个问题,我们引进来了聚类算法,先进行聚类运算完成分区,然后在每个区中,选择置信度最大的。
    选择聚类算法时,我们不知道究竟会有多少个可以匹配的对象,需要聚类算法自己计算有多少个,为了达到这个目的,我使用了近邻传播算法。
    代码如下:

    def filterRec(res,loc,draw=False):
        #对同一对象的多个框按位置聚类后,按置信度选最大的一个进行保留。
        #res是cv2.matchTemplate返回值
        #loc是cv2.np.argwhere(res>threshold)返回值
        #draw 是否进行画图显示
        #返回保留的点的列表pts
    
        #进行聚类分析-近邻传播算法
        model=cluster.AffinityPropagation(damping=0.5,max_iter=500,convergence_iter=30,
                                          preference=-50).fit(loc)
        y_pred=model.labels_
       
        if draw:
            # 画图显示样本数据分类情况
            plt.title('AffinityPropagation',fontsize=16)
            plt.scatter(loc[:,0],loc[:,1],s=20,c=y_pred,cmap='brg',label='Samples')
            plt.legend()
            plt.show()
    
        pts = []
        # 使用循环函数提取每个区域
        for i in set(y_pred):
            argj = loc[y_pred==i]
            argi = argj.T
            # 下面需要注意数组切片操作时,索引需要时tuple格式,
            # 如果是numpy.array格式会报错。
            # 选择置信度最大的点的坐标,注意这时的格式是[行,列]
            # 输出图片中的坐标时需要转换成[x,y],用的方法是pt[::-1]
            pt = argj[np.argmax(res[tuple(argi)])]
            # 每一区域保留一个选框的左上角坐标
            pts.append(pt[::-1])
        return pts
    

    使用这个方法之后的效果
    在这里插入图片描述

    完整代码

    import cv2
    import matplotlib.pyplot as plt
    import numpy as np
    from sklearn import cluster
    
    # 读取图片和模板
    img_rgb = cv2.imread('d:/opencvData/lena2.png')
    img_gray = cv2.cvtColor(img_rgb,cv2.COLOR_BGR2GRAY)#转换成灰度图片
    template = cv2.imread('d:/opencvData/face.png',0)
    h,w = template.shape[:2]
    
    # 进行模板匹配,方法采用的归一化相关系数
    res = cv2.matchTemplate(img_gray,template,cv2.TM_CCOEFF_NORMED)
    
    # 设置置信度阈值
    threshold = 0.9
    # 取匹配程度大于90%的坐标
    loc = np.argwhere(res>=threshold)
    
    def filterRec(res,loc,draw=False):
        #对同一对象的多个框按位置聚类后,按置信度选最大的一个进行保留。
        #res是cv2.matchTemplate返回值
        #loc是cv2.np.argwhere(res>threshold)返回值
        #draw 是否进行画图显示
        #返回保留的点的列表pts
    
        #进行聚类分析-近邻传播算法
        model=cluster.AffinityPropagation(damping=0.5,max_iter=500,convergence_iter=30,
                                          preference=-50).fit(loc)
        y_pred=model.labels_
       
        if draw:
            # 画图显示样本数据分类情况
            plt.title('AffinityPropagation',fontsize=16)
            plt.scatter(loc[:,0],loc[:,1],s=20,c=y_pred,cmap='brg',label='Samples')
            plt.legend()
            plt.show()
    
        pts = []
        # 使用循环函数提取每个区域
        for i in set(y_pred):
            argj = loc[y_pred==i]
            argi = argj.T
            # 下面需要注意数组切片操作时,索引需要时tuple格式,
            # 如果是numpy.array格式会报错。
            # 选择置信度最大的点的坐标,注意这时的格式是[行,列]
            # 输出图片中的坐标时需要转换成[x,y],用的方法是pt[::-1]
            pt = argj[np.argmax(res[tuple(argi)])]
            # 每一区域保留一个选框的左上角坐标
            pts.append(pt[::-1])
        return pts
    
    # 对匹配框进行过滤
    pts = filterRec(res,loc)
    # 显示匹配框,并用圆圈标记左上角点
    for pt in pts:      # 图片和数组的x对应列,y对应行,所以需要前后交换坐标
        bottom_right = (pt[0]+w,pt[1]+h)
        cv2.rectangle(img_rgb,pt,bottom_right,(0,0,255),2)
        cv2.circle(img_rgb,pt,5,(255,255,255),2)
    
    #显示图像
    cv2.imshow('img_rgb',img_rgb)
    cv2.waitKey(0)
    

    原始图片
    在这里插入图片描述

    face

    展开全文
  • 基于opencv3.0的多目标模板匹配的关键步骤备忘?!

    千次阅读 热门讨论 2018-01-17 11:43:59
    首先,本人不是专业写代码的,因此说的不对的地方,请各位大神指教!一定要说啊。  对于非标自动化设备行业,利用工业相机做...目标是找出目标图中所有的“2”,并确定旋转角度,精度只能到1°了!!!再高的精度还没
  • 基于OpenCV多目标模板匹配算法

    热门讨论 2013-11-26 11:00:20
    基于OpenCV多目标模板匹配算法,可以从一副大图像中搜索出与模板相似的目标区域...
  • 关于OpenCv的模板匹配函数matchTemplate,这些地方都讲得都比较清楚,但我第一天看,还没没看到在C#上实现的,所以只能一步步写,函数定义,模仿,解决报错。 友情链接: OpenCV模板匹配函数matchTemplate...
  • 基于opencv的多目标模板匹配

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

    千次阅读 2016-10-17 22:19:21
    模板匹配,顾名思义,需要一个模板。然后在图像中寻找与模板能匹配得上的区域。Halcon中,基于灰度值的模板匹配的算法中,算法的基本原理比较简单,就是简单的灰度比对。
  • 用金字塔模型实现的快速模板匹配算法,可以一次检测目标,而且非常快,非常不错的模板匹配算法,附上源码和例子,亲测可用!
  • 模板匹配-多目标匹配

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

    热门讨论 2012-04-22 16:24:03
    opencv,多模板匹配,从图像库匹配。
  • 通过使用opencv,使用python语言实现图像模板匹配,从而实现图像的类别分类。
  • 1、单模板单目标多目标匹配 2、模板,多目标匹配 3、通过OpenCV模板匹配方法,实现图片的匹配功能 4、相关系数匹配,最小平方差匹配 5、matchTemplate
  • VS2017创建的工程,利用Emgu.CV实现了一个简单的单模板多目标匹配,在大图中准确地找出所有小图的位置并返回坐标,工程由于包含了完整的Emgu.cv库所以比较大
  • 模板匹配多目标

    热门讨论 2013-03-21 16:41:55
    基于opencv的多目标模板匹配,对车牌识别等有一定的借鉴作用
  • opencv通过阈值使用matchTemplate实现多目标匹配
  • 基于目标轮廓的图像匹配,首先...能够抗一定的光照影响,遮挡影响,耗时比传统图像的模板匹配快。如果需要旋转角度的话,可以使用二分法或者每隔一定角度重复调用。 该代码是基于opencv2的,可以很方便的修改成opencv3
  • OpenCV多模板匹配

    2021-05-11 15:14:35
    多模板匹配 在上一篇文章中,我们学会了模板匹配,我们在输入图像lena 依旧是模板匹配的前面基础操作: 注:
  • [python-opencv]模板匹配

    2021-02-09 04:54:15
    模板匹配最适用于工业场合(在一张...模板匹配具有自身的局限性,主要表现在它只能进行平行移动,若原图像中的匹配目标发生旋转或大小变化,该算法无效。简单来说,模板匹配就是在整个图像区域发现与给定子图像匹配...
  • 一、多模板匹配 在实际生活中,要搜索的模板图像很有可能在图像中出现多次,这个时候就需要多次匹配结果,上文提到的函数cv2.minMaxLoc()只能找到最值及位置,无法匹配多个信息,因此设计过程进行多次匹配。 二、...
  • 基于极坐标模板匹配目标识别
  • 基于形状的模板匹配在我们实际的项目中应用最广,同时在一些项目中,光是选中一个目标作为匹配的模板,效果可能还达不到我们所需要的精度要求,所以这个时候可以考虑多模板匹配,增加限制 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 92,082
精华内容 36,832
关键字:

多目标的模板匹配