症状
環境
- os : windows10
- opencv4.1
- python3.7.5(3.6でも同様の環境)
- 仮想環境:venv, anaconda どちらも試したが同様の現象
Opencv
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()
Windows標準カメラ
Windows標準カメラでは、1080pを選択時、正常にWebカメラから映像が出力されるが、OpencvのVideocaptureを使用時は、参考画像のように、両サイドが黒く埋められる他、解像度自体も、引き延ばしたような粗さを感じる。他にも1080pで60fpsの動画が撮影可能なカメラにも関わらず、フレームレートが上がらない。(VideoCaptureのget関数では、設定値が反映されるが、実際にフレームレートを計測すると30fpsで頭打ちされる。)
解決策
以下のサイトで同様の現象が報告されていたため、解決方法を実行してみた結果解決。
OpenCV capturing imagem with black side bars
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を使用してきたが、今まで(別環境)デフォルトのストリーミングで問題なかったため、疑問が残る。また、この変更によって利用できないオプション等や著しい遅延が確認出来たら追記していきます。