如何在 Yocto/poky 的 Jetson Nano 上使用带摄像头的 OpenCV
How to use OpenCV with camera on Jetson Nano with Yocto/poky
我使用 warrior 分支(poky warrior、meta-tegra warrior-l4t-r32.2、openembedded warrior)和 CUDA 10 在 Jetson Nano 上用 Yocto/poky 创建了一个最小的 xfce 图像。
图像引导和 运行s 完美,相机测试:
$ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e
很有魅力。
现在我想在相机源上使用 OpenCV,但我无法让它工作。
我已经将这些包添加到 IMAGE_INSTALL
:
...
opencv \
libopencv-core \
libopencv-imgproc \
opencv-samples \
gstreamer1.0-omx-tegra \
python3 \
python3-modules \
python3-dev \
python-numpy \
...
安装 OpenCV。当我运行/usr/bin/opencv_version时,returns版本3.4.5,python版本3.7.2,GCC版本7.2.1。
当我尝试 运行 this OpenCV test code 它 returns
[ WARN:0] VIDEOIO(createGStreamerCapture(filename)): trying ...
(python3.7:5163): GStreamer-CRITICAL **: ..._: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed
[ WARN:0] VIDEOIO(createGStreamerCapture(filename)): result=(nil) isOpened=-1 ...
Unable to open camera
我试过在网上四处寻找解决方案,但它们似乎不起作用。
编辑:
在 VideoCapture 函数中使用 CAP_GSTREAMER 似乎确实存在问题,因为 运行 使用 CAP_FFMPEG 使用相同的程序反而在 mp4 视频上工作得很好。
使用 cv2.VideoCapture("/dev/video0", CAP_FFMPEG)
仅 returns with isOpen=-1。如何让相机在 python 中打开?
这是您所说的适合您的管道:
gst-launch-1.0 -v nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e
这是脚本中提到的管道:
gst-launch-1.0 -v nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3280, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw, width=820, height=616, format=BGRx' ! videoconvert ! video/x-raw, format=BGR ! appsink
工作流水线和非工作流水线的区别在于添加了 videoconvert
和 appsink
错误 GStreamer-CRITICAL **: ..._: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed
表示您的系统中缺少某些 GStreamer 元素。您可以尝试通过将以下包组添加到您的图像来添加缺少的插件:
gstreamer1.0-plugins-base
或者,您可以将 face_detect.py
中的管道替换为您的工作管道,但请记住,脚本可能需要先将视频转换为 BGR,然后再将其提供给 appsink
以便算法执行工作。您可能需要查找 nvidconv
元素的文档以查看它是否受支持。
编辑:从您的评论来看,您可能也遗漏了 gstreamer1.0-python
。
使用以下 gstreamer 管道:
流 = 'nvarguscamerasrc ! video/x-raw(memory:NVMM), width=%d, height=%d, format=(string)NV12, framerate=(fraction)%d/1 !nvvidconv flip-method=%d ! nvvidconv ! video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! videoconvert ! appsink' % (1280, 720, 30,0, 640, 480)
cap = cv2.VideoCapture(流,cv2.CAP_GSTREAMER)
这将解决问题
我使用 warrior 分支(poky warrior、meta-tegra warrior-l4t-r32.2、openembedded warrior)和 CUDA 10 在 Jetson Nano 上用 Yocto/poky 创建了一个最小的 xfce 图像。
图像引导和 运行s 完美,相机测试:
$ gst-launch-1.0 nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e
很有魅力。
现在我想在相机源上使用 OpenCV,但我无法让它工作。
我已经将这些包添加到 IMAGE_INSTALL
:
...
opencv \
libopencv-core \
libopencv-imgproc \
opencv-samples \
gstreamer1.0-omx-tegra \
python3 \
python3-modules \
python3-dev \
python-numpy \
...
安装 OpenCV。当我运行/usr/bin/opencv_version时,returns版本3.4.5,python版本3.7.2,GCC版本7.2.1。
当我尝试 运行 this OpenCV test code 它 returns
[ WARN:0] VIDEOIO(createGStreamerCapture(filename)): trying ...
(python3.7:5163): GStreamer-CRITICAL **: ..._: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed
[ WARN:0] VIDEOIO(createGStreamerCapture(filename)): result=(nil) isOpened=-1 ...
Unable to open camera
我试过在网上四处寻找解决方案,但它们似乎不起作用。
编辑: 在 VideoCapture 函数中使用 CAP_GSTREAMER 似乎确实存在问题,因为 运行 使用 CAP_FFMPEG 使用相同的程序反而在 mp4 视频上工作得很好。
使用 cv2.VideoCapture("/dev/video0", CAP_FFMPEG)
仅 returns with isOpen=-1。如何让相机在 python 中打开?
这是您所说的适合您的管道:
gst-launch-1.0 -v nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e
这是脚本中提到的管道:
gst-launch-1.0 -v nvarguscamerasrc ! 'video/x-raw(memory:NVMM),width=3280, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=0 ! 'video/x-raw, width=820, height=616, format=BGRx' ! videoconvert ! video/x-raw, format=BGR ! appsink
工作流水线和非工作流水线的区别在于添加了 videoconvert
和 appsink
错误 GStreamer-CRITICAL **: ..._: gst_element_get_state: assertion 'GST_IS_ELEMENT (element)' failed
表示您的系统中缺少某些 GStreamer 元素。您可以尝试通过将以下包组添加到您的图像来添加缺少的插件:
gstreamer1.0-plugins-base
或者,您可以将 face_detect.py
中的管道替换为您的工作管道,但请记住,脚本可能需要先将视频转换为 BGR,然后再将其提供给 appsink
以便算法执行工作。您可能需要查找 nvidconv
元素的文档以查看它是否受支持。
编辑:从您的评论来看,您可能也遗漏了 gstreamer1.0-python
。
使用以下 gstreamer 管道:
流 = 'nvarguscamerasrc ! video/x-raw(memory:NVMM), width=%d, height=%d, format=(string)NV12, framerate=(fraction)%d/1 !nvvidconv flip-method=%d ! nvvidconv ! video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! videoconvert ! appsink' % (1280, 720, 30,0, 640, 480)
cap = cv2.VideoCapture(流,cv2.CAP_GSTREAMER)
这将解决问题