一、什麼是OpenMV
OpenMV 是一款非常小巧、功能豐富的計算機視覺平台。支持圖像識別、顏色跟蹤、線性檢測等功能,且使用簡單、學習容易。通過硬件加速圖像處理和機器學習操作,OpenMV 可以在編寫控制器等較為負責的嵌入式系統時大大提高開發效率,降低開發成本,是一款性價比非常高的計算機視覺編程工具。
二、OpenMV的硬件和軟件配置
OpenMV最新的版本是OMV3,使用STM32H743VIT6處理器,擁有1MB SRAM,2MB flash,支持2560×1440高清輸出,以及22個通用輸入輸出(GPIO)。OpenMV 還搭載了外部SD卡槽和藍牙、WiFi等外圍設備接口,可以便捷地集成其它設備。OpenMV IDE是OpenMV官方的編程軟件,使用起來非常方便,主要功能有代碼編輯、圖像採集、顯示和調試。
三、OpenMV的集成應用
1.物聯網應用:OpenMV具有各種控制低功耗無線網絡通信,通過TCP / IP,LoRa,SIGFOX和Iridium進行通信,可實現基於物聯網的監控任務和人工智能解決方案等。
2.機器人控制:OpenMV可以通過Uart,SPI或IIC接口與機器人微控制器,如Arduino,Raspberry Pi進行通信,實現機器人的自動導航、行為分析。
3.智能安防:OpenMV可以實現智能門禁、人臉識別、目標跟蹤等功能,並能夠自動抓拍破壞者信息,可應用於實驗室門禁、家庭安防等場景中。
4.自動駕駛:OpenMV可以通過編寫相關程序,實現車輛的自主導航、環境感知等功能。
四、OpenMV硬件功能的使用示例
下面介紹一些OpenMV硬件功能的使用示例。
1.圖像採集
# Example for acquiring images only on movement. import sensor, image, time sensor.reset() # Reset and initialize the sensor. sensor.set_pixformat(sensor.RGB565) # Set pixel format to RGB565 (or GRAYSCALE) sensor.set_framesize(sensor.QQVGA) # Set frame size to QQVGA (80x60) sensor.skip_frames(time = 2000) # Wait for settings take effect. # Reset the clock. clock = time.clock() # Save the previous frame. previous = None while(True): # Update clock. clock.tick() # Capture new image. image = sensor.snapshot() # Check if motion has occurred. if previous is not None and image.difference(previous).count() > 10: # Save image. image.save("/detect.bmp") # Store the previous image. previous = image.copy() # Print the elapsed time. print(clock.fps())
2.圖像處理
# 在圖像上查找一個由二進制形式的顏色掩碼錶示的顏色,返回矩形和兩個掉幀信息(x和y方向上) import sensor, image, time # 配合 OpenMV 學習手冊使用 # 有關顏色跟蹤,請參閱以下文檔: # http://docs.openmv.io/library/omv.image.html#image.image_binary # http: // docs.openmv.io/library/omv.image.html#image.image_mono_search # 顏色跟蹤顏色的二進制值。在此示例中,它是從色輪工具中獲得的,某些部分的值略有不同。 MIN_DELTA = 1 MAX_DELTA = 10 bar_threshold_deltas = (MAX_DELTA - MIN_DELTA + 1) bar_thresholds = [(MIN_DELTA + (i * bar_threshold_deltas // 8)) for i in range(bar_threshold_deltas)] print("bar thresholds: %s" % (bar_thresholds)) threshold_index = 0 sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.set_auto_gain(False, value=100) sensor.set_auto_exposure(False, exposure_us=5000) sensor.set_brightness(1) clock = time.clock() search_rect = [150, 80, 100, 100] # [x, y, w, h] while(True): clock.tick() img = sensor.snapshot() img.draw_rectangle(search_rect) img = img.crop(150, 80, 100, 100) img = img.mean_pooled(2, 2) # 方法 1: 使用二進制圖像查找單通道顏色跟蹤 for threshold in bar_thresholds: result = img.binary([threshold]*3) # 用於只檢測水平條的中點。 r = result.find_blobs([1, 11, 100, 40]) #尋找二進制中的連通域,返回一個Blob對象列表 if r: # 對於blob對象列表,x()、y()是blob中心,cx()、cy()是blob重心,w()、h()是blob的寬和高 img.draw_rectangle(search_rect) img.draw_rectangle(r[0].rect(),color=127) # Coords can be accessed through virtually any blob object attribute such as # rect(), cx(), cy(), x(), y(), etc. print(threshold, r[0].cx()) break # 方法 2: 使用二進制圖像查找單通道顏色跟蹤(一行代碼) # 注意:如果使用這個,您必須根據情況調整一些參數,例如第8和第10行的參數。 # # img.binary([(45, 75, -10, 14, -25, 27)], invert=False) # # 二進制函數可以同時採用 1 個、3 個或 6 個閾值元組(並帶有相應的通道計數)。 # GT的閾值將部分圖像視為顏色,以後者為基礎繪製一個二進制圖像(一種選擇),然後查找連續的球體。 # 連續的球體被稱為“大洞(大塊)”,並將通過“find_blobs()”來查找,作為一組Blob對象返回。 #“大洞”的一些閾值調整可能需要進行匹配,以便將大洞與軌跡完全重疊。 # 有關閾值方法,請查看顏色跟蹤和二進制函數的文檔,並在IDE中搜索有關此方面的文檔。 # # 但是,在這個例子中,我們將使用普通色輪閾值(通過下面的“bar_thresholds”數組)來檢測條形碼上的藍條,例如:“[(0, 50, -30, -15, 0, 20)]”。 print(clock.fps())
3.機器學習
# 該文件的目的是演示如何使用神經網絡在 OpenMV Cam 上進行識別。 # # 您應該下載圖像以進行訓練。此示例使用一個圖像集,其中包含洛杉磯的Keras代碼中提供的250張圖像, # 位於“下載”文件夾中。每個文件名都是“數字_編號.jpg”,例如“3_23.jpg”對於數字“3”,它是第23個圖像。 # # 當然,您必須首先運行“mnist_cnn.py”來訓練模型。在訓練之後,請將生成的“權重.m5”文件複製到OpenMV的存儲設備上並重新啟動OpenMV Cam。 import sensor, image, time, os, nn sensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time=1000) clock = time.clock() labels = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] # Load the built-in "digits" classifier net = nn.load('/digits.network') while(True): clock.tick() img = sensor.snapshot().lens_corr(1.8) #img.draw_rectangle(80, 0, 80, 80) out = net.forward(img.binary([((200, 255), )])).index(max(net.out())) out = labels[out] print(clock.fps(), out)
五、總結
在本文中我們詳細地闡述了OpenMV這一款基於OMV3的圖像識別輔助計算機視覺編程神器。我們解釋了其硬件和軟件配置,介紹了其集成應用,最後展示了一些硬件功能的代碼示例。這款神器是學習和使用計算機視覺編程的良好選擇,同時還可以應用於生產實踐中,如物聯網、機器人控制、智能安防和自動駕駛等領域。OpenMV 的出現將進一步推進計算機視覺編程的普及和發展。
原創文章,作者:IGTSX,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/313648.html