OpenMv学习总结
簡單來說,OpenMv就是一個可編程的攝像頭,通過使用python語言,專門用作嵌入式當中的視覺感光元件。下面將介紹Openmv使用過程中的常用知識。
感光元件
感光元件即sensor模塊,與攝像頭有關。看如下例子:
import sensor#引入感光元件的模塊 ? # 設置攝像頭 sensor.reset()#初始化感光元件 sensor.set_pixformat(sensor.RGB565)#設置為彩色,用到其它參數時再上官方文檔里找,下同 sensor.set_framesize(sensor.QVGA)#設置圖像的大小 sensor.skip_frames()#跳過n張照片,在更改設置后,跳過一些幀,等待感光元件變穩定。 ? # 一直拍照 while(True):img = sensor.snapshot()#拍攝一張照片,img為一個image對象ROI區域
sensor.set_framesize(sensor.VGA) # 高分辨率 sensor.set_windowing((640, 80)) #取中間的640*80區域獲取/設置像素點
img = sensor.snapshot() img.get_pixel(10,10) img.set_pixcel(10,10,(255,0,0))#設置坐標(10,10)的像素點為紅色(255,0,0)圖像的運算
- image.invert() 圖像取反
- image.nand(image) 圖像之間進行與非運算
- image.nor(image) 圖像之間進行或非運算
- image.xor(image)圖像之間進行異或運算
- image.difference(image) 此函數通常用來做移動檢測
畫圖
image.draw_line(line_tuple, color=White) 在圖像中畫一條直線,其中line_tuple的格式為(x0, y0, x1, y1),即從某點到某點的直線
image.draw_rectangle(rect_tuple, color=White) 在圖像中畫一個矩形框,其中rect_tuple 的格式是 (x, y, w, h)。
這里只舉如上兩個例子,其它的用到再去查即可。
各種外設的學習
添加自定義模塊
OpenMv存在一個文件系統,根目錄下有一個main.py,把你需要導入的自定義模塊復制到根目錄下即可。
操作LED
from pyb import LED ? led = LED(1) # 紅led led.toggle() led.on()#亮 led.off()#滅操作IO口
from pyb import Pin ? p_out = Pin('P7', Pin.OUT_PP)#設置p_out為輸出引腳 p_out.high()#設置p_out引腳為高 p_out.low()#設置p_out引腳為低 p_in = Pin('P7', Pin.IN, Pin.PULL_UP)#設置p_in為輸入引腳,并開啟上拉電阻 value = p_in.value() # get value, 0 or 1#讀入p_in引腳的值可以看出,pyb模塊里各種外設的操作和32類似,易上手。
控制舵機
from pyb import Servo ? s1 = Servo(1) # servo on position 1 (P7) s1.angle(45) # move to 45 degrees s1.angle(-60, 1500) # move to -60 degrees in 1500ms s1.speed(50) # for continuous rotation servos具體需要用到哪個舵機還是需要參照原理圖的結構。
定時器
from pyb import Timer ? tim = Timer(4, freq=1000) tim.counter() # get counter value tim.freq(0.5) # 0.5 Hz tim.callback(lambda t: pyb.LED(1).toggle()) //類似于32的回調函數IO中斷
from pyb import Pin, ExtInt ? callback = lambda e: print("intr") ext = ExtInt(Pin('P7'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)PWM輸出
from pyb import Pin, Timer ? p = Pin('P7') # P7 has TIM4, CH1 tim = Timer(4, freq=1000) ch = tim.channel(1, Timer.PWM, pin=p) ch.pulse_width_percent(50)UART
from pyb import UARTuart = UART(3, 9600) uart.write('hello') uart.read(5) # read up to 5 bytesOpenMv之尋找色塊 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是你想識別的顏色的闕值,注意它是一個列表對象。
- roi即你感興趣的區域。
- x_stride 就是查找的色塊的x方向上最小寬度的像素,y_stride 就是查找的色塊的y方向上最小寬度的像素,默認為2。
- invert反轉闕值。
- area_threshold 面積閾值,如果色塊被框起來的面積小于這個值,會被過濾掉。
- pixels_threshold 像素個數閾值,如果色塊像素數量小于這個值,會被過濾掉。
- merge 合并,如果設置為True,那么合并所有重疊的blob為一個。
- margin 邊界,如果設置為1,那么兩個blobs如果間距1一個像素點,也會被合并。
顏色闕值的結構
red = (minL, maxL, minA, maxA, minB, maxB)但是OpenMv如此強大,在IDE工具欄里的Machine Vision中有闕值調試工具
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.area() 返回色塊的外框的面積。應該等于(w * h)
能看到這里的人真是不簡單啊 !!!
最后一個!!!串口的使用
先來看如下一段代碼:
在這里,我們用串口來不斷發送blob數據,而尋找色塊的過程跟opencv的思路相似,在前邊也介紹過,只不過在openmv中更簡便。
當用openmv的串口發送完數據后,接收端需要進行相應的解析才能得到想要的數據,前提是你需要知道發送數據的格式并撰寫相應的函數。
學到這里,相信你對OpenMv已經掌握地差不多了,如果想更深入地進行學習,可以到它的官網里去看所有API的介紹。
~~~留贊的人今年心想事成
總結
以上是生活随笔為你收集整理的OpenMv学习总结的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: keyshot渲染玻璃打光_keysho
- 下一篇: keyshot怎么批量渲染_keysho
