日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

openmv4系列7----寻找色块

發布時間:2023/12/31 编程问答 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 openmv4系列7----寻找色块 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

openmv4系列7----尋找色塊

1、find_blobs函數

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10,pixels_threshold=10, merge=False, margin=0, threshold_cb=None, merge_cb=None)

參數解釋:

  • thresholds是顏色的閾值,注意:這個參數是一個列表,可以包含多個顏色。如果你只需要一個顏色,那么在這個列表中只需要有一個顏色值,如果你想要多個顏色閾值,那這個列表就需要多個顏色閾值。注意:在返回的色塊對象blob可以調用code方法,來判斷是什么顏色的色塊。
    • 示例
red = (xxx,xxx,xxx,xxx,xxx,xxx) blue = (xxx,xxx,xxx,xxx,xxx,xxx) yellow = (xxx,xxx,xxx,xxx,xxx,xxx) img=sensor.snapshot() red_blobs = img.find_blobs([red]) color_blobs = img.find_blobs([red,blue, yellow])
  • roi是“感興趣區”。示例:
    left_roi = [0,0,160,240]
    blobs = img.find_blobs([red],roi=left_roi)

  • x_stride 就是查找的色塊的x方向上最小寬度的像素,默認為2,如果你只想查找寬度10個像素以上的色塊,那么就設置這個參數為10:
    blobs = img.find_blobs([red],x_stride=10)

  • y_stride 就是查找的色塊的y方向上最小寬度的像素,默認為1,如果你只想查找寬度5個像素以上的色塊,那么就設置這個參數為5:
    blobs = img.find_blobs([red],y_stride=5)

  • invert 反轉閾值,把閾值以外的顏色作為閾值進行查找

  • area_threshold 面積閾值,如果色塊被框起來的面積小于這個值,會被過濾掉

  • pixels_threshold 像素個數閾值,如果色塊像素數量小于這個值,會被過濾掉

  • merge 合并,如果設置為True,那么合并所有重疊的blob為一個。
    注意:這會合并所有的blob,無論是什么顏色的。如果你想混淆多種顏色的blob,只需要分別調用不同顏色閾值的find_blobs。

    • 示例
all_blobs = img.find_blobs([red,blue,yellow],merge=True) red_blobs = img.find_blobs([red],merge=True) blue_blobs = img.find_blobs([blue],merge=True) yellow_blobs =img.find_blobs([yellow],merge=True)
  • margin 邊界,如果設置為1,那么兩個blobs如果間距1一個像素點,也會被合并。

2、閾值

一個顏色閾值的結構是這樣的:

red = (minL, maxL, minA, maxA, minB, maxB)

元組里面的數值分別是L A B 的最大值和最小值。

獲取閾值步驟:工具 → 機器視覺 → 閾值編輯器 → 幀緩沖區
然后拖動六個滑塊,可以實時的看到閾值的結果,我們想要的結果就是,將我們的目標顏色變成白色,其他顏色全變為黑色。

3、blob色塊對象

  • blob有多個方法:

  • blob.rect() 返回這個色塊的外框——矩形元組(x, y, w, h),可以直接在image.draw_rectangle中使用。

  • blob.x() 返回色塊的外框的x坐標(int),也可以通過blob[0]來獲取。

  • blob.y() 返回色塊的外框的y坐標(int),也可以通過blob[1]來獲取。

  • blob.w() 返回色塊的外框的寬度w(int),也可以通過blob[2]來獲取。

  • blob.h() 返回色塊的外框的高度h(int),也可以通過blob[3]來獲取。

  • blob.pixels() 返回色塊的像素數量(int),也可以通過blob[4]來獲取。

  • blob.cx() 返回色塊的外框的中心x坐標(int),也可以通過blob[5]來獲取。

  • blob.cy() 返回色塊的外框的中心y坐標(int),也可以通過blob[6]來獲取。

  • blob.rotation() 返回色塊的旋轉角度(單位為弧度)(float)。如果色塊類似一個鉛筆,那么這個值為0180°。如果色塊是一個圓,那么這個值是無用的。如果色塊完全沒有對稱性,那么你會得到0360°,也可以通過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()是圓的外接正方形的面積。

4、blobs

find_blobs對象返回的是多個blob的列表。(注意區分blobs和blob,這只是一個名字,用來區分多個色塊,和一個色塊)。
列表類似與C語言的數組,一個blobs列表里包含很多blob對象,blobs對象就是色塊,每個blobs對象包含一個色塊的信息。

blobs = img.find_blobs([red])

blobs就是很多色塊。

可以用for循環把所有的色塊找一遍。

for blob in blobs:print(blob.cx())

5、參考代碼

1. 尋找同種顏色的色塊

import sensor, image, timethreshold = [(4, 48, 28, -128, 28, 87)] #暗黃色的閾值sensor.reset() #初始化傳感器 sensor.set_pixformat(sensor.RGB565) #傳感器色彩 sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time = 2000 ) #開機跳過一些時間 sensor.set_auto_whitebal(False) #關閉白平衡clock = time.clock() #獲取時鐘while(True):clock.tick()img = sensor.snapshot() #拍照blob = img.find_blobs(threshold, area_threshold=300, margin=10)#尋找對應閾值的色塊,閾值小于300像素的色塊過濾掉,合并相鄰像素在10個像素內的色塊if blob: #如果找到了目標顏色FH = bytearray([0xb3,0xb4]) for b in blob:#迭代找到的目標顏色區域img.draw_cross(b[5], b[6]) #畫十字 cx,cy # blob.cx() 返回色塊的外框的中心x坐標(int),也可以通過blob[5]來獲取。 # blob.cy() 返回色塊的外框的中心y坐標(int),也可以通過blob[6]來獲取。img.draw_edges(b.min_corners(), color=(0,255,0))#畫框

blob.cx() 返回色塊的外框的中心x坐標(int),也可以通過blob[5]來獲取。
blob.cy()返回色塊的外框的中心y坐標(int),也可以通過blob[6]來獲取。

2. 多顏色跟蹤示例

# 尋找不同顏色的色塊 import sensor, image, time# 顏色跟蹤閾值(L Min, L Max, A Min, A Max, B Min, B Max) # 下面的閾值跟蹤一般紅色/綠色的東西。你不妨調整他們... thresholds = [(47, 68, 55, 103, 25, 63), # red_thresholds(60, 75, -80, -40, 30, 50), # green_thresholds(29, 49, -5, 25, -63, -35)] # blue_thresholdssensor.reset() sensor.set_pixformat(sensor.RGB565) sensor.set_framesize(sensor.QVGA) sensor.skip_frames(time = 2000) sensor.set_auto_gain(False) # must be turned off for color tracking sensor.set_auto_whitebal(False) # must be turned off for color tracking sensor.set_vflip(True) sensor.set_hmirror(True) clock = time.clock()# 只有比“pixel_threshold”多的像素和多于“area_threshold”的區域才被 # 下面的“find_blobs”返回。 如果更改相機分辨率, # 請更改“pixels_threshold”和“area_threshold”。 “merge = True”合并圖像中所有重疊的色塊。while(True):clock.tick()img = sensor.snapshot().lens_corr(1.8) for blob in img.find_blobs(thresholds, pixels_threshold=200, area_threshold=200):img.draw_rectangle(blob.rect())img.draw_cross(blob.cx(), blob.cy())print(clock.fps())

總結

以上是生活随笔為你收集整理的openmv4系列7----寻找色块的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。