私はIMX8MPlusのISPとMIPI CSIを使用したカメラを使っています。
v4l2ctl --list-devices
():
/dev/v4l-subdev0
/dev/v4l-subdev2
/dev/v4l-subdev3(csi0):
/dev/v4l-subdev1FSLキャプチャメディアデバイス(プラットフォーム:32c00000.bus:camera):
/dev/media0mxc-isi_v1 (プラットフォーム:32e00000.isi:cap_devic):
/dev/video2VIV(プラットフォーム:viv0):
/dev/video3
viv_media (プラットフォーム:vvcam-video.0):
/dev/media1
そこで、OpenCV GStreamerを使用してISI /dev/video2からビデオをキャプチャすると、CPU使用率が約90%になります。
しかし、同じビデオをISP /dev/video3からOpenCV GStreamerでキャプチャすると、CPU使用率が約125%になります。
perfを使って分析すると、SIMD命令で多くのCPUプロセッシングが無駄になっていると表示されます。
つまり、ISPを使用する際に、これらの追加命令が読み込まれるということです。
この方法でフレームをキャプチャします(GStreamerを使用)。
cv::VideoCapture cap(cam_index)
if (!cap.isOpened())
ヤージュ
std::cerr << "カメラを開けませんでした " << cam_index << "\n";
1を返す。
}
ISPとOpenCVを使用する際には、このオーバーヘッドを取り除く必要があります。
ISPストリームに関する追加情報
v4l2-ctl -d /dev/video3 --list-formats-ext
ioctl: VIDIOC_ENUM_FMT
タイプ: ビデオキャプチャ[0]: 'YUYV' (YUYV 4:2:2)
サイズ:ステップワイズ 176x144 - 4096x3072、ステップ 16/8
[1]: 'NV12' (Y/UV 4:2:0)
サイズ:ステップワイズ 176x144 - 4096x3072、ステップ 16/8
[2]: 'NV16' (Y/UV 4:2:2)
サイズ:ステップワイズ 176x144 - 4096x3072、ステップ 16/8
[3]: 'BA12' (12ビットベイヤーGRGR/BGBG)
サイズ:ステップワイズ 176x144 - 4096x3072、ステップ 16/8v4l2-ctl -d /dev/video3 --get-fmt-video
フォーマットビデオキャプチャ:
幅/高さ:1280/800
ピクセルフォーマット:'NV16'(Y/UV 4:2:2)
フィールド:なし
1行あたりのバイト数:1280
画像サイズ:2048000
カラースペース: Rec.709
伝達関数: 推奨。709
YCbCr/HSV エンコーディング: Rec.709
量子化:限定範囲
フラグ: set-csc
お知らせ下さい。
OpenCVの詳しい使用手順を教えてください。こちらで再現してみます。
これは、OpenCVがデータ処理中に実行する変換処理が原因です。
そこで、純粋なGStreamerを使ってimxvideoconvertor_g2d 2D GPUでフレームを取得しようとしたところ、CPU使用率が約50%上昇しました。