openmv图像识别
?攝像頭初始化
# 攝像頭初始化函數 def set_sensor():sensor.reset() # 重置感光元件,重置攝像機sensor.set_pixformat(sensor.RGB565) # 設置顏色格式為RGB565,彩色,每個像素16bit。sensor.set_framesize(sensor.QQVGA) # 圖像大小為QQVGAsensor.skip_frames(time=10) # 跳過n張照片,在更改設置后,跳過一些幀,等待感光元件變穩定。sensor.set_auto_gain(False) # 顏色識別必須關閉自動增益,會影響顏色識別效果sensor.set_auto_whitebal(False) # 顏色識別必須關閉白平衡,會影響顏色識別效果,導致顏色的閾值發生改變sensor.set_auto_exposure(False) #只是禁用曝光值更新,但不會更改相機傳感器確定的曝光值。#clock = time.clock()照片處理
找到最大面積的色塊對應的顏色
對最大色塊的方形區域進行判斷,即不僅包括目標顏色
def find_max(blobs):max_size = 0for blob in blobs:if blob[2]*blob[3] > max_size:max_blob = blob#最大的顏色max_size = blob[2]*blob[3]#w*h,最大色塊的面積return max_blob主代碼
clock.tick() img = sensor.snapshot() blobs = img.find_blobs([threshold_1])#查找圖像中所有色塊,并返回一個包括每個色塊的色塊對象的列表,thresholds 必須是元組列表,定義你想追蹤的顏色范圍 blobs1 = img.find_blobs([threshold_2])#進行兩次顏色采樣 if blobs: #如果找到了目標顏色blob = find_max(blobs)#找到所有目標顏色中最大的色塊區域if ((blob.cx() in range(60, 110)) and (blob.cy() in range(40, 90))):#判斷目標是否在攝像頭指定區域#density()返回這個色塊的密度比。這是在色塊邊界框區域內的像素點的數量。#總的來說,較低的密度比意味著這個對象的鎖定得不是很好。 結果在0和1之間。#即判斷目標顏色所在(blob.cx(), blob.cy(),blob.cw(), blob.ch())的矩形區域中的所占面積,即密度,0.0~1.0if 0.285<blob.density()< 0.45:# 這些值依賴于blob不是循環的-否則它們將不穩定。if blob.roundness() > 0.8:#判斷是否是圓# 這些值始終是穩定的。img.draw_rectangle(blob.rect()) # 用矩形標記出目標顏色區域img.draw_cross(blob.cx(), blob.cy()) # 在目標顏色區域的中心畫十字形標記# 注意blob的旋轉是唯一的0-180。在沒有測距模塊時,可利用小孔成像原理判斷大致距離
K=5000#隨實際測量數據改變 x = blob[0] y = blob[1] width = blob[2] height = blob[3] # Draw a rect around the blob. img.draw_rectangle([x, y, width, height]) # rect # 用矩形標記出目標顏色區域 img.draw_cross(blob[5], blob[6]) # cx, cy # 在目標顏色區域的中心畫十字形標記 Lm = (blob[2] + blob[3]) / 2 # b[2]色塊的外框的寬 ,b[3]色塊的外框的高 pixels = blob[4] # 色塊的像素數量 length = K / Lm#利用小孔成像原理判斷大致距離?對于blobs=img.find_blobs(threshold_1,pixels_threshold=400,area_threshold=5,x_stride=1, y_stride=1, margin=False)
x_stride?是查找某色塊時需要跳過的x像素的數量。找到色塊后,直線填充算法將精確像素。 若已知色塊較大,可增加?x_stride?來提高查找色塊的速度,y_stride?同理
若一個色塊的邊界框區域小于?area_threshold?,則會被過濾掉。
若一個色塊的像素數小于?pixel_threshold?,則會被過濾掉。
merge?若為True,則合并所有沒有被過濾掉的色塊,這些色塊的邊界矩形互相交錯重疊。
margin?可在相交測試中用來增大或減小色塊邊界矩形的大小。例如:邊緣為1、相互間邊界矩形為1的色塊將被合并。
合并色塊使顏色代碼追蹤得以實現。每個色塊對象有一個代碼值?code?,該值為一個位向量。 例如:若您在image.find_blobs中輸入兩個顏色閾值,則第一個閾值代碼為1,第二個代碼為2(第三個代碼為4,第四個代碼為8,以此類推)。 合并色塊對所有的code使用邏輯或運算,以便您知道產生它們的顏色。這使得您可以追蹤兩個顏色,若您用兩種顏色得到一個色塊對象,則可能是一種顏色代碼。
若您使用嚴格的顏色范圍,無法完全追蹤目標對象的所有像素,您可能需要合并色塊。
最后,若您想要合并色塊,但不想兩種不同閾值顏色的色塊被合并,只需分別兩次調用?image.find_blobs?,不同閾值色塊就不會被合并。
Blob 類 – 色塊對象
blob=image.find_blobs()返回值
blob.rect() 返回這個色塊的外框——矩形元組(x, y, w, h),可以直接在image.draw_rectangle中使用。
blob.x()返回色塊的邊界框的x坐標(int)。您也可以通過索引?[0]?取得這個值。左上角
blob.y()返回色塊的邊界框的y坐標(int)。您也可以通過索引?[1]?取得這個值。左上角?
blob.w()返回色塊的邊界框的w坐標(int)。您也可以通過索引?[2]?取得這個值。左上角,向右為+
blob.h()返回色塊的邊界框的h坐標(int)。您也可以通過索引?[3]?取得這個值。左上角,向下為+
blob.pixels()返回從屬于色塊(int)一部分的像素數量。您也可以通過索引?[4]?取得這個值。
blob.cx()返回色塊(int)的中心x位置。您也可以通過索引?[5]?取得這個值。
blob.cy()返回色塊(int)的中心y位置。您也可以通過索引?[6]?取得這個值。
blob.rotation() 返回色塊的旋轉角度(單位為弧度)(float)。如果色塊類似一個鉛筆,那么這個值為0~180°。如果色塊是一個圓,那么這個值是無用的。如果色塊完全沒有對稱性,那么你會得到0~360°,也可以通過blob[7]來獲取。
blob.code() 返回一個16bit數字,每一個bit會對應每一個閾值。舉個例子:
blobs = img.find_blobs([red, blue, yellow], merge=True)
 如果這個色塊是黃色,那么它的code就是0001,如果是紅色,那么它的code就是0010。注意:一個blob可能是合并的,如果是紅色和藍色的blob,那么這個blob就是0011。這個功能可以用于查找顏色代碼。也可以通過blob[8]來獲取。
blob.count() 如果merge=True,那么就會有多個blob被合并到一個blob,這個函數返回的就是這個的數量。如果merge=False,那么返回值總是1。也可以通過blob[9]來獲取。
blob.area() 返回色塊的外框的面積。應該等于(w * h)
blob.density() 返回色塊的密度。這等于色塊的像素數除以矩形框的面積。如果密度較低,那么說明目標鎖定的不是很好。
 比如,識別一個紅色的圓,返回的blob.pixels()是目標圓的像素點數,blob.area()是圓的外接正方形的面積
如果我們需要選擇兩種顏色,則需要拼接這兩個閾值,使用pixels和area綜合來過濾掉細小的像素識別。
blobs = img.find_blobs([green_threshold,red_threshold],pixels_threshold = 24,area_threshold = 5,merge = True)
 ?
圖形判斷
?
?
?色塊密度判斷?
Line類 – 直線對象
。。。。。。
Circle類 –圓形對象
。。。。。。
Rect類 – 矩形對象
。。。。。。
總結
以上是生活随笔為你收集整理的openmv图像识别的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: 阿里云安装 Redis ,win10使用
- 下一篇: 弧焊机器人断弧_华数机器人
