当前位置: 首页 > news >正文

OAK深度相机使用不同镜头和本地视频流进行模型推理

编辑:OAK中国
首发:oakchina.cn
喜欢的话,请多多👍⭐️✍
内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。

▌前言

Hello,大家好,这里是OAK中国,我是助手君。

最近朋友们有几条共性的问题,比如:

  • 为啥检测框在深度图位置不对啊?
  • 能不能将本地视频流作为输入啊?
  • 能不能加上测距啊?

这篇博客总结了所有这些问题的参考代码,欢迎三连食用~

使用 oak 的 LEFTRIGHTRGB 相机和视频流VIDEO进行 YOLO 检测

▌RGB

使用 RGB 相机作为输入源

...
camRgb = pipeline.create(dai.node.ColorCamera)
detectionNetwork = pipeline.create(dai.node.YoloDetectionNetwork)
...
camRgb.setPreviewSize(W, H)
...
camRgb.preview.link(detectionNetwork.input)
...

详见:yolov6-rgb.py

▌RGB + DEPTH

使用 RGB 相机作为输入源,并附加深度信息

...
camRgb = pipeline.create(dai.node.ColorCamera)
spatialDetectionNetwork = pipeline.create(dai.node.YoloSpatialDetectionNetwork)
monoLeft = pipeline.create(dai.node.MonoCamera)
monoRight = pipeline.create(dai.node.MonoCamera)
stereo = pipeline.create(dai.node.StereoDepth)
...
camRgb.setPreviewSize(W, H)
...
monoLeft.setBoardSocket(dai.CameraBoardSocket.LEFT)
monoRight.setBoardSocket(dai.CameraBoardSocket.RIGHT)
...
# 将深度图与 RGB 相机的视角对齐,在其上进行推理
stereo.setDepthAlign(dai.CameraBoardSocket.RGB)
stereo.setOutputSize(monoLeft.getResolutionWidth(), monoLeft.getResolutionHeight())
...
monoLeft.out.link(stereo.left)
monoRight.out.link(stereo.right)camRgb.preview.link(spatialDetectionNetwork.input)
stereo.depth.link(spatialDetectionNetwork.inputDepth)
...

详见:yolov6-rgb-spatial.py

▌RIGHT

使用 RIGHT 相机作为输入源

...
monoRight = pipeline.create(dai.node.MonoCamera)
detectionNetwork = pipeline.create(dai.node.YoloDetectionNetwork)
imageManip = pipeline.create(dai.node.ImageManip)
...
monoRight.setBoardSocket(dai.CameraBoardSocket.RIGHT)
...
# NN 模型需要 BGR 输入。默认情况下 ImageManip 输出类型与输入相同(在本例中为灰色)
imageManip.initialConfig.setFrameType(dai.ImgFrame.Type.BGR888p)
imageManip.initialConfig.setResize(W, H)
imageManip.setMaxOutputFrameSize(W * H * 3)
...
monoRight.out.link(imageManip.inputImage)
imageManip.out.link(detectionNetwork.input)
...

详见:yolov6-right.py

▌RIGHT + DEPTH

使用 RIGHT 相机作为输入源,并附加深度信息

...
monoLeft = pipeline.create(dai.node.MonoCamera)
monoRight = pipeline.create(dai.node.MonoCamera)
spatialDetectionNetwork = pipeline.create(dai.node.YoloSpatialDetectionNetwork)
stereo = pipeline.create(dai.node.StereoDepth)
imageManip = pipeline.create(dai.node.ImageManip)
...
monoLeft.setBoardSocket(dai.CameraBoardSocket.LEFT)
monoRight.setBoardSocket(dai.CameraBoardSocket.RIGHT)
...
# NN 模型需要 BGR 输入。默认情况下 ImageManip 输出类型与输入相同(在本例中为灰色)
imageManip.initialConfig.setFrameType(dai.ImgFrame.Type.BGR888p)
imageManip.initialConfig.setResize(W, H)
imageManip.setMaxOutputFrameSize(W * H * 3)
...
# 将深度图与 RIGHT 相机的视角对齐,在其上进行推理
stereo.setDepthAlign(dai.RawStereoDepthConfig.AlgorithmControl.DepthAlign.RECTIFIED_RIGHT
)
stereo.setOutputSize(monoLeft.getResolutionWidth(), monoLeft.getResolutionHeight())
...
monoLeft.out.link(stereo.left)
monoRight.out.link(stereo.right)imageManip.out.link(spatialDetectionNetwork.input)stereo.rectifiedRight.link(imageManip.inputImage)
stereo.depth.link(spatialDetectionNetwork.inputDepth)
...

