使用Jetson Xavier NX 打开树莓派摄像头Pi cam
Nvidia推出的Jetson系列是将现代AI计算能力与嵌入式系统完美结合的产品,虽然只是体积很小的arm架构的开发板,却有着跟PC一样的CUDA内核,因此可以通用我们在PC上开发的深度学习算法。除了老旧的TX 1,这个系列所有的产品我都使用过,其中我最喜欢的是2020年推出的Xavier NX。NX不但有8G的内存加显存(内存显存共用),很好的计算能力,而且尺寸跟小巧的nano一样大小,大概两张信用卡的大小,而且跟nano是插卡式的,我们可以很方便的复刻和修复系统。
提到了Jetson系列,就不得不提及同时代的另一款arm架构嵌入式明星产品,Raspberry Pi,树莓派。树莓派2012年首次推出,以其丰富的接口,低廉的价格,图形化的操作系统立刻在电子发烧友中收获大量拥趸。从名字就可以看出来,我要跟大家介绍的Pi cam,就是来自树莓派系的一个配件。这里Pi cam指的是第二代Pi cam,不过我相信你也很难买到一代了。
跟最新的nano一样,NX 有两个可以连接Pi cam的接口,小心的打开接口将Pi cam的排线塞进去,然后再小心的关上,接口很脆弱,手劲大的朋友可一定要小心,不然就像我一样,弄坏了接口。
安装好了pi cam我们就要开始重头戏了。
我们先用gstreamer命令来测试一下。
$ gst-launch-1.0 nvarguscamerasrc ! nvoverlaysink
新款的nano和NX都有两个CSI槽,我们可以用命令指定使用哪个。
$ nvarguscamerasrc sensor_mode=0
要是想要更复杂的控制可以参考下面的代码:
$ gst-launch-1.0 nvarguscamerasrc sensor_mode=0 ! 'video/x-raw(memory:NVMM),width=3820, height=2464, framerate=21/1, format=NV12' ! nvvidconv flip-method=2 ! 'video/x-raw,width=960, height=616' ! nvvidconv ! nvegltransform ! nveglglessink -e
这段代码的意思是打开一个像素为3820x2464,帧率是21,在960x616大小的窗口显示。如果值想反转图片可以修改‘flip-method’ 的值,这个值通常都设置成0或2。因为我没有装带摄像头夹具的外壳,所以我喜欢设置flip_method=2。🙃
现在我们来写一个python代码来打开rpi cam。我们新建一个文件叫open_picam.py,并添加以下代码:
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,
)
)
这段代码用python打开了一个gstreamer。
def show_camera():
# To flip the image, modify the flip_method parameter (0 and 2 are the most common)
print(gstreamer_pipeline(flip_method=2))
cap = cv2.VideoCapture(gstreamer_pipeline(flip_method=2), cv2.CAP_GSTREAMER)
if cap.isOpened():
window_handle = cv2.namedWindow("CSI Camera", cv2.WINDOW_AUTOSIZE)
# Window
while cv2.getWindowProperty("CSI Camera", 0) >= 0:
ret_val, img = cap.read()
cv2.imshow("CSI Camera", img)
# This also acts as
keyCode = cv2.waitKey(30) & 0xFF
# Stop the program on the ESC key
if keyCode == 27:
break
cap.release()
cv2.destroyAllWindows()
else:
print("Unable to open camera")
if __name__ == "__main__":
show_camera()
下面的代码就跟打开网络摄像头很类似了。
这画质真的感人啊…🙄我一度怀疑是不是买到了假货…🤔
可能是官方也意识到了这一点,新推出了C口的高质量摄像头。
谢谢朋友们的观看,我要去做早饭了👨🍳