目录
- Setup 1: 创建文件
- Setup 2: 安装依赖
- Setup 3: 导入需要的包
- Setup 4: 创建pipeline
- Setup 5: 创建节点
- Setup 6: 设置节点的属性和参数。
- Setup 7: 建立链接关系
- Setup 8: 连接设备并启动管道
- Setup 9: 创建与DepthAI设备通信的输入队列和输出队列
- Setup 10: 主循环
- 获取视频帧
- 显示从`videoIn`对象中获取的视频帧
- 等待用户按键输入
- Setup 11:运行程序
Setup 1: 创建文件
- 创建新建4-rgb-video文件夹
- 用vscode打开该文件夹
- 新建一个main.py 文件
Setup 2: 安装依赖
安装依赖前需要先创建和激活虚拟环境,我这里已经创建了虚拟环境OAKenv,在终端中输入cd…退回到OAKenv的根目录,输入 OAKenv\Scripts\activate
激活虚拟环境
安装pip依赖项:
pip install numpy opencv-python depthai blobconverter --user
Setup 3: 导入需要的包
在main.py中导入项目需要的包
import cv2
import depthai as dai
Setup 4: 创建pipeline
pipeline = dai.Pipeline()
Setup 5: 创建节点
camRgb = pipeline.create(dai.node.ColorCamera)
xoutVideo = pipeline.create(dai.node.XLinkOut)
xoutVideo.setStreamName("video")
创建一个ColorCamera节点和一个XLinkOut节点,并设置了视频输出流的名称。
使用pipeline.create(dai.node.ColorCamera)
创建了一个ColorCamera节点对象,该节点用于捕获摄像头的图像。
使用pipeline.create(dai.node.XLinkOut)
创建了一个XLinkOut节点对象,用于将图像数据输出到XLink连接的外部设备。
使用xoutVideo.setStreamName("video")
设置了输出流的名称为"video",这个名称将被用于在后续的连接中进行数据流的标识和匹配。
Setup 6: 设置节点的属性和参数。
camRgb.setBoardSocket(dai.CameraBoardSocket.RGB)
camRgb.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P)
camRgb.setVideoSize(1920, 1080)
xoutVideo.input.setBlocking(False)
xoutVideo.input.setQueueSize(1)
设置了ColorCamera节点和XLinkOut节点的一些属性和参数。
首先,使用camRgb.setBoardSocket(dai.CameraBoardSocket.RGB)
指定摄像头插槽为RGB插槽。这是告诉DepthAI库连接的摄像头位于RGB插槽上。
接下来,使用camRgb.setResolution(dai.ColorCameraProperties.SensorResolution.THE_1080_P)
设置图像传感器的分辨率为1080p。这将告诉DepthAI库使用1080p分辨率来获取摄像头图像。
然后,使用camRgb.setVideoSize(1920, 1080)
设置视频输出的大小为1920x1080像素。这将确保从摄像头捕获的图像以1920x1080分辨率进行输出。
接着,使用xoutVideo.input.setBlocking(False)
设置XLinkOut节点的输入为非阻塞模式。这意味着当没有数据可用时,获取数据的操作将不会被阻塞。
最后,使用xoutVideo.input.setQueueSize(1)
设置输入队列的大小为1。这将限制XLinkOut节点输入队列中的数据个数,确保只有一个最新的数据帧被保留。
Setup 7: 建立链接关系
camRgb.video.link(xoutVideo.input)
创建了ColorCamera节点的视频输出流与XLinkOut节点的输入流之间的连接。
使用camRgb.video.link(xoutVideo.input)
函数将ColorCamera节点的视频输出流与XLinkOut节点的输入流进行连接。这样,摄像头采集到的图像数据将会被发送到XLinkOut节点,准备输出到外部设备。
Setup 8: 连接设备并启动管道
with dai.Device(pipeline) as device:
Setup 9: 创建与DepthAI设备通信的输入队列和输出队列
video = device.getOutputQueue(name="video", maxSize=1, blocking=False)
这段代码创建了一个名为"video"的输出队列,并将其与设备进行了关联。
使用device.getOutputQueue(name="video", maxSize=1, blocking=False)
函数创建了一个名为"video"的输出队列。该队列将用于从设备中获取视频数据。
name
参数指定了队列的名称为"video"。
maxSize
参数指定了队列的最大大小为1。这意味着队列中最多只能存储一个视频帧。
blocking
参数设置为False
,表示当队列为空时,获取数据的操作将不会被阻塞。
Setup 10: 主循环
while True:
获取视频帧
videoIn = video.get()
从名为"video"的输出队列中获取视频帧。
使用videoIn = video.get()
函数从输出队列中获取视频帧。这行代码将会阻塞程序,直到视频帧被放入到队列中才会继续执行。
视频帧将被赋值给变量videoIn
,我们可以进一步使用这个变量来处理视频帧的数据。
显示从videoIn
对象中获取的视频帧
cv2.imshow("video", videoIn.getCvFrame())
使用OpenCV库中的imshow
函数显示从videoIn
对象中获取的视频帧。
具体来说,cv2.imshow("video", videoIn.getCvFrame())
的作用是:
videoIn.getCvFrame()
是从videoIn
对象中获取当前的视频帧。getCvFrame()
是一个自定义方法,它返回一个OpenCV图像格式的视频帧。cv2.imshow("video", video_frame)
用于在名为"video"的窗口中显示视频帧。第一个参数是窗口名称,第二个参数是要显示的图像。
等待用户按键输入
if cv2.waitKey(1) == ord('q'):
break
这段代码是用来实现一个按键退出的逻辑,允许用户按下键盘上的q
键来停止显示视频帧。
cv2.waitKey(1)
是一个用来等待键盘输入的函数,其中参数表示等待的时间(以毫秒为单位)。如果在等待的时间内有键盘输入,cv2.waitKey(1)
将返回一个非负整数,表示按下的键的ASCII值。
ord('q')
将字符'q'
转换为对应的ASCII值。在这里,if cv2.waitKey(1) == ord('q'):
表示如果用户按下了键盘上的q
键,就执行下面的代码块。
在这个代码块中,break
语句用来跳出循环,从而终止视频的显示。
Setup 11:运行程序
在终端中输入如下指令运行程序
python main.py
运行效果如下