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

news2024/11/15 9:01:43

目录

  • 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.coloradmin.cn/o/709364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习与神经网络阅读笔记(持续更新)

深度学习与神经网络阅读笔记(持续更新) 机器学习基础绪论人工智能主要领域可分为如下:人工智能的发展史:机器学习表示学习深度学习 线性模型Logistic回归Softmax回归感知器支持向量机总结对比 基础模型循环神经网络应用到机器学习…

MongoTemplate手动动态创建(简版)

1、背景 最近遇到一个需求,就是动态获取springboot中MongoTemplate,有哪些mongo数据库在项目启动的时候不确定,运行过程中有可能会增加,也有可能减少。只能通过一个接口获取所有mongo数据库的地址。但是springboot本身提供的mong…

panda3d 模型转换命令复习学习

在此学习了把maya模型转换为panda3d的egg格式; 在Panda3d中转换Maya模型为egg格式并使用pview查看_panda3d egg文件浏览器_bcbobo21cn的博客-CSDN博客 下面继续看一下模型转换命令;列出带 egg 字符串的命令; 先复习一下,可以把m…

Java -- XXL-JOB分布式任务调度平台

XXL-JOB是一个分布式任务调度平台,其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线,开箱即用 xxl是xxl-job的开发者大众点评的【许雪里】名称的拼音开头 官网地址 分布式任务调度平台XXL-JOB 文档地址…

响应数据加密解决方案

需求分析 响应数据加密是一种很重要的安全措施,可以保护数据在传输过程中不被未经授权的用户拦截、窃取或篡改。以下是响应数据加密需求分析: 响应数据必须进行加密: 所有响应数据必须进行加密,以保证数据在传输过程中的安全性。服务器可以采用HTTPS协议对响应数据进行加密…

剑指 Offer 46: 把数字翻译成字符串

这道题先画模型 假设3个数,第一个第二个可以组,第二个第三个可以组。所以有3种 123 && 字母3 && 1字母 当发现有两种操作方法,说明当前方法出错误了,必须立即想别的办法! 除了使用一直除外&#xff…

ad18报错:net antennae:track

画了板子之后发现有这个错误提示,看了图,发现是在一个焊盘下面有2根残留的线,而且线边上出现了天线标志 net antennae的含义是网络天线,这里可以理解为板卡上某个网络的布线形成了天线,但是没有特别标注这一部分是天线…

【Mysql】MySQL体系结构,InnoDB、MyISAM存储引擎,索引结构、分类、语法、性能分析

1. MySQL体系结构 连接层 主要完成一些类似于连接处理、授权认证、及相关的安全方案。在该层上引入了线程池的概念,为通过认证安全接入的客户端提供线程。同样在该层上可以实现基于SSL的安全链接。服务器也会为安全接入的每个客户端验证它所具有的操作权限。 服务层…

(五)Web_Server+网页可视化展示

第一步:先使用nodeJS获取mqtt转发的数据:添加链接描述 第二步:使用fs库,将数据存入txt文件(接上一步,这里没处理数据格式,只是测试) var fsrequire("fs");const mqtt require(mqtt) //存储订阅的消息 var …

Android ConstrainLayout布局中View位置的介绍与使用

一、介绍 ConstrainLayout是一款布局View,再Design库中,现已被大家广泛接受并使用。ConstrainLayout的布局采用的方式和其他都不同,他的对其方式是类似RelativeLayout,但是和RelativeLayout有明显的区别。 在布局渲染的时候&#…

获取Xilinx FPGA芯片IDCODE的4种方法(支持任何FPGA型号)

文章目录 方式1:官方文档方式2:一个头文件方式3:BSDL文件方法4:芯片IDCODE在线搜索网站Xilinx FPGA部分型号IDCODE汇总 方式1:官方文档 对于常用的Spartan-6系列可以在UG380文档中找到对应的IDCODE,Sparta…

CM+CDH 构建企业大数据平台

📢📢📢📣📣📣 哈喽!大家好,我是【IT邦德】,江湖人称jeames007,10余年DBA及大数据工作经验 一位上进心十足的【大数据领域博主】!😜&am…

电磁阀位、通、开/闭原理精髓

一、引用 电磁阀在液/气路系统中,用来实现液路的通断或液流方向的改变,它一般具有一个可以在线圈电磁力驱动下滑动的阀芯,阀芯在不同的位置时,电磁阀的通路也就不同。 阀芯在线圈不通电时处在甲位置,在线圈通电时处在…

ChatGPT助力校招----面试问题分享(八)

1 ChatGPT每日一题:有源和无源滤波器 问题:有源和无源滤波器的区别 ChatGPT:有源滤波器和无源滤波器是指使用不同的电路元件来实现滤波功能的电路 有源滤波器使用了一个或多个有源元件,例如晶体管、运算放大器等,以…

浅浅总结一下雅思听力技巧

1. 地图题 读题步骤要明确 (1)看图,要看看题目中是否有东南西北的标志,如果有的话,那么大概率题目中就会用到。同时也标记好左右的标志,防止考试的时候太紧张分不清。 弄清楚个元素的相对位置&#xff0…

华为OD机试真题 Python 实现【开心消消乐】【2023 B卷 100分】,附详细解题思路

目录 一、题目描述二、输入描述三、输出描述四、Python算法源码五、效果展示1、输入2、输出3、说明 一、题目描述 给定一个N行M列的二维矩阵,矩阵中每个位置的数字取值为0或1。矩阵示例如: 1 1 0 0 0 0 0 1 0 0 1 1 1 1 1 1 现需要将矩阵中所有的1进行…

卷积神经网络--猫狗系列之构建模型【ResNet50】

在上一期:卷积神经网络--猫狗系列之下载、导入数据集,如果测试成功就说明对数据的预处理工作已经完成,接下来就是构建模型阶段了: 据说建立一个神经网络模型比较简单,只要了解了各层的含义、不同层之间参数的传递等等&…

leetcode 1232. 缀点成线

题目描述解题思路执行结果 leetcode 1232. 缀点成线 题目描述 缀点成线 给定一个数组 coordinates ,其中 coordinates[i] [x, y] , [x, y] 表示横坐标为 x、纵坐标为 y 的点。请你来判断,这些点是否在该坐标系中属于同一条直线上。 示例 1&a…

进程的调度常用算法

目录 先来先服务(FCFS)调度算法 短作业优先(SJF)的调度算法 基于时间片的轮转调度(RR)算法 先来先服务(FCFS)调度算法 系统将按照作业到达的先后次序来进行作业调度,或…

RT-Thread 5.0.1 qemu-virt64-aarch64 解决网络问题

参考文章 qemu 源码编译 qemu-system-aarch64 的方法 RT-Thread 5.0.1 qemu-virt64-aarch64 解决编译问题 前言 最近需要使用 RT-Thread qemu-virt64-aarch64,验证 aarch64 平台,也就是 ARM64 平台的一些网络功能,需要开启 qemu-virt64-aa…