成果展示
常見出錯解決方法
openmv數字識別源代碼—gitee
效果如上
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)
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())
因此我們就得像個辦法再增加模板的同時,還不降低幀率。
以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=0for i in list:template[t] = image.Image("i")#模板庫 要求圖片格式為pgm 需要下載到sd卡中t+=1return templateclock = 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寫的,是手擼的,所以可能直接復制會有語法上的報錯,可以自己改一改哈)
如果對你有幫助的話就點個贊吧
總結
以上是生活随笔為你收集整理的2021电赛F题之openmv数字识别--更新(附带视频与代码)的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。