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を使ったキャプチャを指定できるらしい。指定方法は簡単で、以下のように記述すれば良い。
DirectShowベースのキャプチャをすると16:9の画像キャプチャできていることが確認できる。解像度も1920x1080で指定ができた。ただ、高解像度の画像をキャプチャする場合にはフレームレートが極端に落ちる。なんでだろう。。。
高解像度の画像をキャプチャしたい場合は、おとなしくOpenCV以外の方法を利用すべきなのかもしれない。
余談だが、CAP_DSHOWを利用する場合、以下を用いてカメラの各パラメータを設定するためのダイアログを呼び出すことができる。これはちょっと便利。
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 |
高解像度の画像をキャプチャしたい場合は、おとなしくOpenCV以外の方法を利用すべきなのかもしれない。
余談だが、CAP_DSHOWを利用する場合、以下を用いてカメラの各パラメータを設定するためのダイアログを呼び出すことができる。これはちょっと便利。
vcap_.set(cv::CAP_PROP_SETTINGS, 0);
コメント
コメントを投稿