问题描述
我为我的 OpenCV 项目购买了 CSI 摄像头 IMX219。
当我运行以下命令时,实时显示帧似乎没有任何延迟。
$ nvgstcapture-1.0 -m 2 --prev-res 4
但是,当我使用以下管道运行简单的 python 代码时,捕获速度非常慢,
pipeline = 'nvarguscamerasrc ! video/x-raw(memory:NVMM),width=1920,height=1080,format=NV12,framerate=30/1 ! nvvidconv flip-method=0 ! video/x-raw,format=BGRx ! videoconvert ! video/x-raw,format=BGR ! appsink'
cap = cv2.VideoCapture(pipeline,cv2.CAP_GSTREAMER)
如果我在 Opencv 中需要 1920x1080、30fps VideoCapture() 我该怎么办?
感谢您的帮助!
解决方法
这是我在 NVIDIA 开发者论坛上提出的类似问题:https://forums.developer.nvidia.com/t/optimizing-opencv-gstreamer-with-mipi-and-usb-uvc-cameras/123665/27
基本上,问题在于您在 OpenCV 的 gstreamer 管道中失去了很多硬件加速。特别是 videoconvert
在管道中非常缓慢。由于我的应用程序的性质,我使用 nvvidconv
从 BGRx 转换为 I420。 OpenCV 不能处理 BGRx,但它可以处理 I420,我将其转换为 BGR 以便在我的应用程序的后面部分进行处理。 appsink
在他们的设备上也很慢,而且你没有其他选择接收器。
如果您需要恒定的实时帧,我建议您使用 libargus API,因为它可能具有 NVIDIA 提供的最高性能并针对其硬件进行了优化。