Jetson Xavier NX 配置(六)—— 连接CSI和USB摄像头进行Yolov5实时目标检测

【环境:Ubuntu18.04系统,python虚拟环境,vscode编写】

概要:
本文涉及以下多种方式的组合尝试:

  • CSI摄像头orUSB摄像头
  • 单个摄像头or多个摄像头
  • TensorRT加速or不加速

目录:

1、CSI摄像头连接

1.1 终端连接打开摄像头

1.2 代码读取帧

2、遇到的一些报错(python虚拟环境)

3、用摄像头视频流进行实时的Yolov5检测

4、用摄像头视频流进行实时的tensorrt加速的Yolov5检测

5、 同时调用多个usb摄像头进行YOLOv5实时检测


1、CSI摄像头连接

        第一次见到这种小的排线摄像头,怎么连到开发板上呢:接口轻轻往上拉开(建议用指甲),CSI摄像头扁扁的一端有银色裸露的部分,那部分对着接口里面有金属突出的那一面,插入接口以后把接口按下去关上。

1.1 终端连接打开摄像头

        检查摄像头是否已连接      : 

ls /dev/video* 

        已连接的话会返回"/dev/video0"或"/dev/video1"(0/1取决于摄像头连的哪一个接口)

        终端一行代码连接摄像头,显示于屏幕上:

nvgstcapture

1.2 代码读取帧

目的:为了之后对摄像头视频进行其它处理,需要能够读取到视频流的每一帧。

两种方式:cv2直接读取帧或者用jetcam模块(其实本质也是通过cv2.VideoCapture来读取,只不过封装好了而已,更便捷)

jetcam安装

git clone https://github.com/NVIDIA-AI-IOT/jetcam
cd jetcam
sudo python3 setup.py install

发现问题:安装完发现 vscode检测不到刚安装的模块

原因:默认安装在本地/usr/lib/python3.6/dist-packages目录下,所以进入python虚拟环境中import jetcam会失败

可能的解决方法1

        在settings.json中,添加模块安装的文件夹路径,例如:

Jetson Xavier NX 配置(六)—— 连接CSI和USB摄像头进行Yolov5实时目标检测_第1张图片

{
    "python.autoComplete.extraPaths": ["/usr/lib/python3.6/dist-packages"]
}

可能的解决方法2:把安装到本地路径的文件拷贝到虚拟环境

        找到本地路径,复制jetcam相关的两个文件(一个文件夹,一个.egg文件)到python虚拟环境的site-packages下。本地路径下还有一个easy-install.pth路径,虚拟环境下也有一个同名的文件所以不能直接复制,把里面那一行复制进去即可。

2、遇到的一些报错(python虚拟环境)

无论是cv2方法还是jetcam方法,都在一开始无法捕捉到csi摄像头,即使在终端是可以打开摄像头的。

报错1jetcam could not initialize camera     

报错2error: (-215:Assertion failed) size.width>0 && size.height>0 in function ‘imshow‘  

还有一个size.width>0的报错,读本地的视频也会这样,查了好久,没有中文路径,反斜杠也没有问题。

        最后发现各种报错的根本原因是opencv的版本和设置问题, 因为不会源代码重新编译,所以最便捷的操作是,当初安装开发板系统的时候是默认在本地安装了opencv的,默认路径在/usr/lib/python3.6/dist-packages下,把cv2的文件夹复制到python虚拟环境的site-packages下(为了保险起见把几个包全都复制过去了,只要两个环境的python版本相同即可,没什么坏处)

3、用摄像头视频流进行实时的Yolov5检测

对于csi摄像头: 
        jetyolo项目
        直接使用参考博文的代码
参考:Yolov5-Serial-CSI_Demo · 语雀

对于usb摄像头:
        在运行yolo的detect.py时将source从原先的本地图片视频路径改成 0或者1或者2,对应摄像头序号,即可。

4、用摄像头视频流进行实时的tensorrt加速的Yolov5检测

对于csi摄像头:

        【暂未解决csi摄像头的tensorrt方式加速检测】

对于usb摄像头:

(文件目录:downloads/forYolo/tensorrtx/yolov5/下的yolo_trt_usb.py)

参考博文的代码修改之处:根据自己摄像头的序号修改:cap = cv2.VideoCapture(1)
# 此处我的0号是csi摄像头,1号是usb摄像头

优点:非常适合做实时的事情,帧率在30-60左右,很高;约有1s延迟

参考:【究极缝合】Jeston Nano环境配置+部署yolov5(master)+Tensorrt加速+usb摄像头测试_鱼鱼症患者的博客-CSDN博客

5、 同时调用多个usb摄像头进行YOLOv5实时检测

(文件目录:下载/yolov5master/下的最普通的detect.py)

方法:开启多个terminal同时运行两个detect.py,摄像头源source参数改一下即可:python3 detect.py --source 1

问题1:加到第3个摄像头时,终端运行卡顿直至死机

问题2:如果运行tensorrt加速的yolo检测,无法实现多个摄像头同时检测,打开另一个程序的同时会把上一个进程kill掉

未尝试:csi摄像头是否能和usb摄像头同时运行检测?

参考:

Jeston Nano打开CSI摄像头_哔哩哩哩的博客-CSDN博客

Jetson nano——使用jetcam官方库调用双CSI摄像机,JetsonNano,JetCam,摄像头

Jetson Nano 2GB 系列文章(7):通过 OpenCV 调用 CSI/USB 摄像头 - 知乎

Youtube上发现了个Jetson NX的视频,蛮不错的:

https://toptechboy.com/category/jetson-xavier-nx/#google_vignette

B站也能找到:https://www.bilibili.com/video/av328423873/

你可能感兴趣的:(Jetson,Xavier,NX,目标检测,opencv,计算机视觉,ubuntu)