0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

手写图像模板匹配算法在OpenCV中的实现

OpenCV学堂 来源:OpenCV学堂 2024-11-11 10:12 次阅读

OpenCV中的模板匹配

OpenCV中的模板匹配是支持基于NCC相似度查找的,但是不是很好用,一个主要的原因是查找最大阈值,只能匹配一个,自己比对阈值,又导致无法正确设定阈值范围,所以问题很多。于是我重新写了纯Python版本的NCC图像模板匹配的代码实现了一个Python版本的,简单易用,支持多尺度,跟多进程并行!

主要思想

主要是基于NCC实现的像素相似度计算,这个OpenCV官方的模板匹配也有这中方式像素相似度计算支持,它的公式描述如下:

b454650e-904d-11ef-a511-92fbcf53809c.png

就是参照这个公式,然后基于OpenCV提供的积分图计算函数,实现了NCC相似度比较计算,值在0~1之间,1表示完全相似,0表示完全不相似。

代码实现

我把整个部分搞成了一个类,调用的方法主要是run_match,就可以直接运行,完成模板匹配。大体的功能跟OpenCV实现的模板匹配功能比较相似,改进的地方就是比较方便的实现多个对象匹配的直接输出Box框。该类完整的代码实现如下:

importcv2ascv
importnumpyasnp
importtime
importconcurrent.futures

classNCCTemplateMatch:
def__init__(self,ref_imgs,target_imgs,scores,tpl_sums,tpl_sqr_sums,target_sums,target_sqr_sums):
self.ref_imgs=ref_imgs
self.target_imgs=target_imgs
self.scores=scores
self.tpls_sums=tpl_sums
self.tpls_sqsums=tpl_sqr_sums
self.target_sums=target_sums
self.target_sqsums=target_sqr_sums
self.nms_boxes=[]

defrun_match(self):
num_ps=min(6,len(self.ref_imgs))
#print("num_ps:",num_ps)
start=time.perf_counter()
withconcurrent.futures.ProcessPoolExecutor(num_ps)asexecutor:
matched=executor.map(self.ncc_run,self.ref_imgs,self.target_imgs,self.tpls_sums,self.tpls_sqsums,self.target_sums,self.target_sqsums,self.scores)
self.nms_boxes=list(matched)
end=time.perf_counter()
print(f'Finishedin{round(end-start,2)}seconds')

