LoginSignup
3
2

More than 3 years have passed since last update.

Opencv4.1 + Windows10 + Python3.7.5のcv2.VideoCaptureで正しく表示されない

Last updated at Posted at 2019-11-22

症状

環境

  • os : windows10
  • opencv4.1
  • python3.7.5(3.6でも同様の環境)
  • 仮想環境:venv, anaconda どちらも試したが同様の現象

Opencv

VideoCapture.py
import cv2

camera = cv2.VideoCapture(0)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)

while True:
    ret, frame = camera.read()
    cv2.imshow('camera', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        cv2.imwrite("capout.jpg", frame)
        break

camera.release()
cv2.destroyAllWindows()

capout.jpg

Windows標準カメラ

WIN_20191122_16_41_19_Pro.jpg

Windows標準カメラでは、1080pを選択時、正常にWebカメラから映像が出力されるが、OpencvのVideocaptureを使用時は、参考画像のように、両サイドが黒く埋められる他、解像度自体も、引き延ばしたような粗さを感じる。他にも1080pで60fpsの動画が撮影可能なカメラにも関わらず、フレームレートが上がらない。(VideoCaptureのget関数では、設定値が反映されるが、実際にフレームレートを計測すると30fpsで頭打ちされる。)

解決策

以下のサイトで同様の現象が報告されていたため、解決方法を実行してみた結果解決。
OpenCV capturing imagem with black side bars

VideoCapture2.py
import cv2
# ストリーミングをDSHOWに変更
camera = cv2.VideoCapture(0, cv2.CAP_DSHOW)
camera.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)

while True:
    ret, frame = camera.read()
    cv2.imshow('camera', frame)

    if cv2.waitKey(1) & 0xFF == ord('q'):
        cv2.imwrite("capout.jpg", frame)
        break

camera.release()
cv2.destroyAllWindows()

原因

直接の原因はWindowsが悪いのか、Opencvのバージョンの問題なのかわからないが、DirectSHOWと呼ばれるストリーミング形式を使用すると解決できた。以下に、DirectSHOWについての解説を参照しておく
qiita_directshow
今まで、普通にOpencvのVideocaptureを使用してきたが、今まで(別環境)デフォルトのストリーミングで問題なかったため、疑問が残る。また、この変更によって利用できないオプション等や著しい遅延が確認出来たら追記していきます。

3
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2