新品Coming Soon!OAK-D-SR-PoE:使用3D+AI视觉结合ToF实现箱体测量和鉴别!

OAKChina 新品:OAK-D SR PoE结合ToF实现箱体检测

3D+AI解决方案提供商

手动测量箱体、缺陷、大小等操作可能是一项繁琐并且劳累而机械的任务,但OAK中国本次将提供了更好的解决方案:3D+AI视觉处理箱体的识别和检测,使用了即将发布的全新3D+AI相机:OAK-D-SR PoE,利用了前沿的视觉处理技术结合AI快速准确地确定箱子的尺寸。本文将对这款应用程序的工作原理及其背后的技术做一个简单的介绍。

6.28新品箱体检测演示

工作原理

以下是分布说明:

  1. 框检测:AI 识别框。使用 Roboflow 训练自定义对象检测 NN 模型。
    Model & API (roboflow.com)
  2. 数据捕获:ToF 深度传感器与设备上的彩色流对齐,并提供准确的 RGB-D 流。应用程序将根据(填充的)边界框裁剪深度图,并提供仅框的点云,从而获得最佳效果。
  3. 分析:使用 Open3D 库Open3D – A Modern Library for 3D Data Processing和自定义算法,我们首先估计框的顶面,然后使用 OpenCV 提取顶面的最小面积(以获得宽度和长度)。一旦我们有了框的顶面和地面,我们也可以计算框的高度。我们开发了 [BoxEstimator]类,它封装了此应用程序的数据处理。
  4. 可视化:Depthai-viewer(基于 Rerun)用于清晰、直观地表示结果;带有框检测的彩色帧(以及尺寸)、深度图和稀疏/密集点云。

行业应用

事实上,有很多行业都可以从此类解决方案中受益,这里我们列举一些用户的实际案例:

电子商务/零售:测量运输箱以优化包装尺寸并降低成本。

制造:确保产品尺寸符合规格,包装缺陷、无需人工检查,全程自动化24小时连轴运转。

物流:实现全称自动化分拣、分类,以视觉AI的方案完成全程自动化工作,加速库仓包裹分类速度。

精度尺寸

我们仍在努力改进,但视频显示每个尺寸的误差小于 5 毫米,以下是 GT 尺寸供参考:

箱子尺寸为 26.5 x 30 厘米,高 20 厘米
箱子尺寸为 18.5 x 28 厘米,高 18 厘米
箱子尺寸为 11 x 20 厘米,高 7.5 厘米

OAK-D SR PoE (短距离 带ToF)

我们以 全新产品:OAK-D-SR-POE(几周后将会首次发布!)为基础开发了此应用,因为它借助 ToF 传感器实现了最佳近距离感知。它还具有边缘 AI 推理功能,是此应用的完美候选者。

ToF传感器的深度误差在室内<1%,在室外<2%。

OAK -D SR PoE

OAK - D SR PoE

一样,附上源码:

from depthai_sdk import OakCamera
from depthai_sdk.classes.packets import DetectionPacket, PointcloudPacket
from depthai_sdk.classes.box_estimator import BoxEstimator
import depthai_viewer as viewer
import cv2
import subprocess
import select
import sys

FPS = 10.0
box = BoxEstimator(median_window=10)

