模版匹配
模版匹配是一种计算机视觉技术,用于图像或者视频中查找特定的模版或者对象,查找模版可以是数字或者是物体,技术通过在目标图像中寻找与模版图像相似的区域来实现匹配。这种技术最早起源在 20世纪70年代 的图像处理领域。
使用模版匹配通常需要提供,参考模版openmv自动进行匹配,匹配成功,就能识别。
归一化互相关 (Normalized Cross-Correlation, NCC)
NCC 是一种有效的匹配度量方法,通过计算模板图像和目标图像区域的相关性来确定相似度。NCC 可以减轻光照变化和对比度变化的影响,使匹配结果更好。
openmv使用的算法是NCC,这里有一个雷,这种匹配算法,对于相同匹配对象,大小跟角度要相似,与参考图片不同大小不同角度,不能识别。这种情况建议是,多生成几张不同角度,不同远近的相同对象的 .pgm 识别图片,作为参考。
使用模版匹配识别数字
插入SD卡
openmv的自带flash很小,只有111kB使用模版匹配数字,需要再U盘中保存,识别图片,这里图片要注意是 .pgm格式,自带flash很小保存不了几张图片,所以需要插入SD卡,openmv最大支持32G的内存卡。
保存参考图片
雷点,这里用来识别的图片一定要小,不然就会Region of interest is smaller than template!也就是提示,roi区域比模版图片小。
使用openmv开发IDE工具保存需要识别的图片,运行 helloworld.py文件。
上面运行之后,摄像头对准要识别的物体,不要动,关闭IDE中的连接按钮,这个时候会有张图片保存在IDE中的显示图像区域,这个时候左键截取出需要识别的图片,右键保存在openmvU盘中。
转换图片格式
这个时候将识别图片放到U盘之后,但是IDE保存图片的格式是bmp文件格式,这种图片格式不是需要的,需要的是pgm格式,借用下面网站将图片进行格式转换。
调用程序
保存了识别图片之后,这里在历程IDE中调用,模版匹配示例程序。
这里需要将,代码中识别图片路径改一下,改成自己的pgm图片路径。
路径的话,是对U盘的相对路径,改一下就好了。
改完之后,运行程序识别需要识别的物体,这里注意图片在摄像头中的大小和角度要与模版相似,看看识别效果。
注意事项
openmv在进行模版匹配的时候,模版图像的大小对性能和准确性有很大的影响,模版图像不应该超过图像分辨率的 1/4。
应该范围在 20*20到40*40之间,这种尺寸可以保证一定精度的同时,不会对计算机资源产生过大的压力。同时模版图像应该,包含明显特征方便在视频中进行有效匹配。在官方提供的历程里面,模版图像的大小要求限制在,32*32 pixel。
查看图像像素
这里在U盘里面,打开图像左上角可以看到图片的像素
在规定像素之内,然后就将bmp格式转换为pgm格式就可以了。
如何截取规定像素图片
sensor.set_windowing(0,0,32,32)
这里调用函数将IDE中window显示窗口,大小设置为32*32在窗口中截取,需要图片,像素规格也就只能是32*32。这样也就不用怕像素超标了。
运行模版匹配识别效果
前面有讲过,只有在图像中大小匹配,才能识别,这里还有一点只有在roi感兴趣区域,才能识别下面也会讲,调用识别的函数。
很鸡肋很鸡肋,有点拿远了识别不了,拿近了也不行,角度不对也不行,还得再roi区域内。
相关调用识别函数
image.find_template(template, threshold, [roi, step, search])
这个是openmv提供用来模版匹配的函数,在图像中搜索与给定模版匹配的区域,返回最佳匹配的位置,和得分。
函数参数讲解
template参数,模版图像,通常是一个较小的灰度图像,包含希望在图像中要找的对象
threshold参数, 类型为 float类型,参数取值范围在 0~1 之间,取值越大要求图像与模版匹配度越高,就越难识别,越小匹配度越低,就容易造成识别错误,通常取值在0.7~0.8之间。
roi参数,类型为元组默认取值为 roi = (10,0,60,60),用来设置感兴趣区域,识别图像不在感兴趣区域则不进行模版匹配 。格式为roi = (x ,y ,w ,h)
step参数,类型为int 步长参数,步长越大匹配速度越快,同时精度下降,默认为1,如果没有进行填写
search参数,模版匹配搜索类型,这个参数有两种类型 SEARCH_EX 和 SEARCH_DX 前者是穷举搜索,适用于小图像高精度的搜索,后者是菱形搜索,适合大图像和低精度的搜索要求。识
识别数字代码
# Template Matching Example - Normalized Cross Correlation (NCC)
#
# This example shows off how to use the NCC feature of your OpenMV Cam to match
# image patches to parts of an image... expect for extremely controlled enviorments
# NCC is not all to useful.
#
# WARNING: NCC supports needs to be reworked! As of right now this feature needs
# a lot of work to be made into somethin useful. This script will reamin to show
# that the functionality exists, but, in its current state is inadequate.
import time, sensor, image
from image import SEARCH_EX, SEARCH_DS
# Reset sensor
sensor.reset()
# Set sensor settings
sensor.set_contrast(1)
sensor.set_gainceiling(16)
# Max resolution for template matching with SEARCH_EX is QQVGA
sensor.set_framesize(sensor.QQVGA)
# You can set windowing to reduce the search image.
#sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60))
sensor.set_pixformat(sensor.GRAYSCALE)
# Load template.
# Template should be a small (eg. 32x32 pixels) grayscale image.
template = image.Image("/32.pgm")
clock = time.clock()
# Run template matching
while (True):
clock.tick()
img = sensor.snapshot()
roi = (0,0,sensor.width(),sensor.height())
# find_template(template, threshold, [roi, step, search])
# ROI: The region of interest tuple (x, y, w, h).
# Step: The loop step used (y+=step, x+=step) use a bigger step to make it faster.
# Search is either image.SEARCH_EX for exhaustive search or image.SEARCH_DS for diamond search
#
# Note1: ROI has to be smaller than the image and bigger than the template.
# Note2: In diamond search, step and ROI are both ignored.
r = img.find_template(template, 1.0, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))
if r:
img.draw_rectangle(r)
print(clock.fps())
欢迎指正,希望对你,有所帮助!!!