如何在带有Yocto / poky的Jetson Nano上使用带摄像头的OpenCV

时间:2019-09-18 09:56:06

标签: python opencv yocto nvidia-jetson nvidia-jetson-nano

我使用勇士分支(poky warrior,meta-tegra warrior-l4t-r32.2,openembedded warrior)和CUDA 10在Jetson Nano上用Yocto / poky创建了最小的xfce图像。

图像可以正常启动并运行,并且可以进行相机测试:

$ 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时,它返回版本3.4.5,python版本是3.7.2,GCC版本是7.2.1。

当我尝试运行this OpenCV test code时,它会返回

[ 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)仅返回isOpen = -1。如何在python中打开相机?

2 个答案:

答案 0 :(得分:2)

这是您所说的适用于您的管道:

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

工作管道和非工作管道之间的区别是增加了videoconvertappsink 错误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

答案 1 :(得分:0)

使用以下gstreamer管道:

stream ='nvarguscamerasrc! video / x-raw(内存:NVMM),宽度=%d,高度=%d,格式=(字符串)NV12,帧率=(分数)%d / 1!nvvidconv翻转方法=%d! nvvidconv! video / x-raw,width =(int)%d,height =(int)%d,format =(string)BGRx!视频转换! appsink'%(1280,720,30,0,640,480)

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

这将解决问题