一步一步学OAK之四:实现如何在低延迟下使用高分辨率视频

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

运行效果如下
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/w137160164/article/details/131447587