Jetson平台CSI摄像头采集与显示:gst-launch-1.0与OpenCV实战
前言
在NVIDIA Jetson系列(如Nano、Xavier、Orin等)嵌入式AI平台上,CSI摄像头(MIPI接口)是高性能视觉应用的首选。本文将介绍如何用GStreamer命令行工具(gst-launch-1.0)和OpenCV(cv2)两种方式,采集并显示CSI摄像头画面。
一、gst-launch-1.0 和 nvarguscamerasrc 简介
1.1 gst-launch-1.0
gst-launch-1.0
是 GStreamer 框架的命令行工具。GStreamer 是一个强大的开源多媒体处理框架,广泛用于音视频采集、处理、转码、流媒体等场景。
gst-launch-1.0
允许开发者通过命令行快速搭建和测试多媒体“管道”,无需写代码即可完成复杂的数据流处理。
主要特点:
- 支持各种音视频格式和协议
- 插件化、可扩展
- 支持硬件加速(如NVIDIA Jetson平台)
1.2 nvarguscamerasrc
nvarguscamerasrc
是 NVIDIA Jetson 平台专用的 GStreamer 插件,用于采集 MIPI CSI 摄像头数据。它直接调用 Jetson 的硬件 Argus 驱动,支持高分辨率、低延迟和硬件加速,非常适合嵌入式视觉应用。
常用参数:
sensor_id
:指定摄像头编号(0、1、2…)exposuretimerange
、gainrange
等:高级相机参数
二、命令行方式读取并显示CSI相机
在 Jetson 上,最常用的命令如下:
gst-launch-1.0 nvarguscamerasrc sensor_id=0 ! \
'video/x-raw(memory:NVMM),width=1280,height=720,framerate=30/1,format=NV12' ! \
nvvidconv ! nveglglessink
命令详解:
nvarguscamerasrc sensor_id=0
:采集第一个CSI摄像头video/x-raw(memory:NVMM),width=1280,height=720,framerate=30/1,format=NV12
:指定分辨率、帧率、格式nvvidconv
:NVIDIA硬件加速的视频格式/尺寸转换nveglglessink
:硬件加速显示到屏幕
效果:
运行后会弹出一个窗口,实时显示摄像头画面,延迟极低,性能极高。
三、用OpenCV读取并显示CSI相机
OpenCV(cv2)也可以通过GStreamer管道读取CSI摄像头。只需将上述命令转换为GStreamer字符串,传给cv2.VideoCapture
即可。
Python代码示例:
import cv2sensor_id = 0 # 摄像头编号
gst_str = (f"nvarguscamerasrc sensor_id={sensor_id} ! ""video/x-raw(memory:NVMM),width=1280,height=720,framerate=30/1,format=NV12 ! ""nvvidconv ! video/x-raw,format=BGRx ! ""videoconvert ! video/x-raw,format=BGR ! ""appsink"
)cap = cv2.VideoCapture(gst_str, cv2.CAP_GSTREAMER)if not cap.isOpened():print("无法打开摄像头")exit()while True:ret, frame = cap.read()if not ret:print("无法读取帧")breakcv2.imshow("CSI Camera", frame)if cv2.waitKey(1) & 0xFF == 27: # 按ESC退出breakcap.release()
cv2.destroyAllWindows()
说明:
- 通过GStreamer管道,OpenCV可以高效地读取Jetson的CSI摄像头,并以BGR格式输出,方便后续AI推理或图像处理。
- 你可以根据需要调整分辨率、帧率等参数。
总结
gst-launch-1.0
是GStreamer的命令行工具,适合快速测试和调试多媒体管道。nvarguscamerasrc
是Jetson平台专用的CSI摄像头采集插件,支持硬件加速。- OpenCV结合GStreamer管道,可以在Python中高效采集和处理CSI摄像头数据,适合AI视觉开发。
希望本文对你在Jetson平台上开发CSI摄像头应用有所帮助!如有问题欢迎留言交流。