详见:yolov6-right-spatial.py

▌LEFT

使用 LEFT 相机作为输入源

...
monoLeft = pipeline.create(dai.node.MonoCamera)
detectionNetwork = pipeline.create(dai.node.YoloDetectionNetwork)
imageManip = pipeline.create(dai.node.ImageManip)
...
monoLeft.setBoardSocket(dai.CameraBoardSocket.LEFT)
...
# NN 模型需要 BGR 输入。默认情况下 ImageManip 输出类型与输入相同(在本例中为灰色)
imageManip.initialConfig.setFrameType(dai.ImgFrame.Type.BGR888p)
imageManip.initialConfig.setResize(W, H)
imageManip.setMaxOutputFrameSize(W * H * 3)
...
monoLeft.out.link(imageManip.inputImage)
imageManip.out.link(detectionNetwork.input)
...

详见:yolov6-left.py

▌LEFT + DEPTH

使用 LEFT 相机作为输入源,并附加深度信息

...
monoLeft = pipeline.create(dai.node.MonoCamera)
monoRight = pipeline.create(dai.node.MonoCamera)
spatialDetectionNetwork = pipeline.create(dai.node.YoloSpatialDetectionNetwork)
stereo = pipeline.create(dai.node.StereoDepth)
imageManip = pipeline.create(dai.node.ImageManip)
...
monoLeft.setBoardSocket(dai.CameraBoardSocket.LEFT)
monoRight.setBoardSocket(dai.CameraBoardSocket.RIGHT)
...
# NN 模型需要 BGR 输入。默认情况下 ImageManip 输出类型与输入相同(在本例中为灰色)
imageManip.initialConfig.setFrameType(dai.ImgFrame.Type.BGR888p)
imageManip.initialConfig.setResize(W, H)
imageManip.setMaxOutputFrameSize(W * H * 3)
...
# 将深度图与 LEFT 相机的视角对齐,在其上进行推理
stereo.setDepthAlign(dai.RawStereoDepthConfig.AlgorithmControl.DepthAlign.RECTIFIED_LEFT
)
stereo.setOutputSize(monoLeft.getResolutionWidth(), monoLeft.getResolutionHeight())
...
monoLeft.out.link(stereo.left)
monoRight.out.link(stereo.right)
​
imageManip.out.link(spatialDetectionNetwork.input)
​
stereo.rectifiedLeft.link(imageManip.inputImage)
stereo.depth.link(spatialDetectionNetwork.inputDepth)
...

详见:yolov6-left-spatial.py

▌VIDEO

使用 VIDEO 作为输入源

...
xinFrame = pipeline.create(dai.node.XLinkIn)
detectionNetwork = pipeline.create(dai.node.YoloDetectionNetwork)
...
xinFrame.setStreamName("inFrame")
...
xinFrame.out.link(detectionNetwork.input)
...
# 输入队列将用于将视频帧发送到设备。
inFrameQueue = device.getInputQueue(name="inFrame")
...
img = dai.ImgFrame()
img.setData(to_planar(frame, (W, H)))
img.setTimestamp(monotonic())
img.setWidth(W)
img.setHeight(H)
inFrameQueue.send(img)
...

详见:yolov6-video.py

▌参考资料

https://docs.oakchina.cn/en/latest/
https://www.oakchina.cn/selection-guide/


OAK中国
| OpenCV AI Kit在中国区的官方代理商和技术服务商
| 追踪AI技术和产品新动态

戳「+关注」获取最新资讯↗↗

相关文章:

OAK深度相机使用不同镜头和本地视频流进行模型推理

编辑:OAK中国 首发:oakchina.cn 喜欢的话,请多多👍⭐️✍ 内容可能会不定期更新,官网内容都是最新的,请查看首发地址链接。 ▌前言 Hello,大家好,这里是OAK中国,我是助手…...

[项目] Boost搜索引擎

目录 1.项目相关背景 2.项目宏观原理 3.技术栈和项目环境 4.正排索引&&倒排索引 5.去标签与数据清洗 6.构建索引模块Index 6.1正排索引 6.2 建立倒排 jiebacpp使用 建立分词 7.搜索引擎模块Searcher Jsoncpp -- 通过jsoncpp进行序列化和反序列化 处理Cont…...

解决新版QGIS找不到Georeferencer插件

