一步一步学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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【C++】定制删除器和特殊类设计(饿汉和懒汉~)

文章目录 定制删除器一、设计一个只能在堆上(或栈上)创建的类二、单例模式 1.饿汉模式2.懒汉模式总结 定制删除器 我们在上一篇文章中讲到了智能指针,相信大家都会有一个问题,智能指针该如何辨别我们的资源是用new int开辟的还是new int[]开辟的呢&…

html5前端学习2

一篇思维题题解: 第五周任务 [Cloned] - Virtual Judge (vjudge.net) http://t.csdn.cn/SIHdM 快捷键: CtrlAltDown 向下选取 CtrlAltUp 向上选取(会出现多个光标,可以同时输入) CtrlEnter …

【Java】Java核心 78:Git 教程(1)Git 概述

文章目录 01.GIT概述目标内容小结 02.GIT相关概念目标内容小结 01.GIT概述 Git是一个分布式版本控制系统,常用于协同开发和版本管理的工具。它可以跟踪文件的修改、记录历史版本,并支持多人协同工作。通过Git,你可以轻松地创建和切换分支、合…

去除小程序home按钮

前言:当我们未登录时,会跳转到登录页,但是这时候登录页左上角会有一个跳转到首页的按钮,但是,我们不希望出现这个回到首页的按钮 去除前: 去除后: 代码: onShow() {wx.hideHomeBut…

从零搭建一台基于ROS的自动驾驶车-----2.运动控制

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 从零搭建一台基于ROS的自动驾驶车-----1.整体介…

VS2022 And QtCreator10 调试 Qt 源码教程

文章目录 背景IDE 调试 Qt 源码Visual Studio 2022Qt Creator 10.0.1 排查思路姊妹篇系列 简 述: 记录使用 Visual Studo 2022 和 QtCreator10 调试 Qt 5.15 源码和 加载 .pdb 的方法。 本文初发于 “偕臧的小站”,同步转载于此。 背景 源码:…

AR项目问题汇总

1、unity使用URP 导致ARFoundation黑屏 (16条消息) unity使用URP 导致ARFoundation黑屏_arfoundation运行iphone黑屏_weixin_46813963的博客-CSDN博客https://blog.csdn.net/weixin_46813963/article/details/117509322Configuring the AR Camera background using a Scriptab…

当RPA遇到ChatGPT, 有哪些好玩的玩法

实在RPA于2023年4月7日发布了 6.7.0 SP3,其中最引人注目的亮点是与ChatGPT的紧密集成 。这种集成为用户提供了全新的玩法和体验,使他们能够与智能模型进行即时对话和交互,从而提高工作效率和创造力。用户可以将ChatGPT作为虚拟助手&#xff0…

java设计模式(二十三)访问者模式

目录 定义模式结构角色职责代码实现适用场景优缺点定义 访问者模式是一种行为型模式,它允许你定义一个作用于某个对象结构中的各个元素的操作,而同时又不改变这些元素的类。该模式的核心思想是将数据结构与数据操作分离,从而可以在不改变数据结构的前提下定义新的操作。 模…

《计算机系统与网络安全》 第十章 防火墙技术

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

MySQL日志详解

♥️作者:小刘在C站 ♥️个人主页: 小刘主页 ♥️努力不一定有回报,但一定会有收获加油!一起努力,共赴美好人生! ♥️学习两年总结出的运维经验,以及思科模拟器全套网络实验教程。专栏&#xf…

Shell脚本编程教程

Shell脚本编程 1.Shell脚本语言的基本结构 1.1 Shell脚本的用途: 自动化常用命令执行系统管理和故障排除创建简单的应用程序处理文本或文件 1.2 Shell脚本基本结构: ​ Shell脚本编程:是基于过程式,解释执行的语言 编程语言…

从0到1精通自动化测试,pytest自动化测试框架,fixture之autouse=True(十二)

一、前言 平常写自动化用例会写一些前置的fixture操作,用例需要用到就直接传该函数的参数名称就行了。当用例很多的时候,每次都传这个参数,会比较麻烦 fixture里面有个参数autouse,默认是Fasle没开启的,可以设置为Tr…

4.27 功率谱

功率信号能量一定是无穷大的 1处解释,由于上述信号是截断信号,只有-T/2 ~ T/2有有效信号,因此有了1式 能量信号和能量密度构成傅里叶变换对 功率信号和功率密度构成傅里叶变换对 自相关函数和他的能量谱或者功率谱构成傅里叶变换对

Java框架之spring 的 AOP 和 IOC

写在前面 本文一起看下spring aop 和 IOC相关的内容。 1:spring bean核心原理 1.1:spring bean的生命周期 spring bean生命周期,参考下图: 我们来一步步的看下。 1 其中1构造函数就是执行类的构造函数完成对象的创建&#x…

代码随想录再战day3

力扣 209移除链表 思路: 第一: 首先明白 链表中的元素是无法被真正的删除的 只能替换指针的指向的元素 第二: 这道题是说移除链表中的目标元素,需要创建一个虚拟节点dummy去始终指向我们的头节点,能够保证我们最后输出…

Yolov5-Face 原理解析及算法解析

YOLOv5-Face 文章目录 YOLOv5-Face1. 为什么人脸检测 一般检测?1.1 YOLOv5Face人脸检测1.2 YOLOv5Face Landmark 2.YOLOv5Face的设计目标和主要贡献2.1 设计目标2.2 主要贡献 3. YOLOv5Face架构3.1 模型架构3.1.1 模型示意图3.1.2 CBS模块3.1.3 Head输出3.1.4 stem…

Ubuntu连不上网,在windows安装docker后

在windows上安装docker后,会依赖于virtualbox虚拟机,并且有虚拟网络,与ubuntu虚拟机网络产生冲突。 解决办法,打开网络适配器,禁用VirtualBox网络 这个时候就可以了。 ubuntu上使用docker pull镜像的时候&#xff0c…

MongoDB简介

目录 1、NoSQL概述 2、什么是MongoDB 3、MongoDB特点 一、MongoDB安装(docker方式) 二、MongoDB安装(普通方式) 三、MongoDB 概念解析 1、NoSQL概述 NoSQL(NoSQL Not Only SQL),意即反SQL运动,指的是…

【AcWing算法基础课】第二章 数据结构(部分待更)

文章目录 前言课前温习一、单链表核心模板1.1题目描述1.2思路分析1.3代码实现 二、双链表核心模板2.1题目描述2.2思路分析2.3代码实现 三、栈核心模板3.1题目描述3.2思路分析3.3代码实现 四、队列核心模板4.1题目描述4.2思路分析4.3代码实现 五、单调栈核心模板5.1题目描述5.2思…