零基础入门Jetson Nano——通过OpenCV调用CSI和USB摄像头

Jetson Nano学习——摄像头调用

  • 前言
  • 一、CSI摄像头的调用
    • 1、安装v4l2-utils协助工具
    • 2、查看摄像头挂载情况
    • 3、查看挂载的摄像头详细参数情况
    • 4、检测摄像头能否正常工作
    • 5、使用OpenCV调用CSI摄像头
      • 方式一、利用Gstreamer通道打开摄像头
      • 方式二、利用Jetcam通道打开摄像头
  • 二、USB摄像头的调用
  • 总结


前言

因为Jetson Nano是一款AI边缘计算开发板,所以用它来做嵌入式AI项目是很合适的。本文将详细介绍Jetson Nano如何通过OpenCV调用CSI摄像头(IMX219)和USB摄像头。


一、CSI摄像头的调用

1、安装v4l2-utils协助工具

sudo apt install v4l-utils 

2、查看摄像头挂载情况

ls /dev/video* 

摄像头挂载情况我这里video0和video1是CSI摄像头,video2是USB摄像头。

3、查看挂载的摄像头详细参数情况

v4l2-ctl --device=/dev/video0 --list-formats-ext

零基础入门Jetson Nano——通过OpenCV调用CSI和USB摄像头_第1张图片RG10:代表这个摄像头的数据格式;
10-bit Bayer RGRG/GBGB:是进一步说明该格式使用的算法与通道对应的参数;
3264x2464、3264x1848、1920x1080、1640x1232、1280x720:代表尺寸;
Interval为性能参数,表示所支持的分辨率及该分辨率的最高执行帧率。

4、检测摄像头能否正常工作

终端输入以下代码,检测摄像头能否正常打开。

nvgstcapture

5、使用OpenCV调用CSI摄像头

Jetson Nano默认安装了OpenCV 4.1.1版本。

方式一、利用Gstreamer通道打开摄像头

安装Gstreamer

sudo add-apt-repository universe
sudo add-apt-repository multiverse
sudo apt-get update
sudo apt-get install gstreamer1.0-tools gstreamer1.0-alsa gstreamer1.0-plugins-base gstreamer1.0-plugins-good gstreamer1.0-plugins-bad gstreamer1.0-plugins-ugly gstreamer1.0-libav
sudo apt-get install libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev libgstreamer-plugins-good1.0-dev libgstreamer-plugins-bad1.0-dev

实现读取CSI摄像头的步骤

创建Gstreamer管道
将Gstremer管道绑定至OpenCV的视频流
逐帧提取并绑定

示例

import CV2

# 设置gstreamer管道参数
def gstreamer_pipeline(
    capture_width=1280, #摄像头预捕获的图像宽度
    capture_height=720, #摄像头预捕获的图像高度
    display_width=1280, #窗口显示的图像宽度
    display_height=720, #窗口显示的图像高度
    framerate=60,       #捕获帧率
    flip_method=0,      #是否旋转图像
):
    return (
        "nvarguscamerasrc ! "
        "video/x-raw(memory:NVMM), "
        "width=(int)%d, height=(int)%d, "
        "format=(string)NV12, framerate=(fraction)%d/1 ! "
        "nvvidconv flip-method=%d ! "
        "video/x-raw, width=(int)%d, height=(int)%d, format=(string)BGRx ! "
        "videoconvert ! "
        "video/x-raw, format=(string)BGR ! appsink"
        % (
            capture_width,
            capture_height,
            framerate,
            flip_method,
            display_width,
            display_height,
        )
    )

if __name__ == "__main__":
    capture_width = 1280
    capture_height = 720

    display_width = 1280
    display_height = 720

    framerate = 60			# 帧数
    flip_method = 0			# 方向

    # 创建管道
    print(gstreamer_pipeline(capture_width,capture_height,display_width,display_height,framerate,flip_method))

    #管道与视频流绑定
    cap = CV2.VideoCapture(gstreamer_pipeline(flip_method=0), CV2.CAP_GSTREAMER)

    if cap.isOpened():
        window_handle = CV2.namedWindow("CSI Camera", CV2.WINDOW_AUTOSIZE)

        # 逐帧显示
        while CV2.getWindowProperty("CSI Camera", 0) >= 0:
            ret_val, img = cap.read()
            CV2.imshow("CSI Camera", img)

            keyCode = CV2.waitKey(30) & 0xFF
            if keyCode == 27:# ESC键退出
                break

        cap.release()
        CV2.destroyAllWindows()
    else:
        print("打开摄像头失败") 

方式二、利用Jetcam通道打开摄像头

安装traitlets

Python3.7以下使用 traitlets4.x
pip3 install traitlets==4.3.3
Python3.7以上使用 traitlets5.x
pip3 install traitlets

通过以下命令查看自己Python的版本
Python2

python --version

Python3

python3 --version

由于Jetson Nano的Python3默认版本是3.6.9,所以我们安装traitlets4.x
安装Jetcam

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

示例

from jetcam.csi_camera import CSICamera
import CV2

#CSI-0
camera0 = CSICamera(capture_device=0, width=224, height=224)
image0 = camera0.read()
print(image0.shape)
print(camera0.value.shape)

#CSI-1
#camera1 = CSICamera(capture_device=1, width=224, height=224)
#image1 = camera1.read()
#print(image1.shape)
#print(camera1.value.shape)

while 1:
    image0 = camera0.read()
    CV2.imshow("CSI Camera0", image0)

    #image1 = camera1.read()
    #CV2.imshow("CSI Camera1", image1)

    kk = CV2.waitKey(1)
    if kk == ord('q'):  						#按下q键,退出
        break 

二、USB摄像头的调用

相比于CSI摄像头,利用OpenCV调用USB摄像头要简单的多。

示例

import cv2

cap = cv2.VideoCapture(dev)     # dev表示Jetson Nnao上USB的设备号,上面查看摄像头挂载情况那里提到我的USB是video2,故我这里dev = 2

while(1):
    ret,frame = cap.read()  #ret:True/False,代表有没有读到图片  frame:当前截取一帧的图片
    cv2.imshow("capture",frame) 
   
    if (cv2.waitKey(1) & 0xFF) == ord('q'):
        break  
    
cap.release()
cv2.destroyAllWindows()


总结

本文介绍了Jetson Nano如何通过OpenCV调用我们平时常用的两种摄像头(CSI和USB)。注意:CSI摄像头不像USB一样支持热插拔,所以千万不能带电插拔CSI摄像头。

你可能感兴趣的:(Jetson,Nano,嵌入式硬件,python,arm开发)