目录1. 问题分析1.1 去 Raster 找,没找到1.2 去插件搜,未搜到1.3 插件库里也搜不到2. 解决办法在 QGIS 3.30中,按常规办法,找不到 Georeferencer插件,它并没有被安装,在库中也找不到它, 请问问题…...

c---冒泡排序模拟qsort

一、冒泡排序 二、冒泡排序优化排各种类型数据 文章目录一、冒泡排序二、冒泡排序优化排各种类型数据冒泡排序 冒泡排序原理&#xff1a;两两相邻元素进行比较 初级版 void bulle_sort(int* a, int sz) {int i 0;for (int i 0; i < sz-1; i){int j 0; for (j 0; j…...

Java知识复习(十四)JS

1、数据类型 基本数据类型&#xff1a;null、undefinde、boolean、string、number、symbol&#xff08;ES6新增&#xff09;引用数据类型&#xff1a;Function、Array、Object、Map和Set&#xff08;ES6新增&#xff09; 2、let、var和const的区别 var定义的变量&#xff0c…...

代码随想录刷题-数组-移除元素

文章目录写在前面习题我的想法暴力解法双指针写在前面 本节对应代码随想录中&#xff1a;代码随想录 习题 题目链接&#xff1a; 27. 移除元素- 力扣&#xff08;LeetCode&#xff09; 给你一个数组 nums 和一个值 val&#xff0c;你需要原地移除所有数值等于 val 的元素&a…...

聚观早报 |拼多多跨境电商业务正式登陆澳洲;中国加快6G网络研发

今日要闻&#xff1a;拼多多跨境电商业务正式登陆澳洲&#xff1b;全球自动驾驶公司排名特斯拉垫底&#xff1b;中国将加快 6G 网络研发&#xff1b;B站再次“崩”上热搜&#xff01;已闪电修复&#xff1b;微软将必应AI聊天每次对话上限增加至8条拼多多跨境电商业务正式登陆澳…...

MDK Keil5 创建Stm32工程-理论篇(这里以Stm32F103Zet6为例)

一、文件夹创建与文件说明整个工程可以粗略的划分为几个文件夹&#xff1a;BSP底层驱动比如GPIO\Timer等驱动文件CMSIS内核相关的文件Firmware生成的固件下载文件Mycode用户编写的相关文件&#xff0c;主要编写的文件都在这个文件夹里Project工程文件startup芯片启动文件STM32F…...

应届大学生学什么技术好?哪些技术适合年轻人?

到了毕业季&#xff0c;应届大学生面临的就是就业问题&#xff0c;很多专业的大学生难以找到对口的工作&#xff0c;或是不得已随便就业&#xff0c;或者是学个技术高薪就业&#xff0c;那么&#xff0c;问题来了&#xff0c;应届大学生学什么技术好&#xff1f;哪些技术适合年…...

车企数据分类分级的实践指南出炉!“数据安全推进计划”发布,奇点云参编

日前&#xff0c;“数据安全推进计划”&#xff08;DSI&#xff09;正式发布《智能网联汽车数据分类分级实践指南》&#xff08;下文简称“指南”&#xff09;&#xff0c;旨在以合规为主要导向&#xff0c;明确智能网联汽车数据分类分级的方法论&#xff0c;为数据全生命周期的…...

Nginx学习 (2) —— 虚拟主机配置

文章目录虚拟主机原理域名解析与泛域名解析&#xff08;实践&#xff09;配置文件中ServerName的匹配规则技术架构多用户二级域名短网址虚拟主机原理 为什么需要虚拟主机&#xff1a; 当一台主机充当服务器给用户提供资源的时候&#xff0c;并不是一直都有很大的用户量&#…...

Java 动态代理简述和实例

Java动态代理是一种在运行时动态创建代理对象的技术。它可以让我们在不修改原始代码的情况下&#xff0c;对原始对象进行增强或者添加额外的行为。这种代理方式可以用于很多场景&#xff0c;例如AOP编程、RPC框架等。动态代理是基于Java反射机制实现的&#xff0c;它允许程序在…...

Unity编译器扩展(Advanced Editor Scripting)

Untiy编译器扩展允许我们对编译器的增加自己编写的的功能菜单栏MenuItemContextMenu和ContextMenuItemContextMenuContextMenuItemMenuItem 该属性允许您将菜单项添加到主菜单和检查器窗口上下文菜单。 该属性将任何静态函数转换为菜单命令。只有静态函数可以使用该属性。 Men…...

AFR机制及流程介绍

