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. JS刷题自制参考知识

    (建议复制到本地,需要看的时候打开Typora,大纲点击要查的内容即可,我一般记不清某个方法的时候就查一下.) 基础 Typescript TypeScript是一个开源的.渐进式包含类型的JavaS ...

  2. Charles笔记

    Charles 预览模式 Structure 以域名对请求进行分组,可以很方便地预览同一域名下的请求数据,也方便于日常开发中对某一服务接口的分析和处理 Sequence Sequence以时间顺序显示 ...

  3. redis启动报错(TCP backlog setting of 511/overcommit_memory is set to 0/THP)

    WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is s ...

  4. QT网络编程【二】【Socket】

    1.QT中添加socket 库的相关操作 2.正常c++11 VS2019使用socket库的操作 3.winsock2 与 sys/socket.h的区别? 4.WinSock2 的基本操作? 详细 ...

  5. Windows10安装UR_RTDE

    ------------恢复内容开始------------ 要使用UR_RTDE必须先配置电脑环境,目前使用的环境是电脑win10,配置环境需要VS2019+boost1_66_0+cmake2.3 ...

  6. LVS简略介绍

    一.lvs是什么 LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器.这是一个由章文嵩博士发起的一个开源项目,它的官方网站是 http://www.linuxvir ...

  7. tensorflow出现Failed to get convolution algorithm, cuDNN failed to initialize

    网上大多的教程是说tensorflow的版本过高,或者说cuda和cudnn的版本不对,需要降级,但这样会很麻烦!!! 以下值得推荐!!! 解决方法一:在代码前加上下面的代码 from tensorf ...

  8. CentOS 7 时区设置 EST和CST设置

    1. https://blog.csdn.net/allway2/article/details/102995747 CentOS 7 时区设置# timedatectl status      Lo ...

  9. Java-14流Stream【创建一个简易for循环工具】

    Java-14流Stream 构造简易的循环取代for IntStream类提供了一个range()方法,可以生成一个流----由int值组成的序列 import static java.util.s ...

  10. 【故障公告】cc攻击又来了,雪上加霜的三月

    非常非常抱歉!今天 21:20-22:10 左右,肆无忌惮的 cc 攻击又来了,蓄意攻击者很厉害,躲过阿里云云盾的黑洞机制,轻松击垮园子的博客站点,又给大家带来了很大的麻烦,请大家谅解! 今年3月是园 ...