Nvidia Jetson Nano B01初体验(五)

张辉 发表于 2022/05/04 23:33:41 2022/05/04
【摘要】 本文介绍了如何在Jetson Nano上使用CSI接口的摄像头。

前情回顾:

Nvidia Jetson Nano B01初体验(一) https://bbs.huaweicloud.com/blogs/330158

Nvidia Jetson Nano B01初体验(二)https://bbs.huaweicloud.com/blogs/330177

Nvidia Jetson Nano B01初体验(三)https://bbs.huaweicloud.com/blogs/330290

Nvidia Jetson Nano B01初体验(四)https://bbs.huaweicloud.com/blogs/330792


(二十一)Jetson Nano使用CSI摄像头

张小白在假期里想尝试Jetson AGX Orin的摄像头,可是看到底部这么一个图片:

这个接口似乎从未见过。

所以原来以为准备好的CSI接口的树莓派V2摄像头,貌似也用不起来了。

于是,张小白就只好拿出自己久违了的Jetson Nano B01设备,想当初(也就是2个多月前),张小白还在兴奋地玩Nano。

那就看看树莓派摄像头在Jetson Nano B01 4G上的表现吧!

首先当然是要安装好摄像头,最重要的就是注意排线的方向:(蓝色的朝外)

具体的安装方法是:

把手指将接口两边往上提,插入排线,再往下按,使得排线中的引脚跟接口的引脚亲密接触。

另外,需要注意摄像头的排线固定的方向:

其实张小白这个就做得不好看。因为原本张小白以为摄像头端的排线是从下面走的,结果接上一试,图像是反的。只有排线往头顶上接,图像才是正的。结果就让这个摄像头的走位如此妖娆。。。

我们登陆到Nano上,到/dev目录下查看摄像头设备:

cd /dev

ls -l video*

这个就是CSI摄像头了吧。

编辑一个camera.py的文件:

# -*- coding: utf-8 -*-
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("打开摄像头失败")
~

1

然后执行:

python camera.py

MobaXterm会弹出一个窗口:

就可以把张小白的书橱拍出来。

但是感觉到摄像头的延迟还是比较厉害的:张小白放过去一只右手,等了一会儿才会出现这一只右手,而我的右手已经开始截图了(请注意,张小白并没有第三只手。。)

我们X掉照相机的窗口,这个camera.py程序也会正常退出:

(二十二)使用CSI摄像头推理yolov4-tiny

git clone https://gitee.com/zhanghui_china/darknet.git

cd darknet

vi Makefile

按照以下方式修改:

make  -j4

..

./darknet

下载 https://github.com/AlexeyAB/darknet/releases/download/darknet_yolo_v4_pre/yolov4-tiny.weights 并传递到nano上:

./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights "nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=30/1 ! nvvidconv flip-method=2 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink" 

会出现以下窗口:

然后终端会打印推理的结果:

好像是把电视机识别成了冰箱。

而且,图像怎么会反过来了?难道我原来接的是对的吗?

比较一下刚才python camera.py里面打印出来的信息:

nvarguscamerasrc ! video/x-raw(memory:NVMM), width=(int)1280, height=(int)720, format=(string)NV12, framerate=(fraction)60/1 ! nvvidconv flip-method=0 ! video/x-raw, width=(int)1280, height=(int)720, format=(string)BGRx ! videoconvert ! video/x-raw, format=(string)BGR ! appsink

我们把这段信息贴近命令行试试:(把括号里面的数据类型都去掉)

./darknet detector demo cfg/coco.data cfg/yolov4-tiny.cfg yolov4-tiny.weights ”nvarguscamerasrc ! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=60/1 ! nvvidconv flip-method=0 ! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink“

终于反过来了:

查了一下解释:

nvarguscamerasrc

! video/x-raw(memory:NVMM), width=1280, height=720, format=NV12, framerate=30/1

这段是设置摄像头的画面大小 1280X720(看来是个720p),帧数为30.

! nvvidconv flip-method=0

这段是设置摄像头是否需要反转画面,前面设成了2就是反转了。

! video/x-raw, width=1280, height=720, format=BGRx ! videoconvert ! video/x-raw, format=BGR ! appsink"

这段是将原始的视频转换为BGR色彩空间。

yolov4 tiny的模型就接入了使用这些方式处理的视频格式,然后进行推理。

那今天就先到这里吧!

(未完待续)

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区),文章链接,文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至:cloudbbs@huaweicloud.com进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。