因为Jetson Nano是一款AI边缘计算开发板,所以用它来做嵌入式AI项目是很合适的。本文将详细介绍Jetson Nano如何通过OpenCV调用CSI摄像头(IMX219)和USB摄像头。
sudo apt install v4l-utils
ls /dev/video*
我这里video0和video1是CSI摄像头,video2是USB摄像头。
v4l2-ctl --device=/dev/video0 --list-formats-ext
RG10:代表这个摄像头的数据格式;
10-bit Bayer RGRG/GBGB:是进一步说明该格式使用的算法与通道对应的参数;
3264x2464、3264x1848、1920x1080、1640x1232、1280x720:代表尺寸;
Interval为性能参数,表示所支持的分辨率及该分辨率的最高执行帧率。
终端输入以下代码,检测摄像头能否正常打开。
nvgstcapture
Jetson Nano默认安装了OpenCV 4.1.1版本。
安装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
# 设置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("打开摄像头失败")
安装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
#CSI-0
camera0 = CSICamera(capture_device=0, width=224, height=224)
image0 = camera0.read()
print(image0.shape)
print(camera0.value.shape)
#CSI-1
#camera1 = CSICamera(capture_device=1, width=224, height=224)
#image1 = camera1.read()
#print(image1.shape)
#print(camera1.value.shape)
while 1:
image0 = camera0.read()
CV2.imshow("CSI Camera0", image0)
#image1 = camera1.read()
#CV2.imshow("CSI Camera1", image1)
kk = CV2.waitKey(1)
if kk == ord('q'): #按下q键,退出
break
相比于CSI摄像头,利用OpenCV调用USB摄像头要简单的多。
示例
import cv2
cap = cv2.VideoCapture(dev) # dev表示Jetson Nnao上USB的设备号,上面查看摄像头挂载情况那里提到我的USB是video2,故我这里dev = 2
while(1):
ret,frame = cap.read() #ret:True/False,代表有没有读到图片 frame:当前截取一帧的图片
cv2.imshow("capture",frame)
if (cv2.waitKey(1) & 0xFF) == ord('q'):
break
cap.release()
cv2.destroyAllWindows()
本文介绍了Jetson Nano如何通过OpenCV调用我们平时常用的两种摄像头(CSI和USB)。注意:CSI摄像头不像USB一样支持热插拔,所以千万不能带电插拔CSI摄像头。