[ OpenCV ] MacOS 無法使用 cv2.imshow()播放 Webcam的替代方案

OpenCV在 MacOS系統下有些功能無法使用,Python官方也清楚地告知了。

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()釋放記憶體。
由於 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還是按照一般的程序安裝,功能會比較完整。

留言