OpenMV4 H7 PLUS摄像头模板匹配
使用OpenMV4 H7 PLUS攝像頭進行矩形、三角形、圓三種形狀的模板匹配:
參考:
官網:https://book.openmv.cc
函數庫:https://docs.singtown.com/micropython/zh/latest/openmvcam/library/omv.sensor.html?highlight=sensor#module-sensor
環境下載:https://openmv.io/pages/download
函數:
find_template函數:
image.find_template(template, threshold[, roi[, step=2[, search=image.SEARCH_EX]]])嘗試使用歸一化互相關(NCC)算法在圖像中找到第一個模板匹配的位置。返回匹配位置的邊界框元組(x, y, w, h),否則返回None。
template 是一個與這個圖像對象相匹配的小圖像對象。注意:兩圖像須都為灰度圖。
threshold 是浮點數(0.0-1.0),其中較小的值在提高檢測速率同時增加誤報率。相反,較高的值會降低檢測速率,同時降低誤報率。
roi 是感興趣區域的矩形元組(x,y,w,h)。如果未指定,ROI即整個圖像的圖像矩形。 操作范圍僅限于 roi 區域內的像素。
step 是查找模板時需要跳過的像素數量。跳過像素可大大提高算法運行的速度。該方法只適用于SERACH_EX模式下的算法。
search 可為 image.SEARCH_DS or image.SEARCH_EX. image.SEARCH_DS 搜索模板所用算法較 image.SEARCH_EX 更快,但若模板位于圖像邊緣周圍,可能無法成功搜索。 image.SEARCH_EX 可對圖像進行較為詳盡的搜索,但其運行速度遠低于 image.SEARCH_DS 。
僅支持灰度圖像。
r = img.find_template(template, 0,7, roi=(10,0,80,60), step=4, search=SEARCH_EX) threshold中的0.7是相似度閾值,roi是進行匹配的區域(左上頂點為(10,0),長80寬60的矩形),注意roi的大小要比模板圖片大,比frambuffer小。
限制:
使用NCC算法進行模板匹配對大小要求和角度要求都較嚴格,大小或角度變化稍微打一點可能就很難識別出來了。所有我們需要多采集一些不同大小不同角度的模板來避免這一問題。
templates1 = ["/300.pgm","/301.pgm","/302.pgm","/303.pgm","/310.pgm","/311.pgm","/312.pgm","/313.pgm","/320.pgm","/321.pgm","/322.pgm","/323.pgm"] #保存三角形多個模板 templates2 = ["/100.pgm","/101.pgm","/102.pgm","/103.pgm","/110.pgm","/111.pgm","/112.pgm","/113.pgm","/120.pgm","/121.pgm","/122.pgm","/123.pgm"] #保存矩形多個模板 templates3 = ["/000.pgm","/001.pgm","/002.pgm","/003.pgm","/010.pgm","/011.pgm","/012.pgm","/013.pgm","/020.pgm","/021.pgm","/022.pgm","/023.pgm"] #保存圓多個模板如果運行程序后出現以下問題:
1.模版圖片太大,建議模版圖片小于80*60
2.OpenMV4內存不夠,要把像素減低,例如將QQVGA改成QQCIF
實現:
注意,由于我們的模板圖片大小要超過openmv內置的flash,所以我們需要插上sd卡后進行下列步驟。(注意先插sd卡再上電哦) 而且此模板匹配只能用于1.6及以上版本的固件哦,否則運行時會提示 “can not find SEARCH_EX”哦
首先,我們需要創建或導入一個模板,注意這個模板必須得是pgm格式的,而且大小有限制,不能超過openmv的像素大小。 我們可以直接從openmv里面截取一個模板圖像,可以先運行拍照代碼,讓frambuffer顯示出圖像,然后進行截取。
選擇 save image selection to pc,注意從openmv里面直接截取保存的圖片是bmp格式的,我們需要把它轉換成pgm格式。可以在這個網站進行在線轉換https://convertio.co/zh/bmp-pgm/
這里我是自己直接改后綴名也可以用。
然后,我們將轉換完的pgm模板保存到sd卡中。我們打開模板匹配的程序就可以進行匹配了。
代碼:
本此任務實現使用下面多模板匹配就可以完成,單模板匹配不使用:
拍照:
# #模板匹配簡單拍照程序 #import time, sensor, image from image import SEARCH_EX, SEARCH_DS #從imgae模塊引入SEARCH_EX和SEARCH_DS。使用from import僅僅引入SEARCH_EX, #SEARCH_DS兩個需要的部分,而不把image模塊全部引入。sensor.reset() #初始化傳感器(攝像頭) # 設置傳感器 sensor.set_contrast(1) sensor.set_gainceiling(16) sensor.set_framesize(sensor.LCD) #分辨率,用LCD屏幕的話需要設為LCD。和模板匹配程序一樣。 sensor.set_pixformat(sensor.GRAYSCALE) #照片模式,灰度圖像方式 sensor.skip_frames(time = 200) #延時跳過一些幀,等待感光元件變穩定。 sensor.set_auto_gain(False) # 顏色跟蹤必須關閉自動增益 sensor.set_auto_whitebal(False) #關閉白平衡。 sensor.set_auto_exposure(False,16777) #設置曝光,需要更改clock = time.clock() # 跟蹤FPS幀率while(True):clock.tick() # 追蹤兩個snapshots()之間經過的毫秒數.img = sensor.snapshot().lens_corr(strength = 1.8, zoom = 1.0) #去畸變() print("FPS %f" % clock.fps()) # 注意: 當連接電腦后,OpenMV會變成一半的速度。當不連接電腦,幀率會增加。單模板匹配:
# NCC模板匹配示例-Normalized Cross Correlation (NCC) # # 這個例子展示了如何使用OpenMV的NCC功能將小部分圖像與圖像的各個部分 # 進行匹配...期望獲得極其可控的環境 NCC并不總是有用的。 # # 警告:NCC支持需要重做!到目前為止,這個功能需要做大量的工作才能有用。 # 這個腳本將重新表明功能的存在,但在目前的狀態是不足的。import time, sensor, image from image import SEARCH_EX, SEARCH_DS #從imgae模塊引入SEARCH_EX和SEARCH_DS。使用from import僅僅引入SEARCH_EX, #SEARCH_DS兩個需要的部分,而不把image模塊全部引入。# 重置傳感器 sensor.reset()# 設置傳感器 sensor.set_contrast(1) sensor.set_gainceiling(16) # Max resolution for template matching with SEARCH_EX is QQVGA # 模板與SEARCH_EX匹配的最大分辨率是QQVGA sensor.set_framesize(sensor.QQVGA) # 你可以設置windowing窗口來減少搜索圖片。 #sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60)) sensor.set_pixformat(sensor.GRAYSCALE)#灰度圖像。# 加載模板。 # 模板應該是一個小的(例如。32x32像素)灰度圖像。 template = image.Image("/1.pgm")clock = time.clock()#運行模板匹配 while (True):clock.tick()img = sensor.snapshot()# find_template(template, threshold, [roi, step, search])# ROI: 感興趣區域元組 (x, y, w, h).# Step:使用的循環步長(y+= Step, x+= Step) 使用更大的步長使其更快。# search 為image.SEARCH_EX進行詳盡搜索,或者為image.SEARCH_DS進行菱形搜索## Note1: ROI必須比圖像小,比模板大。# Note2:在菱形diamond搜索中,step和ROI都被忽略。r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))# find_template(template, threshold, [roi, step, search]),# threshold中的0.7是相似度閾值,roi是進行匹配的區域(左上頂點為(10,0),長80寬60的矩形),# 注意roi的大小要比模板圖片大,比frambuffer小。# 把匹配到的圖像標記出來if r:img.draw_rectangle(r)print("匹配")print(clock.fps())多模板匹配:
# 使用NCC算法實現模板匹配 # # 這個例子展示了如何使用OpenMV凸輪的NCC功能將小部分圖像與圖像的各個部分進行匹配...期望獲得極其可控的環境NCC并不是全部有用的。 # # 警告:NCC支持需要重做!到目前為止,這個功能需要做大量的工作才能有用。 # 這個腳本將重新表明功能的存在,但在目前的狀態是不足的。import time, sensor, image from image import SEARCH_EX, SEARCH_DS #從imgae模塊引入SEARCH_EX和SEARCH_DS。使用from import僅僅引入SEARCH_EX, #SEARCH_DS兩個需要的部分,而不把image模塊全部引入。sensor.reset() #初始化傳感器(攝像頭) # 設置傳感器 sensor.set_contrast(1) sensor.set_gainceiling(16) sensor.set_framesize(sensor.LCD) #分辨率,用LCD屏幕的話需要設為LCD。SEARCH_EX 最大用 QQVGA sensor.set_pixformat(sensor.GRAYSCALE) #照片模式,灰度圖像方式 sensor.skip_frames(time = 200) #延時跳過一些幀,等待感光元件變穩定。 sensor.set_auto_gain(False) # 顏色跟蹤必須關閉自動增益 sensor.set_auto_whitebal(False) #關閉白平衡。 sensor.set_auto_exposure(False,16777)# 設置曝光,需要更改#sensor.set_windowing(((640-80)//2, (480-60)//2, 80, 60)) #子分辨率。可設置windowing窗口來減少搜索圖片templates1 = ["/300.pgm","/301.pgm","/302.pgm","/303.pgm","/310.pgm","/311.pgm","/312.pgm","/313.pgm","/320.pgm","/321.pgm","/322.pgm","/323.pgm"] #保存三角形多個模板 templates2 = ["/100.pgm","/101.pgm","/102.pgm","/103.pgm","/110.pgm","/111.pgm","/112.pgm","/113.pgm","/120.pgm","/121.pgm","/122.pgm","/123.pgm"] #保存矩形多個模板 templates3 = ["/000.pgm","/001.pgm","/002.pgm","/003.pgm","/010.pgm","/011.pgm","/012.pgm","/013.pgm","/020.pgm","/021.pgm","/022.pgm","/023.pgm"] #保存圓多個模板clock = time.clock() #跟蹤FPS幀率#運行模板匹配 while (True):clock.tick() # 追蹤兩個snapshots()之間經過的毫秒數.img = sensor.snapshot().lens_corr(strength = 1.8, zoom = 1.0) #去畸變#初始化計數常量n1 = 0n2 = 0n3 = 0for t in templates1: #如果與模板匹配 template = image.Image(t) #template獲取圖片r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #進行相關設置,可以設置roi縮小區域if r: #如果有目標img.draw_rectangle(r) #畫矩形,框出匹配的目標n1 = n1 + 1for t in templates2: template = image.Image(t)r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))if r:img.draw_rectangle(r)n2 = n2 + 1for t in templates3:template = image.Image(t)r = img.find_template(template, 0.70, step=4, search=SEARCH_EX) #, roi=(10, 0, 60, 60))if r:img.draw_rectangle(r)n3 = n3 + 1#打印模板名字tuple([n1,n2,n3])tu = tuple([n1,n2,n3])max_value = max(tu) #獲取最大匹配度的模板max_value_index = tu.index(max_value) #獲取最大匹配度的模板下標if max_value_index == 0:print("三角形")if max_value_index ==1 :print("矩形")if max_value_index == 2:print("圓形")print('模板元組{}中最大值為:{},下標為:{}'.format(tu,max_value,max_value_index))print(clock.fps())總結
以上是生活随笔為你收集整理的OpenMV4 H7 PLUS摄像头模板匹配的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算两幅图像PSNR
- 下一篇: 智能手机的ESD测试