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

目录

  • 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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/4594.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mabatis(CRUD)

Mybatis CRUD(数据和配置使用Mybatis快速入门) select标签 选择&#xff0c;查询语句: <select id"getUserById" resultType"com.louis.pojo.User" parameterType"int"></select>id:就是对应namespace中的方法名(就相当于重写了…

【MATLAB第49期】基于MATLAB的深度学习ResNet-18网络不平衡图像数据分类识别模型

【MATLAB第49期】基于MATLAB的深度学习ResNet-18网络不平衡图像数据分类识别模型 一、基本介绍 这篇文章展示了如何使用不平衡训练数据集对图像进行分类&#xff0c;其中每个类的图像数量在类之间不同。两种最流行的解决方案是down-sampling降采样和over-sampling过采样。 在…

一元函数微分学中导数--定义--意义--基本公式--运算法则

目录 导数的定义 左导数和右导数 导数的几何意义和物理意义 几何意义 导数的几何意义--切线的斜率 物理意义 导数的物理意义——瞬时速度 基本初等函数导数公式 基本初等函数 常用基本初等函数导数公式 导数求解的四则运算法则 函数的求导法则 复合函数求导法则 导…

FullGC调优100倍,掌握这3招,吊打JVM调优

前言&#xff1a; 在40岁老架构师尼恩的读者社区&#xff08;50&#xff09;中&#xff0c;很多小伙伴拿不到offer&#xff0c;或者拿不到好的offer。 尼恩经常给大家 优化项目&#xff0c;优化简历&#xff0c;挖掘技术亮点。 在指导简历的过程中&#xff0c; 线上问题排查…

C++引用计数

文章目录 1. 什么是引用计数2. 引用计数的实现3. 示例代码 1. 什么是引用计数 引用计数&#xff08;reference count&#xff09;的核心思想是使用一个计数器来标识当前指针指向的对象被多少类的对象所使用&#xff08;即记录指针指向对象被引用的次数&#xff09;。它允许有多…

MySQL数据库——主从复制

目录 前言一、读写分离概述1. 什么是读写分离&#xff1f;2. 为什么要读写分离呢&#xff1f;3. 什么时候要读写分离&#xff1f;4. 主从复制与读写分离5. mysq支持的复制类型6. 主从复制的工作过程7. MySQL主从复制延迟 二、主从复制配置方法主服务器配置从服务器配置 前言 在…

MySQL的Join

1.Join用法 Join连接两张表,大致分为内连接,外连接,右连接,左连接,自然连接。 内连接又叫等值连接,此时的inner可以省略。 USING语句 MySQL中连接SQL语句中,ON子句的语法格式为:table1.column_name = table2.column_name。当模式设计对联接表的列采用了相同的命名样…

基于matlab使用校准相机拍摄的两张图像中恢复相机运动并重建场景的3D结构(附源码)

一、前言 运动结构 &#xff08;SfM&#xff09; 是从一组 3-D 图像估计场景的 2-D 结构的过程。此示例演示如何从两个图像估计校准相机的姿势&#xff0c;将场景的三维结构重建为未知比例因子&#xff0c;然后通过检测已知大小的对象来恢复实际比例因子。 此示例演示如何从使…

低代码平台在ERP软件中的作用

很多人认为 低代码开发平台的出现颠覆了传统的软件开发模式&#xff0c;对软件开发行业造成冲击&#xff0c;其实低代码开发平台的出现只是提高了软件开发的效率&#xff0c;并不是要颠覆软件开发的模式。低代码平台在erp软件开发中的作用还是比较明显的。下面一起来了解一下相…

《kafka 核心技术与实战》课程学习笔记(九)

客户端都有哪些不常见但是很高级的功能&#xff1f; 什么是 Kafka 拦截器&#xff1f; 拦截器基本思想就是允许应用程序在不修改逻辑的情况下&#xff0c;动态地实现一组可插拔的事件处理逻辑链。它能够在主业务操作的前后多个时间点上插入对应的“拦截”逻辑。Spring MVC 拦…

安科瑞故障电弧探测器在建筑电气的设计与应用

安科瑞 崔丽洁 【摘要】&#xff1a;电气设备是建筑中不可缺少的一部分&#xff0c;具有较为重要的作用和意义&#xff0c;在应用过程中不仅能够提升建筑本身实用性能&#xff0c;而且可为消费者提供更加优良的生活环境。但设备一旦在运行过程中出现故障&#xff0c;不仅会影响…

Flutter卡片分享功能实现:将你的内容分享给世界

前言 在app中&#xff0c;在实现分享功能的时候&#xff0c;通常会有一种以卡片形式展示和分享内容的分享方式。这种功能可以将信息以整洁、易读的方式呈现给用户&#xff0c;使他们能够快速了解内容的关键信息&#xff0c;并将其分享给其他人。那么在这篇文章中&#xff0c;就…