HD画質でキャプチャが出来ない

Logicoolのc920を使って、OpenCVで1920x1080の画像をキャプチャしようとしているのだけれどうまくいかない。調べてみると他にも同じ状況の方がいるよう。
http://kujiraiken.sit.ac.jp/blog/2018/09/opencv-cap_prop_frame_width-problem/

この方のブログと同様に、以下のように解像度を指定しても解像度は1920x1080になるが、キャプチャされる画像は低解像度の画像を引き延ばしたような4:3の画像になっており、左右には黒い余白が配置されている。上記ブログによると、長年未解決の問題らしい。。。

他にも色々と調べていると、これまでカメラデバイスをオープンする際に、デバイス番号のみを指定していたが、DirectShowを使ったキャプチャやMedia Foundationを使ったキャプチャを指定できるらしい。指定方法は簡単で、以下のように記述すれば良い。
cv::VideoCapture vcap_.open(0 + cv::CAP_DSHOW); // DirectShow
cv::VideoCapture vcap_.open(0 + cv::CAP_MSMF); // Media Foundation
結果は以下のようになった。

CAP_DSHOW
CAP_MSMF
DirectShowベースのキャプチャをすると16:9の画像キャプチャできていることが確認できる。解像度も1920x1080で指定ができた。ただ、高解像度の画像をキャプチャする場合にはフレームレートが極端に落ちる。なんでだろう。。。
高解像度の画像をキャプチャしたい場合は、おとなしくOpenCV以外の方法を利用すべきなのかもしれない。

余談だが、CAP_DSHOWを利用する場合、以下を用いてカメラの各パラメータを設定するためのダイアログを呼び出すことができる。これはちょっと便利。

vcap_.set(cv::CAP_PROP_SETTINGS, 0);



コメント

このブログの人気の投稿

COLMAPでキャリブレーション済みのデータを使う

5点アルゴリズムによるカメラ位置・姿勢の推定

2D-3D対応からのカメラ位置・姿勢の推定