背景
産業用のMV-CE050-30UCというUSB3のカメラでOpenCVによる画像処理を行いたかった。
デフォルトで対応していないと思い込んでいろいろ試行錯誤した後、
非常に簡単に対応させる手順が用意されていた。
なんとかOpenCVで画像が出て喜んだものの解像度が640 x 480。最大解像度まで上げたい。
メーカー標準のビューワーやGraphEditでは解像度変更は可能だった。
最大解像度は2592 x 1944、設定間隔は横16、縦2ずつの模様。
設定ファイル的なものは見つからず、どうやらプログラムから変更するしかないようだが・・・
実行環境
モジュール | Ver | 備考 |
---|---|---|
python | 3.10.0 | |
opencv-python | 4.7.0.68 | |
numpy | 1.24.1 | opencv-pythonインストール時に自動でインストールされたもの |
MVS | 3.1.0 | MV-CE050-30UCのデバイスドライバのインストールとユーティリティ |
実施内容
OpenCVから解像度を変更した
デフォルト時を確認
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
640.0
480.0
1600 x 1600で試した結果→エラー
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1600.0)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1600.0)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
0.0
0.0
CAP_PROP_SETTINGSによる変更 → 変更してもデフォルト値に戻る
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
cap.set(cv2.CAP_PROP_SETTINGS)
cv2.waitKey(0)
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
640.0
480.0
OpenCVのバージョン変更 3.7 → 3.6
pipで入れたopencv-pythonをアンインストールして
chocoで入れた3.6への環境変数PYTHONPATHを設定してみた。
っが結果は変わらなかった。設定が反映されない。
その他実施するなら・・・
・原因がよくわからないもののOpenCV側に問題がありそうなだったのでOpenCVの自前ビルド
・EWCLIBというものを使う案もあるらしい
成功例
どこで失敗するのか確認しながらやみくもにコピペしたら成功してしまった。
cap = cv2.VideoCapture(0, cv2.CAP_DSHOW)
print(cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1600.0))
print(cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1600.0))
print(cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1600.0))
print(cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1600.0))
print(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
print(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
True
False
True
True
1600.0
1600.0
まとめ
1度失敗したからと諦めてしまうのは良くない。
3回くらいはチャレンジしてみるものです。
標準のソフトでも現状最大解像度はfps30は出ないので概ね他と同じ状態になった。
なんで失敗するの?について根本的な原因は不明です。