C# OpenCV机器视觉:利用CNN实现快速模板匹配

在一个阳光灿烂的周末,阿强正瘫在沙发上,百无聊赖地换着电视频道。突然,一则新闻吸引了他的注意:某博物馆里一幅珍贵的古画离奇失踪,警方怀疑是被一伙狡猾的盗贼偷走了,现场只留下一些模糊不清的监控画面,根本无法确定盗贼的行踪。阿强看着电视里那一团乱麻的线索,眼睛突然一亮,心中涌起一股热血:“要是我能帮警方找到盗贼,那可就太酷了!说不定还能得到博物馆的巨额悬赏,从此走上人生巅峰呢!”

说干就干,阿强立马冲进他那堆满各种电子设备和书籍的 “秘密基地”。他一边翻箱倒柜,一边嘴里嘟囔着:“我就不信了,凭我这一身的科技本领,还找不到几个毛贼!” 就在这时,他的目光落在了一台布满灰尘的电脑上,脑海中突然闪过一个念头:“对了!我可以用 OpenCvSharp 结合 CNN 来进行模板匹配,从监控画面里找出盗贼的蛛丝马迹!”

第一章:神秘的 CNN—— 图像世界的 “超级侦探”
阿强深知,要想在这复杂的图像世界里找到盗贼的线索,CNN(卷积神经网络)可是他的秘密武器。但这个 CNN 到底是何方神圣呢?阿强决定给它编一个神秘的故事,好让自己更有干劲。

“传说中,CNN 是图像世界里的一位超级侦探,它有着一双无比锐利的眼睛,能看穿图像里隐藏的所有秘密。” 阿强一边对着空气比划,一边眉飞色舞地说道,“它的大脑里装满了各种神奇的算法,就像一个藏满了魔法道具的宝库。当它面对一张图像时,就会施展它的魔法,把图像里的各种特征都提取出来,然后和它记忆中的模板进行比对,不管是多么微小的细节,都逃不过它的法眼。”

阿强越说越兴奋,仿佛自己已经成为了 CNN 的主人,带着它在图像世界里大杀四方:“比如说,我们要找一个特定的图案,CNN 就会像一个不知疲倦的寻宝者,在图像的每一个角落仔细搜寻。它会用它的魔法卷积核,一层一层地扫描图像,就像在给图像做一次深度按摩,把那些隐藏在

#模板匹配 import cv2 as cv import numpy as np def template_demo(): dog = cv.imread("E:/opencv/picture/dog.jpg") dog_nose = cv.imread("E:/opencv/picture/nose.jpg") cv.imshow("dog",dog) result = cv.matchTemplate(dog,dog_nose,cv.TM_CCORR_NORMED) h,w =dog_nose.shape[:2] min_val,max_val,min_loc,max_loc=cv.minMaxLoc(result) pt1 = max_loc pt2 = (pt1[0]+w,pt1[1]+h) cv.rectangle(dog,pt1,pt2,(0,255,0),2) cv.imshow("match",dog) print(result) #src = cv.imread("E:/opencv/picture/dog.jpg") #cv.imshow("inital_window",src) template_demo() cv.waitKey(0) cv.destroyAllWindows() 分析: 模板匹配通常用于目标检测。本文我们检测狗图片的鼻子。 • 我们需要两个主要组件: 1. 源图像(I):我们期望找到与模板图像匹配的图像 2. 模板图像(T):将与模板图像进行比较的补丁图像 1. result = cv.matchTemplate(dog,dog_nose,cv.TM_CCORR_NORMED) void cv::matchTemplate( cv::InputArray image, // 待匹配图像W*H cv::InputArray templ, // 模板图像,和image类型相同, 大小 w*h cv::OutputArray result, // 匹配结果图像, 类型 32F, 大小 (W-w+1)*(H-h+1) int method // 用于比较的方法 ); 其中method有: TM_SQDIFF_NORMED匹配数值越低表示匹配效果越好 TM_CCORR_NORMED,TM_CCOEFF_NORMED匹配数值越大表示匹配效果越好 result参数:(保存各个点匹配结果的参数) 模板匹配函数cvMatchTemplate依次计算模板与待测图片的重叠区域的相似度,并将结果存入映射图像result当中,也就是说result图像中的每一个点的值代表了一次相似度比较结果 模板在待测图像上每次在横向或是纵向上移动一个像素,并作一次比较计算 我们可以通过cv.minMaxLoc函数来确定结果矩阵的最大值和最小值的位置。 2. cv.minMaxLoc(result) 返回result数值中最小值以及最小值所在的位置和最大值以及最大值所在的位置。 3. 当知道哪个点匹配度最高时这个时候我们需要用矩阵把模板给标出来 C++: void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0) 第一个参数:要在哪个图像上画? 第二个参数:矩阵的左上角点坐标 第三个参数:矩阵的右下角点坐标 第四个参数:颜色
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pchmi

你的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值