零基础入门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
    

    摄像头参数RG10:代表这个摄像头的数据格式;
    10-bit Bayer RGRG/GBGB:是进一步说明该格式使用的算法与通道对应的参数;
    3264×2464、3264×1848、1920×1080、1640×1232、1280×720:代表尺寸;
    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摄像头。

    来源:哒哒️

    物联沃分享整理
    物联沃-IOTWORD物联网 » 零基础入门Jetson Nano——通过OpenCV调用CSI和USB摄像头

    发表评论