AFR(Auto Fast Return)不符合3GPP协议标准,因此终端默认是disable状态。如果运营商有要求可以配置开启。 AFR有两种场景 2G或者3G AFR到4G4G AFR到5G3G AFR TO 4G AFR到LTE功能的作用就是终端从LTE Handover或者重定向到3G进行业务,等业务做完后能够快速回到LTE网络。...

9.Hbase 部署

9.Hbase部署 注意事项&#xff1a; 1&#xff1a;必须事先安装 Hadoop分布式集群&#xff0c;zookeeper分布式集群 2&#xff1a;查看版本号&#xff1a; hbase version1、解压文件并改名 tar -zxvf /opt/software/hbase-2.2.3-bin.tar.gz -C /usr/app/ mv hbase-2.2.3/ hba…...

【maven 学习记录】

maven 学习记录一、maven基础1. maven是什么2. maven的作用3. maven的下载安装4. maven仓库5. maven坐标6. 第一个maven项目 手工实现7. maven插件8. 依赖管理9. 生命周期二、maven进阶一、maven基础 1. maven是什么 maven的本质是一个项目管理工具&#xff0c;将项目开发和管…...

NB-IOT宣传这么多年,这次总算用好了吧

一、方案概述随着实体经济快速发展&#xff0c;石化、港口、货场、工地等区域规模日益扩大&#xff0c;厂区面积广阔、环境复杂、作业人员和车辆众多&#xff0c;如无法实时掌握工作人员状态及外来人员位置、外来车辆情况等问题&#xff0c;将存在非常大的安全隐患。今天小编介…...

sort函数对结构体|pair对组|vector容器|map排序|二维数组的第x列 的排序

目录 sort对 vector容器 sort对 vector<pair<int,int>>对组 sort对 结构体 结构体外部规定排序 结构体内部运算符重载 map容器的排序 map的键排序 map的值排序 sort对二维数组的排序 sort对 vector容器 sort()函数可以用于对vector容器进行排序。具体来…...

Java定时器Timer的使用

一、Timer常用方法 Timer应用场景&#xff1a; 1、每隔一段时间执行指定的代码逻辑&#xff08;即按周期执行任务&#xff09; 2、指定时间执行指定的代码逻辑 为方便测试并查看运行效果&#xff0c;首先先建一个类并继承TimerTask&#xff0c;代码如下: package timerTest…...

MySQL安装和配置

下载官网下载mysql解压版本&#xff1a;配置环境变量下载完成后直接解压到需要放的文件夹&#xff0c;根据文件夹来配置环境变量&#xff1b;新建系统变量&#xff0c;变量名自取&#xff0c;值是MySQL的目录编辑path环境变量&#xff0c;加上MySQL的bin目录 %MYSQL_HOME%\bin配…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

React第五十七节 Router中RouterProvider使用详解及注意事项

前言 在 React Router v6.4 中&#xff0c;RouterProvider 是一个核心组件&#xff0c;用于提供基于数据路由&#xff08;data routers&#xff09;的新型路由方案。 它替代了传统的 <BrowserRouter>&#xff0c;支持更强大的数据加载和操作功能&#xff08;如 loader 和…...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接&#xff1a;A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串&#xff0c;只有在同时为 o 时输出 Yes 并结束程序&#xff0c;否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

2.Vue编写一个app

1.src中重要的组成 1.1main.ts // 引入createApp用于创建应用 import { createApp } from "vue"; // 引用App根组件 import App from ./App.vue;createApp(App).mount(#app)1.2 App.vue 其中要写三种标签 <template> <!--html--> </template>…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)

参考官方文档&#xff1a;https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java&#xff08;供 Kotlin 使用&#xff09; 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存

文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

LeetCode - 199. 二叉树的右视图

题目 199. 二叉树的右视图 - 力扣&#xff08;LeetCode&#xff09; 思路 右视图是指从树的右侧看&#xff0c;对于每一层&#xff0c;只能看到该层最右边的节点。实现思路是&#xff1a; 使用深度优先搜索(DFS)按照"根-右-左"的顺序遍历树记录每个节点的深度对于…...

Redis:现代应用开发的高效内存数据存储利器

一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发&#xff0c;其初衷是为了满足他自己的一个项目需求&#xff0c;即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源&#xff0c;Redis凭借其简单易用、…...

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅!

【把数组变成一棵树】有序数组秒变平衡BST,原来可以这么优雅! 🌱 前言:一棵树的浪漫,从数组开始说起 程序员的世界里,数组是最常见的基本结构之一,几乎每种语言、每种算法都少不了它。可你有没有想过,一组看似“线性排列”的有序数组,竟然可以**“长”成一棵平衡的二…...