成果展示中的视频对应的源码就是上面Gitee链接里面的代码。
最新版openmv和k210的代码也已经编写完毕,你可以通过给我的Github项目点赞来免费的向我获取代码,联系我时请带上备注以及点赞Github项目后的截图。
如果是对代码有问题以及不知道如何使用的,可以先好好读一下代码的结构并且进行大致的流程梳理后再联系我,谢谢。
效果如上
openmv的u盘里需要
思路:
模板匹配很简单,只不过使用起来需要自己拍摄大量的模板,同时如果模板数量较多那么就会造成严重的画面延迟,所以需要代码的结构较为严谨,同时需要运用一些算法来优化代码,
下面只是简单的官方历程,如果需要视频中的效果,那么需要自己拍摄模板也需要自己优化代码结构哦.
需要注意的是,如果想要提高帧率,那么这一次进行匹配的模板的数量就必须要少,在模板数量少的情况下还想能匹配的上就需要较好的模板了.
同时也可以适当降低匹配图片的阈值要求,一般设定为0.5到0.7.
下面的这份代码就是官方的源代码
但是说到底我们的模板不可能只有一张,如果是那样那么识别率也太低了对吧。
import time, sensor, image from image import SEARCH_EX, SEARCH_DS #重启传感器 sensor.reset() #传感器配置 sensor.set_contrast(1) sensor.set_gainceiling(16) sensor.set_framesize(sensor.QQVGA) #由于运算量较大,因此只能使用QQVGA #可以通过设置窗口来减少搜索的图像 #sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60)) sensor.set_pixformat(sensor.GRAYSCALE)#黑白 #加载模板 #模板应该是一个小的灰度图像,如32×32. template = image.Image("/1.pgm")#模板库 要求图片格式为pgm 需要下载到sd卡中 clock = time.clock() #运行模板匹配 #查找模板(模板、阈值、[roi、步骤、搜索]) #ROI:感兴趣的区域元组(x,y,w,h)。 #步骤:使用的循环步骤(y+=步骤,x+=步骤)使用更大的步骤使其更快。 #搜索可以是image.Search\u EX进行穷举搜索,也可以是image.Search\u DS进行菱形搜索 #注1:ROI必须小于图像且大于模板。 #注2:在菱形搜索中,step和ROI都被忽略。 while (True): clock.tick() img = sensor.snapshot()# 获取当前帧 # roi=(0, 0, 400, 400) #设置感兴趣区域 r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60)) #设置感兴趣区域 if r: #如果找到模板图片旧框选出来 img.draw_rectangle(r) print(clock.fps()) // 2499067858
因此我们就得像个办法再增加模板的同时,还不降低帧率。
以openmv的性能,大概6-8张模板是能接受的,再多就会掉帧了
所以我们可以再执行find_template的时候进行for循环,让他去遍历一个list集合,遍历其中的模板,这样子我们就能尽可能提高对同一数字的识别率了.
也就是我们可以把代码改进为下面这种
import time, sensor, image from image import SEARCH_EX, SEARCH_DS #重启传感器 sensor.reset() #传感器配置 sensor.set_contrast(1) sensor.set_gainceiling(16) sensor.set_framesize(sensor.QQVGA) #由于运算量较大,因此只能使用QQVGA #可以通过设置窗口来减少搜索的图像 #sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60)) sensor.set_pixformat(sensor.GRAYSCALE)#黑白 #加载模板 #模板应该是一个小的灰度图像,如32×32. list = ["/1.pgm", "/2.pgm", "/3.pgm", "/4.pgm","/5.pgm", "/6.pgm", "/7.pgm", "/8.pgm"] template = [0,0,0,0,0,0,0,0] def loadimg(): t=0 for i in list: template[t] = image.Image("i")#模板库 要求图片格式为pgm 需要下载到sd卡中 t+=1 return template clock = time.clock() #运行模板匹配 #查找模板(模板、阈值、[roi、步骤、搜索]) #ROI:感兴趣的区域元组(x,y,w,h)。 #步骤:使用的循环步骤(y+=步骤,x+=步骤)使用更大的步骤使其更快。 #搜索可以是image.Search\u EX进行穷举搜索,也可以是image.Search\u DS进行菱形搜索 #注1:ROI必须小于图像且大于模板。 #注2:在菱形搜索中,step和ROI都被忽略。 template = loadimg() while (True): clock.tick() img = sensor.snapshot()# 获取当前帧 # roi=(0, 0, 400, 400) #设置感兴趣区域 for i in template: r = img.find_template(i, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60)) #设置感兴趣区域 if r: #如果找到模板图片旧框选出来 img.draw_rectangle(r) print(clock.fps())
这样子我们就能做到一次性遍历好多张图片了,之后如果还想优化,你就可以根据比赛的题目进行适当的操作了
(这个代码不是用ide写的,是手撸的,所以可能直接复制会有语法上的报错,可以自己改一改哈)