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

Jetson Nano学习——摄像头调用

前言

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

一、CSI摄像头的调用

1、安装v4l2-utils协助工具

sudo apt install v4l-utils

2、查看摄像头挂载情况

ls /dev/video*

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

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

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

零基础入门Jetson Nano——通过OpenCV调用CSI和USB摄像头
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

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:
                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

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

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

    kk = CV2.waitKey(1)
    if kk == ord('q'):
        break

二、USB摄像头的调用

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

示例

import cv2

cap = cv2.VideoCapture(dev)

while(1):
    ret,frame = cap.read()
    cv2.imshow("capture",frame)

    if (cv2.waitKey(1) & 0xFF) == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

总结

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

Original: https://blog.csdn.net/qq_56548850/article/details/123967404
Author: 哒哒️
Title: 零基础入门Jetson Nano——通过OpenCV调用CSI和USB摄像头

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/636769/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球