上一章我們做到用攝像頭即時拍照傳到後台,但是功能還只停留在擷取單張圖片。這一章我們要將截圖程式進行改動,使擷取、顯示的動作不停循環,變成類似鏡子一樣的東西。
import numpy as np
import cv2
# 選擇第一隻攝影機
cap = cv2.VideoCapture(0)
# 從攝影機擷取一張影像
ret,frame = cap.read()
# 開新視窗顯示圖片
cv2.imshow('frame', frame)
# 釋放攝影機
cap.release()
上一章的程式碼進行一次cap.read和cv2.imshow之後就直接結束程式,執行完只彈出一張靜態圖片,這次我們在程式碼外套一層迴圈試試看:
while(True):
### 從攝影機擷取一張影像
ret,frame = cap.read()
## 開新視窗顯示圖片
cv2.imshow('frame', frame)
程式執行後可以看到窗口的影像在即時更新,這是cap.read和cv2.imshow不斷循環的結果。
因為我們的迴圈判斷條件是while(True),如果要讓程式停止執行必須在迴圈內部寫一個結束條件:
# 若按下 q 鍵則離開迴圈
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cv2.waitkey是OpenCV內置的函式,用途是在給定的時間內(單位毫秒)等待使用者的按鍵觸發,否則持續循環。
0xFF是十六進制常數,二進制值為11111111。這個寫法只留下原始的最後8位,和後面的ASCII碼對照——不必深入理解,此處是為了防止BUG。
ord(' ')可以將字符轉化為對應的整數(ASCII碼)。
如上面的判斷式——如果使用者没有按下q键,就會持續等待(循環),直到觸發後執行break跳出迴圈。
跳出迴圈後,記得要把攝像頭和彈出視窗一併關掉。
cap.release()
cv2.destroyAllWindows()
完整程式碼如下:
import cv2
# 開啟影片檔案
cap = cv2.VideoCapture(0)
# 以迴圈從影片檔案讀取影格,並顯示出來
while(True):
ret, frame = cap.read()
cv2.imshow('frame',frame)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
cap.release()
cv2.destroyAllWindows()