OpenMv基础
前言
OpenMV是嵌入式圖像處理,其攝像頭是一款小巧,低功耗,低成本的電路板,它幫助輕松的完成機器視覺(machine vision)應用。
可以通過高級語言Python腳本(準確的說是 MicroPython ),而不是C/C++。Python的高級數據結構使你很容易在機器視覺算法中處理復雜的輸出。但是,你仍然可以完全控制OpenMV,包括IO引腳。
可以很容易的使用外部終端觸發拍攝或者或者執行算法,也可以把算法的結果用來控制IO引腳。
簡單的來說,OpenMV是一個可編程的攝像頭,通過MicroPython語言,可以實現邏輯。而且攝像頭本身內置了一些圖像處理算法,很容易使用。那么后期就可以使用OpenMV做一些計算機機器視覺的好玩項目了。
星瞳科技是OpenMV中國官方代理,還做了好多中文視頻,特別適合我這種小白。bilibili觀看地址:https://space.bilibili.com/22215525/#/
色塊監測 例子如下,也太貼心了,每行都有注釋。
# 色塊監測 例子 # # 這個例子展示了如何通過find_blobs()函數來查找圖像中的色塊 # 這個例子查找的顏色是深綠色import sensor, image, time# 顏色追蹤的例子,一定要控制環境的光,保持光線是穩定的。 green_threshold = ( 0, 80, -70, -10, -0, 30) #設置綠色的閾值,括號里面的數值分別是L A B 的最大值和最小值(minL, maxL, minA, # maxA, minB, maxB),LAB的值在圖像左側三個坐標圖中選取。如果是灰度圖,則只需 #設置(min, max)兩個數字即可。sensor.reset() # 初始化攝像頭 sensor.set_pixformat(sensor.RGB565) # 格式為 RGB565. sensor.set_framesize(sensor.QQVGA) # 使用 QQVGA 速度快一些 sensor.skip_frames(time = 2000) # 跳過2000s,使新設置生效,并自動調節白平衡 sensor.set_auto_gain(False) # 關閉自動自動增益。默認開啟的,在顏色識別中,一定要關閉白平衡。 sensor.set_auto_whitebal(False) #關閉白平衡。白平衡是默認開啟的,在顏色識別中,一定要關閉白平衡。 clock = time.clock() # 追蹤幀率while(True):clock.tick() # Track elapsed milliseconds between snapshots().img = sensor.snapshot() # 從感光芯片獲得一張圖像blobs = img.find_blobs([green_threshold])#find_blobs(thresholds, invert=False, roi=Auto),thresholds為顏色閾值,#是一個元組,需要用括號[ ]括起來。invert=1,反轉顏色閾值,invert=False默認#不反轉。roi設置顏色識別的視野區域,roi是一個元組, roi = (x, y, w, h),代表#從左上頂點(x,y)開始的寬為w高為h的矩形區域,roi不設置的話默認為整個圖像視野。#這個函數返回一個列表,[0]代表識別到的目標顏色區域左上頂點的x坐標,[1]代表#左上頂點y坐標,[2]代表目標區域的寬,[3]代表目標區域的高,[4]代表目標#區域像素點的個數,[5]代表目標區域的中心點x坐標,[6]代表目標區域中心點y坐標,#[7]代表目標顏色區域的旋轉角度(是弧度值,浮點型,列表其他元素是整型),#[8]代表與此目標區域交叉的目標個數,[9]代表顏色的編號(它可以用來分辨這個#區域是用哪個顏色閾值threshold識別出來的)。if blobs:#如果找到了目標顏色for b in blobs:#迭代找到的目標顏色區域# Draw a rect around the blob.img.draw_rectangle(b[0:4]) # rect#用矩形標記出目標顏色區域img.draw_cross(b[5], b[6]) # cx, cy#在目標顏色區域的中心畫十字形標記print(clock.fps()) # 注意: 你的OpenMV連到電腦后幀率大概為原來的一半#如果斷開電腦,幀率會增加電源
OpenMV有兩個電源輸入端:VIN(有時也會標識為VCC)和USB輸入。
VIN輸入為3.6V~5V,推薦5V。
USB和VIN可以同時供電。
OpenMV有一個電源輸出端:3.3V,這個電壓是OpenMV的穩壓器輸出的,用于給其他傳感器供電。
注意:不要給3.3V直接供電,沒有內部芯片的保護,很容易燒毀。
SD卡
如果代碼太多,flash裝不下,就可以使用SD卡,這個是OpenMv自帶的,SD卡也是一個文件系統,當上電的時候,如果插入SD卡,那么SD卡的文件系統就會自動取代內置的Flash文件系統,每次上電,就會運行SD卡中的main.py。SD卡最大支持32G的容量。
圖像處理背景
感光元件
從物理學和數學我們都接觸過小孔成像,這是一種理想的相機模型,圖像透過鏡頭,照在一個感光芯片上,感光芯片可以把光照的波長和強度等信息轉成計算機(數字電路)可以識別的數字信號。
感光元件如下,攝像頭用螺絲固定在感光元件正上方就好,如果感光元件上面有灰塵什么的就用棉簽擦一下。
像素
感光元件是有很多個感光點構成的,比如有640*480個點,每個點就是一個像素。
分辨率
把每個點的像素收集整理起來,就是一副圖片,那么這張圖片的分辨率就是640*480。
幀率
每秒鐘處理的圖片數量。
顏色
不同波長的電磁波。
LAB亮度-對比度
這個是在查找指定顏色模塊時要用的,a的正數代表紅色,負端代表綠色;b的正數代表黃色,負端代表藍色。
Python
這個是此板塊必學的,這里再回顧一下常用語法吧,把自己不熟練的地方也總結了一下。
使用好處
OpenMV可以使用Python來進行二次開發。有幾個好處:
1.上手簡單。
2.不用考慮內存的申請和釋放。
3.有很多MicroPython庫可以直接用(并不兼容PC上的Python模塊)。
4.開發團隊開發了OpenMV的各種算法和模塊可供調用。
REPL和串口
OpenMV的IDE自帶一個串口助手,用于連接OpenMV,也可以連接其他的串口,比如Arduino,pyboard,esp8266。這個串口可以直接從IDE到達,然后就可以到達終端了。
從這里進入
選擇連接serial port
到達終端
語法
print()函數
print()函數也可以接受多個字符串,用逗號“,”隔開,就可以連成一串輸出,但是print()會依次打印每個字符串,遇到逗號“,”會輸出一個空格。
print()可以打印整數,也可以直接計算結果。
或者
print('100 + 200 =', 100 + 200)輸出
100 + 200 = 300其中的’100 + 200 ='是字符串而非數學公式,是Python解釋器自動計算出的。
變量
如下,就是將靜態語言賦值給動態語言。
a = 'ABC' # a變為字符串注:靜態語言在定義變量時必須指定變量類型。
list列表
list是一種數據結構,一種有序的集合,可以隨時添加和刪除其中的元素。
1.獲取元素個數
以下的變量classmates就是一個list。用len()函數可以獲得list元素的個數為三,那如果一個list中一個元素也沒有,就是一個空的list,它的長度為0。
classmates = ['Michael', 'Bob', 'Tracy'] len(classmates)2.索引訪問
可以用索引來訪問list中每一個位置的元素,但是要記得索引是從0開始的,要確保索引不要越界。
索引還可以倒著寫,比如最后一個元素:classmates[-1],以此類推。那classmates[-2]就是倒數第二個元素。
3.插入
把元素插入到指定的位置
classmates.insert(1, 'Jack')4.刪除
刪除list末尾的元素
classmates.pop()5.替換
classmates[1] = 'Sarah'6.數據類型
list里面的元素的數據類型也可以不同的哦。
tuple元組
這也是一種有序列表。
注:tuple一旦初始化就不能修改,就是不能賦值,替換什么的了。
也就是說,當定義一個tuple的時候,tuple的元素就必須被確定下來。如果只有1個元素的tuple定義時必須加一個逗號,,來消除是數學意義上小括號的歧義。
t = (1,)條件判斷
這里有用到elif,直接進行下一個條件判斷,并且不用加分號。
切記加冒號。
if語句的完整形式是:
循環
1.for x in 循環
就是把每個元素代入變量x,然后執行縮進塊的語句。
range(101)就可以生成0-100的整數序列,計算如下:
2.while循環
這個是C語言里面也接觸過的,但是這里運用可以不加分號。
數據類型轉換
比如int()函數可以把其他數據類型轉換為整數,float-小數(浮點數),double-極大或極小的浮點數,char-字符型。
定義函數
def power(x):#函數名,參數return x * x#一定要縮進,函數體注:定義的函數體一定要縮進。
在power(x)函數中,參數x就是一個位置參數。若像power(x, n)函數有兩個參數:x和n,這兩個參數都是位置參數,調用函數時,傳入的兩個值按照位置順序依次賦給參數x和n。
切片
如L[0:3]表示,從索引0開始取,直到索引3為止,但不包括索引3。即索引0,1,2,正好是3個元素。如果第一個索引是0,還可以省略:L[:3]。
注:tuple和list切片后數據類型不變。
'ABCDEFG'[:3] 'ABC'#還是字符不變總結
- 上一篇: 【演示文稿制作动画】Focusky教程
- 下一篇: 遇到税控盘共享多人使用的问题怎么解决