with OakCamera() as oak:
    try:
        subprocess.Popen([sys.executable, "-m", "depthai_viewer", "--viewer-mode"], stdout=subprocess.PIPE,
                                        stderr=subprocess.PIPE)
    except subprocess.TimeoutExpired:
        pass
    viewer.init("Depthai Viewer")
    viewer.connect()

    color = oak.create_camera('cam_c', resolution='800p', fps=20)

    model_config = {
        'source': 'roboflow', # Specify that we are downloading the model from Roboflow
        'model':'cardboard-box-u35qd/1',
        'key':'dDOP8nC4A9rZzWUTG8ia' # Fake API key, replace with your own!
    }
    nn = oak.create_nn(model_config, color)
    nn.config_nn(conf_threshold=0.85)

    tof = oak.create_tof(fps=20)
    tof.set_align_to(color, output_size=(640, 400))
    tof.configure_tof(phaseShuffleTemporalFilter=True,
                      phaseUnwrappingLevel=2,
                      phaseUnwrapErrorThreshold=100)

    pointcloud = oak.create_pointcloud(tof)

    q = oak.queue([
        pointcloud.out.main.set_name('pcl'),
        tof.out.main.set_name('tof'),
        nn.out.main.set_name('nn'),
    ]).configure_syncing(enable_sync=True, threshold_ms=500//FPS).get_queue()
    # oak.show_graph()
    oak.start()

    viewer.log_rigid3(f"Right", child_from_parent=([0, 0, 0], [0, 0, 0, 0]), xyz="RDF", timeless=True)
    viewer.log_rigid3(f"Cropped", child_from_parent=([0, 0, 0], [1, 0, 0, 0]), xyz="RDF", timeless=True)

    def draw_mesh():
        pos,ind,norm = box.get_plane_mesh(size=500)
        viewer.log_mesh("Right/Plane", pos, indices=ind, normals=norm, albedo_factor=[0.5,1,0], timeless=True)

    if box.is_calibrated():
        draw_mesh()
    else:
        print("Calibrate first, write 'c' in terminal when most of the view is flat floor!!")

    while oak.running():
        packets = q.get()

        nn: DetectionPacket = packets["nn"]
        cvFrame = nn.frame[..., ::-1] # BGR to RGB
        depth = packets["tof"].frame
        pcl_packet: PointcloudPacket = packets["pcl"]
        points = pcl_packet.points

        # Convert 800P into 400P into 256000x3
        colors_640 = cv2.pyrDown(cvFrame).reshape(-1, 3)
        viewer.log_points("Right/PointCloud", points.reshape(-1, 3), colors=colors_640)
        # Depth map visualize
        viewer.log_depth_image("depth/frame", depth, meter=1e3)
        viewer.log_image("video/color", cvFrame)

        if box.is_calibrated():
            if 0 == len(nn.detections):
                continue # No boxes found
            # Currently supports only 1 detection (box) at a time
            det = nn.detections[0]
            # Get the bounding box of the detection (relative to full frame size)
            # Add 10% padding on all sides
            box_bb = nn.bbox.get_relative_bbox(det.bbox)
            padded_box_bb = box_bb.add_padding(0.1)
            points_roi = pcl_packet.crop_points(padded_box_bb).reshape(-1, 3)

            dimensions, corners = box.process_points(points_roi)
            if corners is None:
                continue

            viewer.log_points("Cropped/Box_PCL", box.box_pcl)
            viewer.log_points("Cropped/Plane_PCL", box.plane_pcl, colors=(0.2,1.0,0.6))
            # viewer.log_points("Cropped/TopSide_PCL", box.top_side_pcl, colors=(1,0.3,0.6))
            viewer.log_points(f"Cropped/Box_Corners", corners, radii=8, colors=(1.0,0,0.0))

            corners = box.inverse_corner_points()
            viewer.log_points(f"Right/Box_Corners", corners, radii=8, colors=(1.0,0,0.0))
            viewer.log_line_segments(f"Right/Box_Edges", box.get_3d_lines(corners), stroke_width=4, color=(1.0,0,0.0))

            l,w,h = dimensions
            label = f"{det.label_str} ({det.confidence:.2f})\n{l/10:.1f} x {w/10:.1f}\nH: {h/10:.1f} cm"
            viewer.log_rect('video/bbs',
                    box_bb.to_tuple(cvFrame.shape),
                    label=label,
                    rect_format=viewer.RectFormat.XYXY)
            viewer.log_rect('depth/bbs',
                    padded_box_bb.to_tuple(depth.shape),
                    label="Padded BoundingBox",
                    rect_format=viewer.RectFormat.XYXY)

        key = oak.poll()
        ready, _, _ = select.select([sys.stdin], [], [], 0.001) # Terminal input
        if ready:
            key = sys.stdin.readline().strip()
        if key == 'c':
            if box.calibrate(points):
                print(f"Calibrated Plane: {box.ground_plane_eq}")
                draw_mesh()

OAK中国 丨 3D+AI 解决方案提供商

如果你初次遇见OAK,请看这个视频:BV1u84y1p73d
或者来这里系统查看一下:https://www.oakchina.cn/intro/
shopping直通车在这里:https://www.oakchina.cn/shop/
私信我发送1,邀请加入OAK官方群,每周开源项目、免费CV模型、优惠活动及时掌握,还可以咨询技术、项目应用等等。😉


```
OAK中国 | 追踪AI技术和产品新动态
公众号 | OAK视觉人工智能开发
戳「+关注」获取最新资讯↗↗
如果喜欢,请一键三连吧~比心❤️
```

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

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

相关文章

在Ubuntu上安装VNC服务器教程

Ubuntu上安装VNC服务器方法&#xff1a;按照root安装TeactVnc&#xff0c;随后运行vncserver输入密码&#xff0c;安装并打开RickVNC客户端&#xff0c;输入服务器的IP&#xff0c;最后连接输入密码即可。 VNC或虚拟网络计算&#xff0c;可让您连接到远程Linux / Unix服务器的…

力扣 刷题 使用双指针进行数组去重分析

目录 双指针 一、26.删除有序数组中的重复项 题目 题解 二、80. 删除有序数组中的重复项 II 题目 题解 三、27. 移除元素 题目 题解 双指针 我们这里所说的双指针实际上并不是真正的指针&#xff0c;它只是两个变量&#xff0c;用于标识数组的索引等&#xff0c;因其…

基于AiService实现智能文章小助手

顾名思义&#xff0c;这个应用就是希望能利用大模型的能力来帮助我写文章&#xff0c;那这样一个应用该如何利用LangChain4j来实现呢&#xff1f;接下来我们来利用AiService进行实现。 AiService代理 首先&#xff0c;我们定义一个接口Writer&#xff0c;表示作家&#xff1a…

高质量AIGC/ChatGPT/大模型资料分享

2023年要说科技圈什么最火爆&#xff0c;一定是ChatGPT、AIGC&#xff08;人工智能生成内容&#xff09;和大型语言模型。这些技术前沿如同科技世界的新潮流&#xff0c;巨浪拍岸&#xff0c;引发各界关注。ChatGPT的互动性和逼真度让人们瞠目&#xff0c;它能与用户展开流畅对…

谷歌如何进行失效链接建设?

失效链接建设是一种高效的外链建设策略&#xff0c;通过发现并利用失效链接来提升自己网站的SEO。以下是详细的步骤&#xff1a; 寻找失效页面&#xff1a;你需要使用SEO工具&#xff0c;如Ahrefs&#xff0c;来查找与你的网站内容相关的失效页面。这些页面可能是竞争对手的失…

Vue项目生产环境的打包优化

Vue项目生产环境的打包优化 前言 在这篇文章我们讨论Vue项目生产环境的打包优化&#xff0c;并按步骤展示实际优化过程中的修改和前后对比。 背景 刚开始的打包体积为48.71M 优化 步骤一&#xff1a;删除viser-vue viser-vue底层依赖antv/g2等库一并被删除&#xff0c;…

【EI会议】2024年机械、计算机工程与材料国际会议 (MCEM 2024)

2024年机械、计算机工程与材料国际会议 (MCEM 2024) 2024 International Conference on Mechanical, Computer Engineering and Materials 【重要信息】 大会地点&#xff1a;广州 官网地址&#xff1a;http://www.ismcem.com 投稿邮箱&#xff1a;ismcemsub-conf.com 【注意…

《XR应用开发者头显运行需求调研报告》重磅发布 ,开发者更加关注集成和可扩展性!

近期&#xff0c;LarkXR发布了一项新的解决方案&#xff0c;实现了3D/XR企业级应用全面接入Apple Vision Pro等头显设备。作为长期陪伴在XR行业开发者身边的技术伙伴&#xff0c;Paraverse平行云发起了此次行业调研&#xff0c;希望通过调研更直观地了解开发者在使用头显运行XR…

IDEA 导出ER图无表关系

一、通过IDEA导出的ER图无表关系&#xff0c;如下&#xff1a; 二、解决无表关系方法 1)这是建表时&#xff0c;user_work表中的t_id不规范&#xff0c;导致idea 找不到虚拟外键&#xff0c;也就不能绘制虚拟外键关系。那我们把user_work表t_id命名规范&#xff0c;t_id是user表…

VBA 批量变换文件名

1. 页面布局 在“main”Sheet中按照下面的格式编辑。 2. 实现代码 Private wsMain As Worksheet Private intIdx As LongPrivate Sub getExcelBookList(strPath As String)Dim fso As ObjectDim objFile As ObjectDim objFolder As ObjectSet fso = CreateObject("Scrip…

Steam新用户怎么参加夏促 Steam最新注册账号+下载客户端教程

steam夏促来了&#xff0c;这里给新玩家科普一下&#xff0c;steam就是一个游戏平台&#xff0c;里面的海量的各种游戏&#xff0c;而steam经常会有各种打折的活动&#xff0c;夏促就是其中之一&#xff0c;并且是其中规模最大的之一&#xff0c;涵盖游戏数量多&#xff0c;优惠…

ZW3D二次开发_CAM_添加刀具

在ZW3D2025中可以通过库添加刀具&#xff0c;代码如下&#xff1a; int idx_tool;int ret ZwCamToolInsertFromLibrary("", "001 METRIC TOOLS.xlsx", "10 mm Flat Endmill", &idx_tool); 平台功能添加刀具如下&#xff1a;

【Linux】进程间通信_2

文章目录 七、进程间通信1. 进程间通信分类管道 未完待续 七、进程间通信 1. 进程间通信分类 管道 管道的四种情况&#xff1a; ①管道内部没有数据&#xff0c;并且具有写端的进程没有关闭写端&#xff0c;读端就要阻塞等待&#xff0c;知道管道pipe内部有数据。 ②管道内部…

esp8266 GPIO

功能综述 ESP8266 的 16 个通⽤ IO 的管脚位置和名称如下表所示。 管脚功能选择 功能选择寄存器 PERIPHS_IO_MUX_MTDI_U&#xff08;不同的 GPIO&#xff0c;该寄存器不同&#xff09; PIN_FUNC_SELECT(PERIPHS_IO_MUX_MTDI_U,FUNC_GPIO12);PERIPHS_IO_MUX_为前缀。后面的…

uniapp开发企业微信内部应用

最近一直忙着开发项目&#xff0c;终于1.0版本开发完成&#xff0c;抽时间自己总结下在项目开发中遇到的技术点。此次项目属于自研产品&#xff0c;公司扩展业务&#xff0c;需要在企业微信中开发内部应用。因为工作中使用的是钉钉&#xff0c;很少使用企业微信&#xff0c;对于…

C# 警告 warning MSB3884: 无法找到规则集文件“MinimumRecommendedRules.ruleset”

警告 warning MSB3884: 无法找到规则集文件“MinimumRecommendedRules.ruleset” C:\Program Files\Microsoft Visual Studio\2022\Professional\MSBuild\Current\Bin\amd64\Microsoft.CSharp.CurrentVersion.targets(129,9): warning MSB3884: 无法找到规则集文件“MinimumRe…

Android Lint

文章目录 Android Lint概述工作流程Lint 问题种类Lint 警告严重性 用命令运行 LintAndroidStudio 使用 Lint忽略 Lint 警告gradle 配置 Lint查找无用资源文件 Android Lint 概述 Lint 是 Android 提供的 代码扫描分析工具&#xff0c;它可以帮助我们发现代码结构/质量问题&am…

springboot加载注入bean的方式

在SpringBoot的大环境下&#xff0c;基本上很少使用之前的xml配置Bean&#xff0c;主要是因为这种方式不好维护而且也不够方便。 springboto注入bean主要采用下图几种方式&#xff0c;分为本地服务工程注解声明的bean和外部依赖包中的bean。 一、 springboot装配本地服务工程…

国产Cortex-A55人工智能教学实验箱_基于Python机械臂跳舞实验案例分享

一、实验目的 本实验通过TL3568-PlusTEB教学实验箱修改机械臂不同舵机的角度&#xff0c;增加延迟时间&#xff0c;从而做到机械臂跳舞的效果。 二、实验原理 ROS&#xff08;机器人操作系统&#xff09; ROS&#xff08;机器人操作系统&#xff09;&#xff0c;是专为机器人…

报工计件工资核算h5开源版开发

报工计件工资核算h5开源版开发 小型计件工资管理系统&#xff0c;支持后台制定工价&#xff0c;核算工资。支持员工H5端报工&#xff0c;和查看工资情况。 H5手机端 支持在线报工&#xff0c;支持查看我的工资。 自定义费用项 在基础计件工资基础上增加扣除和增加项&#xff…