【小林的OpenCV基礎課 2】Hello World!
上一話我們寫了一個能顯示小林自拍照的Hello World示常式序,然後說好的講解一下。
先貼出代碼
import cv2import numpy as npprint("Hello World.")img = cv2.imread("Kobayashi.JPG")cv2.imshow("Image",img)cv2.waitKey(0)cv2.destroyAllWindows()
前兩行是模塊的導入,這是python的基礎知識。這裡引入了兩個模塊,一個是必須用到的OpenCV的cv2,另一個是做OpenCV開發時常用的numpy(在這段代碼中並沒有使用numpy,為了養成良好的習慣,小林建議同學們導入這個包)。緊接著在控制台列印「Hello World.」字元串。
然後,敲黑板了,因為要載入小林自拍照了。我們使用一個矩陣(起名叫img)儲存Kobayashi.JPG,這裡用到了同學們要學的第一個OpenCV函數imread,它用來讀取一副圖像。函數原型
retvalue = cv2.imread(filename[, flags])
- retvalue:存儲圖像用的矩陣,可為單通道和多通道。
- filename:圖片文件名,字元串形式,如果圖片和當前的python文件在同一路徑下,這個參數可為文件名,反之需為圖片文件完整的路徑,win下文件路徑中默認使用「」,而代碼中則需為「\」,原因就是轉義字元的存在。
- flags:可選參數,用於指明圖片以何種色彩空間載入,(關於色彩空間的知識小林會在下一話更新,想提前了解的同學亦可自行查閱相關資料)常用值
cv2.IMREAD_GRAYSCALE # 灰度cv2.IMREAD_COLOR # 默認值,彩色模式,色彩空間為BGR,不是RGB
下一行用到的函數是imshow,顧名思義,是用來顯示圖像的。函數原型
None = cv2.imshow(winname, mat)
- winname:窗口名稱,字元串形式。
- mat:要顯示的圖像對應的矩陣。由此可以看出,窗口呈現的內容是矩陣,換言之,如果要同時顯示多幅圖像則需先使用namedWindow函數(勞煩同學們自行查閱API)創建窗口,再對各個窗口使用imshow函數。
然後是waitKey函數,用於等待按鍵按下或毫秒級延時。函數原型
retval=cv2.waitKey([,delay])
- retval :delay<=0時返回按鍵鍵碼,delay>0時,若在delay時間內無按鍵按下則返回-1,反之返回按鍵鍵碼。
- delay:>0為毫秒級延時時長,<=0時為等待按鍵按下。提示一下,文檔和一些國外書籍中提到:毫秒級延時的精確程度與計算機的實時狀態有關,不易直接用作精確延時。確實如此,但小林想說,初學者只需了解這個小陷阱就行,以後做項目時要注意這一點。
最後是destroyAllWindows函數,也就是關掉所有窗口,以釋放資源。函數原型
None = cv2.destroyAllWindows()
總體來說,我們常見的python版OpenCV代碼主要由三部分組成,即
- 包和模塊的導入
- 功能部分的實現
- 結束並釋放資源
來自托爾醬的提示:
- 同學們在查閱API時會發現,文檔中使用的模塊是cv,而我們使用的模塊是cv2,這是為什麼呢?其實,cv是OpenCV 1.x版本的模塊,屬於過去時,cv2是OpenCV 2.x和OpenCV 3.x版本的模塊,及現在時和將來時,cv2兼容了cv中的絕大部分內容,托爾也推薦使用cv2。
- waitKey函數在使用時要注意,該函數只能在有至少一個窗口時才能使用。64位機器中如需返回鍵碼建議手動補全高八位,即如下寫法
cv2.waitKey(100) & 0xFF is ord("q") # q是我們期望的鍵碼
我們還能做什麼?
當然是打開攝像頭做網紅啦!
下面小林將講解如何打開攝像頭並在屏幕上顯示攝像頭畫面。
原理講解:視頻其實是由一幅幅畫面組成,稱為幀。利用人眼的暫留效應,在一定的時間間隔下「放映」每一幅畫面即可形成動態效果。我們的攝像頭採集視頻也是同樣的道理,每個採集周期T採集一幅畫面並顯示出來,周期T的倒數記為f,稱之為幀頻,單位fps(frames per second)。
在OpenCV中,通常將採集畫面和顯示畫面放在一個循環里,並用waitKey函數控制幀頻,即可實現視頻的效果。OpenCV支持多源採集視頻,即同時允許多個源頭(比如雙目攝像頭或攝像頭陣列)採集畫面,前提是手動為源頭標號以免混淆。
導入模塊後,註冊一個攝像頭cap = VideoCapture(0),寫一個循環,在循環體中讀取當前幀並顯示出來,循環體的最後加入一個條件判斷,用於設定幀頻和確定退出循環即結束採集的條件。代碼如下
import cv2import numpy as npcap = cv2.VideoCpature(0)while True: if cap.isOpened(): ret,frame = cap.read() cv2.imshow("Camera",frame) if waitKey(100)&0xFF is ord("q"): breakcv2.destroyAllWindows()
使用筆記本的同學是不是在屏幕中看到了帥帥的自己呢?
用到的新函數read。函數原型
retval, image=cv2.VideoCapture.read([, image])
- retval:若成功捕獲當前幀,則返回True,反之返回False。
本話示例代碼已同步到GitHub:Class 1中的C1 Show Video。
托爾醬最討厭的作業君來啦!!
小林留一個小小的作業:既然我們打開了攝像頭,那能不能每隔一段時間就保存一張截圖或者乾脆錄像呢?同學們可以嘗試一下。小林會在下一話更新時同步上傳示例代碼(可能會用到的函數為imwrite)
最後的最後
如果喜歡小林的專欄,就收藏了吧!してください!
推薦閱讀: