Jetson TX2使用cv2调用板载摄像头

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jetson TX2使用cv2调用板载摄像头相关的知识,希望对你有一定的参考价值。

参考技术A

在TX2上使用cv2.VideoCapture(0)是 无法打开板载摄像头 的!
如果插入额外的usb摄像头,使用cv2.VideoCapture(1)就可以轻松打开usb摄像头。
而对于板载摄像头的调用,需要设置一些列参数,如下:

用gst_str代替摄像头编号0就可以了,我的TX2使用的是\'nvarguscamerasrc\'的设置,其中flip-method用于改变画面方向

https://gist.github.com/jkjung-avt/86b60a7723b97da19f7bfa3cb7d2690e

在Jetson TX2上捕获显示摄像头视频

参考文章:How to Capture and Display Camera Video with Python on Jetson TX2

与参考文章大部分都是相似的,如果不习惯看英文,可以看看我下面的描述

 

在Jetson TX2捕获和显示摄像头视频,包括IP CAM(网络摄像头)、USB webcam和板载摄像头。代码应该也适用于Jetson TX1

 

先决条件

  带有GStreamer和python支持的OpenCV构建并安装在Jetson TX2,我使用的是OpenCV-3.4.0和python3。关于如何在Jetson TX2上安装OpenCV(3.4.0)参考下面文章:在Jetson TX2上安装OpenCV(3.4.0)

  如果你想用IP CAM进行测试,需要设置它并知道它的RTSP URI。例如:RTSP://admin:XXXXX@192.168.1.64:554。

  插入一个USB摄像头,通常是/dev/video1,板载摄像头使用的是/dev/video0

  安装包含h264parse元素的gstreamer1.0-plugin -bad-xxx。这是解码来自IP CAM的H.264 RTSP流所必需的。

sudo apt-get install gstreamer1.0-plugins-bad-faad                        gstreamer1.0-plugins-bad-videoparsers

代码下载与使用

下载代码:tegra-cam.py 地址:https://gist.github.com/jkjung-avt/86b60a7723b97da19f7bfa3cb7d2690e

使用USB摄像头,分辨率设为1280x720。‘–vid 1‘ 意味着 /de/video1 

python3 tegra-cam.py --usb --vid 1 --width 1280 --height 720

 我的环境下运行出错!

技术图片

 原因可能是我的GStreamer的v4l2src对USB摄像头不起作用,使用下面的代码去代替open_cam_usb()

def open_cam_usb(dev, width, height):
    return cv2.VideoCapture(dev)

 

使用板载摄像头

python3 tegra-cam.py

 

使用IP CAM,同时替换成你自己的IP

python3 tegra-cam.py --rtsp --uri rtsp://admin:XXXXXX@192.168.1.64:554

 

这个tegra-cam.py脚本关键在于调用了 cv2.VideoCapture()的GStreamer管道。根据经验,使用 nvvidconv 进行图像缩放并将颜色格式转换为BGRx可以在帧率产生更好的效果

def open_cam_rtsp(uri, width, height, latency):
    gst_str = (rtspsrc location= latency= ! 
               rtph264depay ! h264parse ! omxh264dec ! 
               nvvidconv ! 
               video/x-raw, width=(int), height=(int), 
               format=(string)BGRx ! 
               videoconvert ! appsink).format(uri, latency, width, height)
    return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)

#def open_cam_usb(dev, width, height):
#    # We want to set width and height here, otherwise we could just do:
#    #     return cv2.VideoCapture(dev)
#    gst_str = (v4l2src device=/dev/video ! 
#               video/x-raw, width=(int), height=(int) ! 
#               videoconvert ! appsink).format(dev, width, height)
#    return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)

def open_cam_usb(dev, width, height):
    return cv2.VideoCapture(dev) 

def open_cam_onboard(width, height):
    # On versions of L4T prior to 28.1, add flip-method=2 into gst_str
    gst_str = (nvcamerasrc ! 
               video/x-raw(memory:NVMM), 
               width=(int)2592, height=(int)1458, 
               format=(string)I420, framerate=(fraction)30/1 ! 
               nvvidconv ! 
               video/x-raw, width=(int), height=(int), 
               format=(string)BGRx ! 
               videoconvert ! appsink).format(width, height)
    return cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)

 

以上是关于Jetson TX2使用cv2调用板载摄像头的主要内容,如果未能解决你的问题,请参考以下文章

TX2 上使用opencv 调用板载mipi摄像头

ROS小车打造--Jetson TX2安装与调试

Jetson TX2opencv3 打开usb摄像头

Jetson TX1使用usb camera采集图像

如何在 NVIDIA Jetson TX2 上从 openCV(从源代码构建)运行 python?

如果由于 RTSP 摄像头问题导致执行停止,如何终止 cv2.VideoCapture(rtsp_url) 调用?