OpenCv单模版多目标匹配
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.cv2.matchTemplate(进行模板匹配) 2.cv2.minMaxLoc(找出矩阵最大值和最小值的位置(x,y)) 3.cv2.rectangle(在图像上画矩形)
1. cv2.matchTemplate(src, template, method) # 用于进行模板匹配 参数说明: src目标图像, template模板,method使用什么指标做模板的匹配 ...
- OpenCV 学习笔记(模板匹配)
OpenCV 学习笔记(模板匹配) 模板匹配是在一幅图像中寻找一个特定目标的方法之一.这种方法的原理非常简单,遍历图像中的每一个可能的位置,比较各处与模板是否"相似",当相似度足够 ...
- Opencv Sift算子特征提取与匹配
SIFT算法的过程实质是在不同尺度空间上查找特征点(关键点),用128维方向向量的方式对特征点进行描述,最后通过对比描述向量实现目标匹配. 概括起来主要有三大步骤: 1.提取关键点: 2.对关键点附加 ...
- Unity-Animator深入系列---目标匹配Target Matching
回到 Animator深入系列总目录 一开始会理所当然的觉得,匹配是这样的: 但结果却是这样的(右边的Cube是匹配目标): 感觉这个接口应该是专门为攀爬之类的动画准备的,属于被动匹配位置,移动整个对 ...
- Makefile:1: *** 多个目标匹配。 停止。
以下是我自己写的Makefile 文件: .SUFFIXES:.c .o CC = gcc SRCS = stat.c OBJS = $(SRCS:.c=.o) EXEC = test start:$ ...
- opencv 单目标模板匹配(只适用于模板与目标尺度相同)
#include <iostream> #include "opencv/cv.h" #include "opencv/cxcore.h" #inc ...
- OpenCV 学习笔记 07 目标检测与识别
目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...
- 【图像处理】基于OpenCV底层实现的直方图匹配
image processing 系列: [图像处理]图片旋转 [图像处理]高斯滤波.中值滤波.均值滤波 直方图匹配算法.又称直方图规定化.简单说.就是依据某函数.或者另外一张图片的引导,使得原图改变 ...
- opencv单目摄像机标定(一)
#include <string> #include <iostream> #include <cv.h> #include <highgui.h> u ...
- 基于OpenCV单目相机的快速标定--源码、工程、实现过程
相机的标定是所有人走进视觉世界需要做的第一件事,辣么多的视觉标定原理解释你可以随便在网上找到,这里只讲到底如何去实现,也算是给刚入门的朋友做个简单的分享. 1.单目相机标定的工程源码 首先请到同性交友 ...
随机推荐
- typora基础语法
Markdown学习 标题 三级标题 #加空格加你要的文字 字体 加粗 hello world!(前后两个**) hello world!(前后一个**) hello world!(前后三个***) ...
- 使用阿里云镜像安装tensorflow
pip --default-timeout=1000 install --index-url https://mirrors.aliyun.com/pypi/simple tensorflow pip ...
- vim的visual模式和列编辑
有三种方式进入visual模式: 1> 在普通模式下输入v(小写),底部提示信息为VISUAL,编辑粒度为字符 通过方向键或者HJKL调整选择的字符范围. 输入d,删除选中字符: 输入y,复制当 ...
- xcodeproj Building for iOS, but the linked and embedded framework ‘xxx.framework’ was built for iOS + iOS Simulator.
一.报错 报错内容大致如下 /xxxx/xxx.xcodeproj Building for iOS, but the linked and embedded framework 'xxx.frame ...
- python实例1(石头 剪刀 布)
#random .randint 模块导入 import random #定义一个用户需要输入的数据内容入口 user = int(input("请输入(石头1,剪刀2,布3 ...
- DASCTF NOV X联合出题人-PWN
太忙了,下午4点才开始做,,剩下的以后补上 签个到 逻辑很简单两个功能的堆,一个就是申请heap.还有一个是检验如果校验通过就会得到flag 申请模块 中间0x886是个很恶心的东西,需要我们绕过 ...
- [Mac技巧] 你真的会使用Mac的“聚焦搜索”吗?
Mac的"聚焦搜索"是对Mac整个磁盘的全局搜索,搜索起来极其便捷,但也常被使用者忽略使用. 以下列出比较常用的几个场景供使用者参考 场景一:文件在哪儿,要立即查看? 1.打开&q ...
- 21206134-赵景涛-第三次blog总结
一.前言: 本次Blog是对之前发布的PTA题目集的总结性Blog,这几次的作业题量,难度都不大,但都趋近于完成一整个系统,而非只实现部分的功能.题目集九.十也不在给出类图,而是要求自己设计.我认为这 ...
- 【picoCTF】GET aHEADwrite up
打开链接,页面如下: 这道题我试了两种解法,大家都可以看看哦! 一.burpsuit拦截 1.点击bule,打开burpsuit拦截(记得打开intercept哦) 2.将 POST 请求更改为 HE ...
- spring-service.xml
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...