Part5「USBカメラを使った物体検出」Chapter 5-4「物体検出アプリケーション」―「プログラムの構成」―「ソースコードP.180 13行目〜29行目

問題と対策

2019年12月17日(米国時間)にリリースされたJetPack 4.3でOpenCVが3.3.1から4.1.1にバージョンアップされました。それに伴い、cv2.VideoCaptureの挙動に変化が生じ、以下の点についてコードの変更が必要になってます。

(1) OpenCV 3.3.1ではカメラがサポートしないフレームレートを設定しても対応可能な範囲で動作して、特に問題は生じませんでしたが、4.1.1ではサポート外のフレームレート設定に対してキャプチャが開始しません。フレームレートを特に設定しないことで回避できます。cv2.VideoCapture.set関数の戻り値は常にFalseが返ってくるようなので、これを判断の基準にすることは(現時点では)できません。

(2) OpenCV 3.3.1では実際に設定できた解像度を取得することができましたが、4.1.1では取得できません。(恐らく、最大解像度が取得されます。)解像度設定値がそのまま設定できたものとして回避します。これも上記と同様にcv2.VideoCapture.set関数の戻り値によるチェックができません。

なお、これらの問題はOpenCV 4.1.1そのものに起因するか、OpenCV 4.1.1のJetson向けポーティングに起因するか不明です。また、今後のJetPackアップデートで本問題に変化が生じる可能性があります。

上記問題に対処したソースコードは次の通りになります。なお、GitHub上のコードは変更済みです。

https://github.com/tsutof/tiny_yolov2_onnx_cam

*****ここから*****

if args.camera < 0:

    # MIPI-CSI接続カメラ(Raspberry Piカメラv2など)をオープンする

    gst_cmd = GST_STR_CSI \

        % (args.width, args.height, FPS, args.width, args.height)

    cap = cv2.VideoCapture(gst_cmd, cv2.CAP_GSTREAMER)

else:

    # V4L2カメラ(USBカメラなど)をオープンする

    cap = cv2.VideoCapture(args.camera)

    # 画像取り込みパラメータを設定する

    cap.set(cv2.CAP_PROP_FPS, FPS)              # <=コメントアウト

    cap.set(cv2.CAP_PROP_FRAME_WIDTH, args.width)

    cap.set(cv2.CAP_PROP_FRAME_HEIGHT, args.height)

# 実際の画像取り込みサイズを確認する

act_width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)   # => act_width = args.width

act_height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # => act_height = args.height

frame_info = 'Frame:%dx%d' % (act_width, act_height)

*****ここまで*****

以上です。