defncc_run(self,tpl_gray,target_gray,tpl_sum,tpl_sqsum,target_sum,target_sqsum,score):
print("runonce~~~~")
th,tw=tpl_gray.shape
min_step=max(1,min(th//16,tw//16))
h,w=target_gray.shape
sr=1/(th*tw)
t_s1=tpl_sum[th,tw]
t_s1_2=t_s1*t_s1*sr
t_s1_1=t_s1*sr
t_s2=tpl_sqsum[th,tw]
sum_t=np.sqrt(t_s2-t_s1_2)
row=0
boxes=[]
confidences=[]
whilerow< (h - th+1):
            col = 0
            while col < (w - tw+1):
                s1 = self.get_block_sum(target_sum, col, row, col + tw, row + th)
                s2 = self.get_block_sum(target_sqsum, col, row, col + tw, row + th)
                sum1 = t_s1_1 * s1
                ss_sqr = s2 - s1 * s1 * sr
                if ss_sqr < 0:  # fix issue, 精度问题
                    ss_sqr = 0.0
                sum2 = sum_t * np.sqrt(ss_sqr)
                sum3 = np.sum(np.multiply(tpl_gray, target_gray[row:row + th, col:col + tw]))
                if sum2 == 0.0:
                    ncc = 0.0
                else:
                    ncc = (sum3 - sum1) / sum2
                if ncc >score:
boxes.append([col,row,tw,th])
confidences.append(float(ncc))
col+=tw//2
else:
col+=min_step
row+=min_step

#NMSProcess
nms_indices=cv.dnn.NMSBoxes(boxes,confidences,0.5,0.5)
det_boxes=[]
print(nms_indices)
foriinrange(len(nms_indices)):
rect_box=boxes[nms_indices[i]]
det_boxes.append(rect_box)
returndet_boxes

defget_block_sum(self,integal_img,x1,y1,x2,y2):
t1=integal_img[y1,x1]
t2=integal_img[y1,x2]
t3=integal_img[y2,x1]
t4=integal_img[y2,x2]
s=t4-t2-t3+t1
returns
相关的测试与调用代码如下:
print("testncc......")
tpl_image=cv.imread("D:/images/llk_tpl.png")
target_image=cv.imread("D:/images/llk.jpg")

tpl_gray=cv.cvtColor(tpl_image,cv.COLOR_BGR2GRAY)
target_gray=cv.cvtColor(target_image,cv.COLOR_BGR2GRAY)
tpl_gray=np.float32(tpl_gray/255.0)
target_gray=np.float32(target_gray/255.0)
tpl_sum,tpl_sqsum=cv.integral2(tpl_gray)
t_sum,t_sqsum=cv.integral2(target_gray)
matcher=NCCTemplateMatch([tpl_gray],[target_gray],[0.85],
[tpl_sum],[tpl_sqsum],[t_sum],[t_sqsum])
matcher.run_match()
forrect_boxinmatcher.nms_boxes[0]:
cv.rectangle(target_image,(rect_box[0],rect_box[1]),
(rect_box[0]+rect_box[2],rect_box[1]+rect_box[3]),(0,0,255),2,8,0)
cv.imshow("result",target_image)
cv.waitKey(0)
cv.destroyAllWindows()
模板图像:

b46f91a8-904d-11ef-a511-92fbcf53809c.png

运行结果如下:

b4867990-904d-11ef-a511-92fbcf53809c.png

b4a731da-904d-11ef-a511-92fbcf53809c.png

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4604

    浏览量

    92710
  • 图像
    +关注

    关注

    2

    文章

    1083

    浏览量

    40431
  • OpenCV
    +关注

    关注

    30

    文章

    629

    浏览量

    41295

原文标题:只用半小时 | OpenCV手写图像模板匹配算法

文章出处:【微信号:CVSCHOOL,微信公众号:OpenCV学堂】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    什么是模板匹配模板匹配的原理讲解 图像处理与模板匹配算法

    一:什么是模板匹配OpenCV教程这样解释模板匹配
    的头像 发表于 05-05 09:25 3.4w次阅读
    什么是<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>?<b class='flag-5'>模板</b><b class='flag-5'>匹配</b>的原理讲解 <b class='flag-5'>图像</b>处理与<b class='flag-5'>模板</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>

    基于QT+OpenCv的目标跟踪算法实现

    目标跟踪算法作为一种有着非常广泛的应用的算法航空航天、智能交通、智能设备等领域有着非常广泛的应用。本系列博客将教大家410c开发板上基于linux操作系统环境,采用QT+
    发表于 09-21 10:42

    【触觉智能 Purple Pi OH 开发板体验】四、(Ubuntu)OpenCV手写数字识别

    ]#===============计算最佳匹配值及模板序号======================# matchValue用于存储所有匹配值matchValue = []# 从images
    发表于 09-18 14:01

    基于HALCON的模板匹配方法总结

    一篇《基于HDevelop地形状匹配算法参数地优化研究》文章,总结了形状匹配过程哪些参数影响到模板
    发表于 09-19 06:13

    openCV的库自带了模板匹配算法吗?

    openCV的库自带了模板匹配算法
    发表于 10-10 06:48

    手写数字识别的模板匹配方法源程序

    手写数字识别的模板匹配
    发表于 01-02 19:43 73次下载

    基于模板匹配图像跟踪技术

    为了解决传统模板匹配方法跟踪图像时遇到的问题,提出了在跟踪过程采用变模板匹配的方法。该方法较好
    发表于 12-20 17:01 0次下载

    模板匹配

    OpenCV3编程入门》书本配套源代码:模板匹配
    发表于 06-06 15:39 5次下载

    OpenCV3编程入门-源码例程全集-模板匹配

    OpenCV3编程入门-源码例程全集-模板匹配
    发表于 09-17 22:55 4次下载

    基于轮廓曲线的图像匹配算法

    为了提高一键式检测图像匹配精度和速度,提出一种基于轮廓曲线的快速高精度图像配准算法:根据定义的图像
    发表于 11-02 10:47 5次下载
    基于轮廓曲线的<b class='flag-5'>图像</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>

    基于DSP和模板匹配算法的实时图像跟踪处理系统的优化设计

    本文详细介绍了基于高性能TigerSHARC DSP 处理模块和模板匹配算法(templatematching)的实时图像跟踪处理系统的优化设计方法;深入分析了SAD 操作
    发表于 05-11 12:01 1645次阅读
    基于DSP和<b class='flag-5'>模板</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>的实时<b class='flag-5'>图像</b>跟踪处理系统的优化设计

    OpenMV如何实现旋转模板匹配

    OpenCV模板匹配不支持旋转角度、不支持多尺度跟多对象模板匹配,同时
    的头像 发表于 01-14 10:21 1847次阅读

    手把手教你使用LabVIEW OpenCV DNN实现手写数字识别(含源码)

    LabVIEW如何使用OpenCV DNN模块实现手写数字识别
    的头像 发表于 03-08 16:10 1679次阅读

    模板匹配算法的改进及自动发牌机的应用

    电子发烧友网站提供《模板匹配算法的改进及自动发牌机的应用.pdf》资料免费下载
    发表于 11-08 09:53 0次下载
    <b class='flag-5'>模板</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>的改进及<b class='flag-5'>在</b>自动发牌机<b class='flag-5'>中</b>的应用

    OpenCV边缘模板匹配算法原理详解

    ,悲喜交加,充分感受到了理想与现实的距离,不过没关系,这里介绍一种新的模板匹配算法,主要是基于图像边缘梯度,它对图像光照与像素迁移都有很强的
    的头像 发表于 12-07 10:56 1336次阅读
    <b class='flag-5'>OpenCV</b>边缘<b class='flag-5'>模板</b><b class='flag-5'>匹配</b><b class='flag-5'>算法</b>原理详解