iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 8
1

上一章我們做到用攝像頭即時拍照傳到後台,但是功能還只停留在擷取單張圖片。這一章我們要將截圖程式進行改動,使擷取、顯示的動作不停循環,變成類似鏡子一樣的東西。

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()

上一篇
Day7-即時攝影1
下一篇
Day9-讀取影片
系列文
OpenCV 從零開始的影像處理30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言