OpenCv单模版多目标匹配

单模版匹配出现的问题

一、

关于单模版匹配,我一开始用的是光线较暗的图,结果根据模版匹配到的位置并不正确。

我后来想用阈值把图形的特征提取出来,在把模版的特征和原图的特征进行比较,如下:

import cv2
img = cv2.imread('/Users/duanhao/Desktop/photo/liukun.jpg')
lk = cv2.imread('/Users/duanhao/Desktop/photo/lk_all.png')
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 灰度
lk_gray = cv2.cvtColor(lk, cv2.COLOR_BGR2GRAY)
new_img = cv2.adaptiveThreshold(img_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 3)
new_temple = cv2.adaptiveThreshold(lk_gray, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 3)
# # cv2.imshow('1', new_img)
# # cv2.imshow('2', new_temple)
height, weight, c = lk.shape
result = cv2.matchTemplate(img, lk , cv2.TM_SQDIFF_NORMED) # 标准平均差匹配
minValue, maxValue, minLocal, maxLocal = cv2.minMaxLoc(result)
local1 = minLocal
local2 = (local1[0] + weight, local1[1] + height)
cv2.rectangle(img, local1, local2, (0, 0, 255), 2)
cv2.imshow('data', img)
cv2.waitKey()
cv2.destroyAllWindows()

可是效果依旧不行,还不如原来不调整的图像,这算是我走过的第一条弯路。

二、

cv2里面有一个参数minMaxLoc函数可以提取出匹配样本result的最小值、最大值、最小值的坐标、最大值的坐标。这里坐标(x, y),x对应的是数组的column列,y对应的是数组的rows行,也就是(columns, rows),而cv2里的shape返回的是(rows, columns,channel),不要弄错了。所以在绘制边框的时候是:

height, weight, c = temple.shape
minValue, maxValue, minLocal, maxLocal = cv2.minMaxLoc(result)
local1 = minLocal
local2 = (local1[0] + weight, local1[1] + height)

三、

第一次我需要匹配的图像和模型光线太暗了,所以我在网上找了一个清晰且光线好的图像进行匹配。代码如下:

import cv2
img = cv2.imread('/Users/duanhao/Desktop/photo/MatchDemo/beauty.png')
lk = cv2.imread('/Users/duanhao/Desktop/photo/MatchDemo/number1.png')
height, weight, c = lk.shape
result = cv2.matchTemplate(img, lk , cv2.TM_SQDIFF_NORMED) # 标准平均差匹配
minValue, maxValue, minLocal, maxLocal = cv2.minMaxLoc(result)
local1 = minLocal
local2 = (local1[0] + weight, local1[1] + height)
cv2.rectangle(img, local1, local2, (0, 0, 255), 2)
cv2.imshow('result', img)
cv2.waitKey()
cv2.destroyAllWindows()

一开始我选取的temple样图尺寸太小了,所以匹配到的内容也是不准确的。

后来我把temple样图的尺寸取大一点,就可以完美的匹配了!

绿色框是小样图匹配的结果,红色框是大样图匹配的结果,而我的样图正好和红色框的内容一致,算是匹配完美!所以以后需要匹配的样图尽量选尺寸大一点,特征明显一点的,这样方便匹配计算。

单模版多目标匹配

如果一张图片上,有很多相同特征的图片,如何去匹配多个目标,或者通过调节参数,找到唯一个符合要求的图片,把那些特征相同而不完全一致的图片筛除掉。

import cv2
img = cv2.imread('/Users/duanhao/Desktop/photo/MatchDemo/map.jpg')
temple = cv2.imread('/Users/duanhao/Desktop/photo/MatchDemo/flag.png')
height, weight, c = temple.shape
cnt = 0
result = cv2.matchTemplate(img, temple, cv2.TM_CCORR_NORMED)
for y in range(len(result)):
for x in range(len(result[y])):
if result[y][x] > 0.952:
cv2.rectangle(img, (x, y), (x + weight, y + height), (0, 0, 255, 2))
cv2.imshow('1', img)
cv2.imshow('2', temple)
cv2.waitKey()
cv2.destroyAllWindows()

需要注意的是x代表水平坐标,y代表垂直坐标。

通过调参数,框选出来的内容正是我截取做样图的部分。如果把参数再调小一点那其他标识也会被识别出来,所以多目标匹配相对灵活一点。

