[ OpenCV ] MacOS 無法使用 cv2.imshow()播放 Webcam的替代方案
OpenCV在 MacOS系統下有些功能無法使用,Python官方也清楚地告知了。
嘗試了各種 OpenCV的安裝方法,OpenCV在 MacOS上總會碰上不少挫折。據說有人跟著這篇安裝指南後,能正常運作。但我安裝到一半仍然卡關了。
但為了使用 Webcam,不得不做一些妥協。若不願意在別的系統上開發,就只好先用一些替代方案。
使用 Webcam時,會希望像在照鏡子,可以利用 cv2.flip(img,1)進行水平翻轉,參數不同會有其他翻轉效果。
OpenCV預設的格式是 BGR,而 Matplotlib預設是使用 RGB,必須透過 cv2.cvtColor(img, cv2.COLOR_BGR2RGB)轉換。
最後利用 plt.imshow(img)把圖像更新到視窗中。
顯示之後,利用 plt.pause(.01)對迴圈稍做些暫停。不用的話循環仍會繼續,但畫面不工作。我也不知道為什麼。
在進入下一個迴圈前,利用 plt.cla()和 plt.clf()釋放記憶體。
由於 MacOS也沒法使用 cv2.waitKey(),所以可能只能用 Control + C 來結束程式。
因為是透過 KeyboardInterrupt結束程式,所以其實也可以不必加上 plt.ioff()和 cam.release()。
其實透過這樣的方式顯示 Webcam影像 delay滿嚴重的,就算 pause調低,前面的計算仍然會拖累顯示的速度。目前因為作業系統的關係,只好採取不得已的作法。
最近發現,在 Anaconda的系統下安裝 OpenCV可以使用 imshow。而且使用 Anaconda比以往安裝套件輕鬆許多,雖然在 MacOS下使用 Webcam偶爾還是會當掉。
用 Anaconda安裝雖然輕鬆,但 MacOS用戶若透過 Anaconda安裝 Dlib會有一些 function無法呼叫,例如 image_window()呼叫時會出現問題,所以 Dlib還是按照一般的程序安裝,功能會比較完整。
IMPORTANT NOTE
MacOS and Linux wheels have currently some limitations:
- video related functionality is not supported (not compiled with FFmpeg)
- for example cv2.imshow() will not work (not compiled with GTK+ 2.x or Carbon support)
嘗試了各種 OpenCV的安裝方法,OpenCV在 MacOS上總會碰上不少挫折。據說有人跟著這篇安裝指南後,能正常運作。但我安裝到一半仍然卡關了。
但為了使用 Webcam,不得不做一些妥協。若不願意在別的系統上開發,就只好先用一些替代方案。
import cv2 import numpy as np import matplotlib.pyplot as plt face_cascade = cv2.CascadeClassifier('./cascades/haarcascade_frontalface_default.xml') cam = cv2.VideoCapture(0) plt.ion() while(True): ret, img = cam.read() gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) faces = face_cascade.detectMultiScale(gray, 1.2, 3) for (x,y,w,h) in faces: img = cv2.rectangle(img,(x,y),(x+w,y+h),(255,0,0),2) img = cv2.flip(img,1) # 1 水平翻轉, 0 垂直翻轉, -1 水平垂直翻轉 img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) plt.imshow(img) plt.pause(.01) plt.cla() # clear axis plt.clf() # clear figure ### NORMAL WAY # cv2.imshow('Face', img) # if cv2.waitKey(1)==ord('q'): # break plt.ioff() cam.release()進入迴圈前,先利用 plt.ion()開啟一個視窗。
使用 Webcam時,會希望像在照鏡子,可以利用 cv2.flip(img,1)進行水平翻轉,參數不同會有其他翻轉效果。
OpenCV預設的格式是 BGR,而 Matplotlib預設是使用 RGB,必須透過 cv2.cvtColor(img, cv2.COLOR_BGR2RGB)轉換。
最後利用 plt.imshow(img)把圖像更新到視窗中。
顯示之後,利用 plt.pause(.01)對迴圈稍做些暫停。不用的話循環仍會繼續,但畫面不工作。我也不知道為什麼。
在進入下一個迴圈前,利用 plt.cla()和 plt.clf()釋放記憶體。
因為是透過 KeyboardInterrupt結束程式,所以其實也可以不必加上 plt.ioff()和 cam.release()。
其實透過這樣的方式顯示 Webcam影像 delay滿嚴重的,就算 pause調低,前面的計算仍然會拖累顯示的速度。目前因為作業系統的關係,只好採取不得已的作法。
最近發現,在 Anaconda的系統下安裝 OpenCV可以使用 imshow。而且使用 Anaconda比以往安裝套件輕鬆許多,雖然在 MacOS下使用 Webcam偶爾還是會當掉。
用 Anaconda安裝雖然輕鬆,但 MacOS用戶若透過 Anaconda安裝 Dlib會有一些 function無法呼叫,例如 image_window()呼叫時會出現問題,所以 Dlib還是按照一般的程序安裝,功能會比較完整。
留言
張貼留言