Nvidia Jetson Nano B01初体验(五)
前情回顾:
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的模型就接入了使用这些方式处理的视频格式,然后进行推理。
那今天就先到这里吧!
(未完待续)
- 点赞
- 收藏
- 关注作者
评论(0)