OpenCv单模版多目标匹配的更多相关文章

  1. 机器学习进阶-图像金字塔与轮廓检测-模板匹配(单目标匹配和多目标匹配)1.cv2.matchTemplate(进行模板匹配) 2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)

    1. cv2.matchTemplate(src, template, method)  # 用于进行模板匹配 参数说明: src目标图像, template模板,method使用什么指标做模板的匹配 ...

  2. OpenCV 学习笔记(模板匹配)

    OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...

  3. Opencv Sift算子特征提取与匹配

    SIFT算法的过程实质是在不同尺度空间上查找特征点(关键点),用128维方向向量的方式对特征点进行描述,最后通过对比描述向量实现目标匹配. 概括起来主要有三大步骤: 1.提取关键点: 2.对关键点附加 ...

  4. Unity-Animator深入系列---目标匹配Target Matching

    回到 Animator深入系列总目录 一开始会理所当然的觉得,匹配是这样的: 但结果却是这样的(右边的Cube是匹配目标): 感觉这个接口应该是专门为攀爬之类的动画准备的,属于被动匹配位置,移动整个对 ...

  5. Makefile:1: *** 多个目标匹配。 停止。

    以下是我自己写的Makefile 文件: .SUFFIXES:.c .o CC = gcc SRCS = stat.c OBJS = $(SRCS:.c=.o) EXEC = test start:$ ...

  6. opencv 单目标模板匹配(只适用于模板与目标尺度相同)

    #include <iostream> #include "opencv/cv.h" #include "opencv/cxcore.h" #inc ...

  7. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  8. 【图像处理】基于OpenCV底层实现的直方图匹配

    image processing 系列: [图像处理]图片旋转 [图像处理]高斯滤波.中值滤波.均值滤波 直方图匹配算法.又称直方图规定化.简单说.就是依据某函数.或者另外一张图片的引导,使得原图改变 ...

  9. opencv单目摄像机标定(一)

    #include <string> #include <iostream> #include <cv.h> #include <highgui.h> u ...

  10. 基于OpenCV单目相机的快速标定--源码、工程、实现过程

    相机的标定是所有人走进视觉世界需要做的第一件事,辣么多的视觉标定原理解释你可以随便在网上找到,这里只讲到底如何去实现,也算是给刚入门的朋友做个简单的分享. 1.单目相机标定的工程源码 首先请到同性交友 ...

随机推荐

  1. Markdown基础语法练习

    Markdown语法学习 标题 三级标题 四级标题 字体 hello,world! 两端各两个*****号 hello,world! 两端各一个*****号 hello,world! 两端各三个*** ...

  2. datax-web踩坑记录

    实习期间接触了两种ETL工具:kettle.datax 1.datax-web的安装 (跟着文档一步步来就好了) https://github.com/WeiYe-Jing/datax-web/blo ...

  3. 使用netty 实现本地代理程序

    本地代理程序1:将远程的服务设置为本地端口访问我的台式PC安装了vm,因为都是机器私有IP,但我的另外的PC电脑也需要访问方便测试,需要要把VM的端口设置在台式本机对外,这样我台式的端口对外在局域网都 ...

  4. tuxedo启动相关的知识

    tuxedo启动都要启动哪些服务? tuxedo常用命令有哪些? 参考链接: https://docs.oracle.com/cd/E13161_01/tuxedo/docs10gr3/rfcm/rf ...

  5. <context:component-scan/>和<mvc:annotation-driven/>的区别

    1 <context:annotation-config/> 如果你想使用@Autowired注解,那么就必须事先在 spring 容器中声明 AutowiredAnnotationBea ...

  6. RPA主流厂商有哪些?

    RPA(机器人流程自动化(Robotic Process Automation)是一种能够自动化基于规则.结构化和重复的业务流程的技术.机器人流程自动化降低了成本,同时防止了人为错误,该技术目前已应用 ...

  7. 再次打开Spring界面,多处报错

    分享一下经历 在我再次打开Srpring之后,打算解决一下"历史遗留问题",发现多处标红(挺崩溃的)! 就比如这句话,刚才就是不亮: 毕竟我上次的应用还是很顺利的,所以也就没有第一 ...

  8. arc145前三题

    为什么只有前三题呢...第四题想了一个小时没思路(主要是半个小时的时候发现看错题了),然后看粉兔博客发现要用Cantor集一类的神奇玩意,手贱看了E题发现还是线性基.于是就run了.NOIP前再学吧 ...

  9. ctfshow VIP限免题目(最新)

    源码泄露 这一题主要考察如何查看网页源代码,查看方式主要有三种 在网页前面加上view-source: 右键页面,点击查看页面源代码 键盘上按下F12打开开发者工具,在查看器中查看源代码 这一题随便一 ...

  10. 【公式编辑测试】生成函数常用性质及其他(普通生成函数指数生成函数Dirichlet生成函数)

    目录 定义 普通生成函数OGF 指数生成函数 EGF Dirichlet生成函数 Notation OGF OGF property some OGF instances EGF EGF proper ...