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

openpnp - 吸嘴校正失败的opencv参数分析

文章目录

    • openpnp - 吸嘴校正失败的opencv参数分析
    • 概述
    • 笔记
    • 阶段验证 - N2吸嘴校验完
      • NT1
      • NT2
    • 阶段验证 - 底部相机高级校验完
      • NT1
      • NT2
    • 参数比对
    • 保存 “阶段验证 - N2吸嘴校验完” 的NT1/NT2图像
    • 重建参数检测环境
      • NT1ok的3个参数值
      • NT1err的3个参数值
      • NT2ok的3个参数值
      • NT2err的3个参数值
    • DetectCircularSymmetry前3个参数比对结果
    • 找一下这3个参数在哪里?
      • 这3个属性是可覆盖的属性
    • 总结
    • 怎么办?
    • 备注
    • 补充
    • 补充 - 如果吸嘴自动校验失败,可以在UI上改吸嘴校验尺寸
    • END

openpnp - 吸嘴校正失败的opencv参数分析

概述

在标定设备。
发现在底部相机高级校正结束后,自动归零后的吸嘴自动校验失败了。
好在,我对标定的每个重要节点都做了配置文件备份。
在这里插入图片描述
实现都是在一个时间段,不是外部光线照明变化的影响。
设备放那里,没磕没碰,不是机械部分变动的影响。
且用底部相机高级校正完成之前的备份配置,吸嘴是可以自动归零,自动校验成功的。
且用底部相机高级校正这个备份配置,已经会导致自动归零后,吸嘴自动校验失败。
那么可以肯定,一定是吸嘴校验参数不同的原因。
那就找找吸嘴参数到底哪里不同,在底部相机高级校正完成后,导致吸嘴校验失败。

笔记

阶段验证 - N2吸嘴校验完

将备份恢复到"N2吸嘴校验完"
归零,自动校验吸嘴成功。
打开NT1/NT2的pipeline edit, 记录参数

NT1

在这里插入图片描述

起作用的opencv命令一共3个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NT2

在这里插入图片描述

起作用的opencv命令一共3个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

阶段验证 - 底部相机高级校验完

将备份恢复到"底部相机高级校验完"
归零,自动校验吸嘴失败。
打开NT1/NT2的pipeline edit, 记录参数

NT1

在这里插入图片描述

起作用的opencv命令一共3个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NT2

在这里插入图片描述

起作用的opencv命令一共3个
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

参数比对

打开该笔记的2份网页,分屏比对 “阶段验证 - N2吸嘴校验完”和“阶段验证 - 底部相机高级校验完”
发现参数一点都没变。
看来不是参数引起的问题。
那是底部相机高级校正后,拍摄的图像发生了变化?

保存 “阶段验证 - N2吸嘴校验完” 的NT1/NT2图像

也是在图像捕获之后,加入图像保存的命令。

在这里插入图片描述
现在就有了正常/错误的NT1/NT2的图片。
现在用单独启动的CvPipelineEditor看一下,同样的图像检测参数,对于这2组图片的检测效果有何不同?改如何调整图像检测参数?

重建参数检测环境

单独打开CvPipelineEditor
加入命令 ImageRead, 读入保存的图片
加入命令DetectCircularSymmetry, 检测吸嘴内壁
在这里插入图片描述
发现除了前3个参数,其余参数和设备配置中的吸嘴检测参数一致。
但是在设备配置中,这前3个参数是openpnp系统限制死的,不能改。
看一下设备配置中,这3个参数的值。

NT1ok的3个参数值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NT1err的3个参数值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NT2ok的3个参数值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NT2err的3个参数值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

DetectCircularSymmetry前3个参数比对结果

nt1ok/nt2ok
minDiameter = 10, 14
maxDiameter = 20, 27
maxDistance = 122, 122

nt1err/nt2err
minDiameter = 2, 3
maxDiameter = 4, 6
maxDistance = 26, 26

可以看出, 正常版本的前3个值比较大,错误版本的前3个值比较小。
那么在单独的CvPipelineEditor中试试,看看前3个参数比较大容易检测正确?比较小就检测不到?
载入图片,加入DetectCircularSymmetry,勾选诊断选项
在这里插入图片描述

试过了,确实nt1err/nt2err的这3个参数是检测错误的,检测结果根本不在吸嘴内壁,而是离内壁很远。
将前3个值改为2,4,26时如下,检测失败。且检测结果和失败时的检测结果很像。
在这里插入图片描述
将前3个值改为10,20,122时如下,检测成功(虽然没有检测到吸嘴内壁,但是已经检测到了吸嘴外壁)。且检测结果和成功时的检测结果很像。
在这里插入图片描述

找一下这3个参数在哪里?

这3个参数一定是在配置文件里面,找一下,将较小的3个值(2,4,26),改为好使的3个大值(10,20,122)
在4个配置文件中找了一下,没有。应该是带着系数算出来的值。
那在源码中看看,这3个值是咋算出来的。

这3个属性是可覆盖的属性

CvStage.java

        @Overridepublic PropertyDescriptor[] getPropertyDescriptors() {PropertyDescriptor[] pds = beanInfo.getPropertyDescriptors();for (PropertyDescriptor pd : pds) {String propertyName = pd.getName();Object overrideProperty = getPropertyOverride(propertyName); // !String description = CvStage.this.getDescription(propertyName);if (overrideProperty != null) { // !try {pd.setReadMethod(null);pd.setWriteMethod(null);}catch (IntrospectionException e) {}description = "<strong color=\"red\">Controlled by pipeline caller: "+propertyName+"="+overrideProperty+"</strong>"+ "<br/><br/>"+description; // !}pd.setShortDescription(description);}

新手,调用关系看不出。

总结

openpnp-2022-0801版本的底部相机高级矫正有问题,根据相机的像素不同,大概率会引起问题(在底部相机高级矫正之前的版本,可以自动校验吸嘴。在底部相机高级矫正之后,进行吸嘴检测时,大概率会检测失败)

原因 :给opencv用的检测参数算错了。这3个参数(DetectCircularSymmetry - minDiameter, minDiameter, maxDistance)不该动的,因为图像没变啊。.就是说,就是这3个参数算错了,导致吸嘴校验失败。

怎么办?

  1. 还是使用openpnp-2022-0801版本,进行完顶部相机高级矫正后,就算是标定完成。不过这么做,对于重度洁癖患者心里很隔应。
  2. 使用开发版本 openpnp-dev-2024-0208(实际的版本是 openpnp-dev-2023_0211), 对CVPipeline做了很多改进。看看底部相机高级矫正完成后,吸嘴自动检测是否能成功。

先试试备份的版本,确认一下顶部相机高级校正的备份是否可用。作为最后可用的配置备份。
然后换openpnp-dev-2024-0208,在每个重要的操作点备份配置, 走过底部相机高级矫正,看看吸嘴检测是否正常。

备注

openpnp的官方推荐摄像头都是100W像素的,他们自己测试估计也是用100W摄像头的环境。所以没发现问题。
所以开源软件的硬件,还是用官方推荐的好些。要不好多坑得掉进去。

补充

想进一步确认离"底部相机高级校正"最近的节点,是否能自动校验吸嘴成功?
离“底部相机高级校正”备份最近的节点是"顶部相机高级校正",试过了,“顶部相机高级校正”通过之后的配置备份,是可以正常机械归零,自动校验吸嘴成功的。

特意看了"顶部相机高级校正"过了之后的吸嘴校验配置,(DetectCircularSymmetry - minDiameter, minDiameter, maxDistance)是比较大的正常值。

补充 - 如果吸嘴自动校验失败,可以在UI上改吸嘴校验尺寸

我现在用的openpnp-dev-2024-0208版本(自己编译的),已经做过了顶部相机/底部相机高级校正。
在新增吸嘴时,发现CvPipeline的头3个参数是死的,无法配置参数,这3个参数是受控的。
因为新增的吸嘴(e.g. 原来标定设备时,上了2个503)如果不能正确校验同心度,那根本没办法用。
想想,openpnp的研发不能这样吧?
回到吸嘴校正的主界面上观察,发现可以直接设置吸嘴校正时的视觉尺寸,设置完这个尺寸,再去CvPipeline中去看,可以看到前3个参数还是不能改,但是已经变为合理值了。
从这可以看出,CvPipeline的前3个参数,是受控于吸嘴校验的视觉尺寸的。
所以,新增吸嘴/或者已有的吸嘴同心度校验不过,只需要改变"吸嘴同心度校验"页面中的“吸嘴尖端视觉尺寸”即可。
因为我设备已经校验好了,就没有回到openpnp-dev-2022-0801版本去实验。
现在感觉openpnp-dev-2024-0208版本挺好用的,只是以前是小白,不会用引起的误会。
官方发布的openpnp-dev的最新版本比较旧版增加了许多特性,用起来还是挺稳定的。
在这里插入图片描述

END

相关文章:

openpnp - 吸嘴校正失败的opencv参数分析

文章目录 openpnp - 吸嘴校正失败的opencv参数分析概述笔记阶段验证 - N2吸嘴校验完NT1NT2 阶段验证 - 底部相机高级校验完NT1NT2 参数比对保存 “阶段验证 - N2吸嘴校验完” 的NT1/NT2图像重建参数检测环境NT1ok的3个参数值NT1err的3个参数值NT2ok的3个参数值NT2err的3个参数值…...

【Python】Marmir 使用指南:Python 驱动的电子表格生成器

Marmir 是一个由 Python 驱动的电子表格生成工具&#xff0c;专门用于将 Python 数据结构&#xff08;如字典、列表等&#xff09;转换为电子表格文件&#xff08;如 Excel&#xff09;。Marmir 的设计目标是提供比传统电子表格库&#xff08;如 xlwt&#xff09;更强大和灵活的…...

深入理解 JavaScript 事件循环机制:单线程中的异步处理核心

深入理解 JavaScript 事件循环机制&#xff1a;单线程中的异步处理核心 JavaScript 是一门单线程的编程语言&#xff0c;也就是说它在同一时间只能执行一个任务。然而&#xff0c;现代 Web 应用经常需要处理大量的异步操作&#xff0c;如用户输入、网络请求、定时器等。为了确…...

Stream流的终结方法(二)——collect

1.Stream流的终结方法 2. collect方法 collect方法用于收集流中的数据放到集合中去&#xff0c;可以将流中的数据放到List&#xff0c;Set&#xff0c;Map集合中 2.1 将流中的数据收集到List集合中 package com.njau.d10_my_stream;import java.util.*; import java.util.f…...

【C语言系统编程】【第一部分:操作系统知识】1.1.操作系统原理

第一部分&#xff1a;操作系统知识 1.1 操作系统原理 1.1.1 进程管理 1.1.1.1 进程的概念与生命周期 进程是程序在计算机中的一次执行实例&#xff0c;包括了程序的代码、数据、以及运行的上下文环境。进程管理是操作系统的核心任务之一。 作用&#xff1a;管理所有执行中…...

基于Java+VUE+echarts大数据智能道路交通信息统计分析管理系统

大数据智能交通管理系统是一种基于Web的系统架构&#xff0c;通过浏览器/服务器&#xff08;B/S&#xff09;模式实现对城市交通数据的高效管理和智能化处理。该系统旨在通过集成各类交通数据&#xff0c;包括但不限于车辆信息、行驶记录、违章情况等&#xff0c;来提升城市管理…...

leetcode-42. 接雨水 单调栈

给定 n 个非负整数表示每个宽度为 1 的柱子的高度图&#xff0c;计算按此排列的柱子&#xff0c;下雨之后能接多少雨水。 示例 1&#xff1a; 输入&#xff1a;height [0,1,0,2,1,0,1,3,2,1,2,1] 输出&#xff1a;6 解释&#xff1a;上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表…...

ThinkPHP和PHP的区别

文章目录 ThinkPHP和PHP的区别一、引言二、PHP简介1、第一步1.1、示例代码 三、ThinkPHP简介2、第二步2.1、特点2.2、示例代码 四、总结 ThinkPHP和PHP的区别 一、引言 在Web开发领域&#xff0c;PHP是一种广泛使用的开源脚本语言&#xff0c;而ThinkPHP则是一个基于PHP的MVC…...

clientWidth,offsetWidth,scrollHeight

clientWidth: offsetWidth&#xff1a; scrollHeight&#xff1a;...

SVN版本回退

SVN 版本回退三种方法&#xff1a; Update item to this version 假设我们的项目文件一共有8个版本&#xff0c;它版本号分别是1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;6&#xff0c;7&#xff0c;8。 这个选项的作用是将文件版本更新到对应所选的…...

IDEA关联Tomcat

一、Tomcat服务器 web服务器,就是运行web项目的容器 即运行java代码的一个容器 webapp(web应用程序) --> 就是我们写的javaweb项目 Tomcat 是Apache 软件基金会&#xff08;Apache Software Foundation&#xff09;下的一个核心项目&#xff0c;免费开源、并支持Servlet 和J…...

MongoDB mongoose 的 save、insert 和 create 方法的比较

目录 save 方法 insert 方法 create 方法 使用会话和事务 总结 在本文中&#xff0c;我们将介绍 MongoDB 中使用 mongoose 操作 数据库时的三种常见方法&#xff1a;save、insert 和 create。这些方法可以用于将数据存储到 MongoDB 数据库中&#xff0c;并且在一定程度上具…...

Maven安装使用

说明&#xff1a;Maven是Apache旗下的一个开源项目&#xff0c;是一款用于管理和构建java项目的工具。一般来说&#xff0c;它帮助我们管理依赖、构建项目。本文介绍在Windows系统下安装Maven。 下载&安装&验证 下载 首先&#xff0c;在Maven官网&#xff08;https:…...

微信第三方开放平台接入本地消息事件接口报错问题java.security.InvalidKeyException: Illegal key size

先看报错&#xff1a; java.security.InvalidKeyException: Illegal key sizeat javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1039)at javax.crypto.Cipher.implInit(Cipher.java:805)at javax.crypto.Cipher.chooseProvider(Cipher.java:864)at javax.crypto.Cipher.in…...

如何只修改obsidian图片链接为markdown

如何只修改obsidian图片链接为markdown 前言插件配置 使用注意 前言 适合有一定了解obsidian用法和插件市场&#xff0c;还有相对路径的人 插件 在obsidian插件市场搜索—开梯子 配置 首先使用ctrlp打开命令面板&#xff0c;也可以在左侧通过图标打开命令面板&#xff0c…...

AI不可尽信

看到某项目有类似这样的一段代码 leaves : make([]int, 10) leaves leaves[:0]没理解这样的连续两行,有何作用? 初始化一个长度和容量都为10的切片,接着把切片长度设置为0 即如下demo: (在线地址) package mainimport "fmt"func main() {leaves : make([]int, 1…...

[C++]使用纯opencv部署yolov11旋转框目标检测

【官方框架地址】 GitHub - ultralytics/ultralytics: Ultralytics YOLO11 &#x1f680; 【算法介绍】 YOLOv11是一种先进的对象检测算法&#xff0c;它通过单个神经网络实现了快速的物体检测。其中&#xff0c;旋转框检测是YOLOv11的一项重要特性&#xff0c;它可以有效地检…...

Python入门--函数

目录 1. 函数介绍 2. 函数的定义 3. 函数的参数 4. 函数的返回值 5. 函数说明文档 6. 函数的嵌套调用 7. 函数的作用域 (1). 局部变量 (2). 全局变量 (3). global关键字 1. 函数介绍 函数&#xff1a;是组织好的&#xff0c;可重复使用的&#xff0c;用来实现特定功能…...

winFrom界面无法打开

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…...

【Linux】Ubuntu20.04上使用RabbitVCS的图形化SVN

文章目录 1、RabbitVCS1.1、RabbitVCS 介绍1.2、RabbitVCS 主要功能1.3、Ubuntu下 TortoiseSVN 替代者 2、安装2.1、命令安装2.2、安装使用2.3、使用权限 3、解决SVN无法保存密码问题3.1、问题描述3.2、解决方法 1、RabbitVCS 1.1、RabbitVCS 介绍 它是一款Linux系统下的图形…...

【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密

在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...

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.构…...

【配置 YOLOX 用于按目录分类的图片数据集】

现在的图标点选越来越多&#xff0c;如何一步解决&#xff0c;采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集&#xff08;每个目录代表一个类别&#xff0c;目录下是该类别的所有图片&#xff09;&#xff0c;你需要进行以下配置步骤&#x…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个生活电费的缴纳和查询小程序

一、项目初始化与配置 1. 创建项目 ohpm init harmony/utility-payment-app 2. 配置权限 // module.json5 {"requestPermissions": [{"name": "ohos.permission.INTERNET"},{"name": "ohos.permission.GET_NETWORK_INFO"…...

OPenCV CUDA模块图像处理-----对图像执行 均值漂移滤波(Mean Shift Filtering)函数meanShiftFiltering()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 在 GPU 上对图像执行 均值漂移滤波&#xff08;Mean Shift Filtering&#xff09;&#xff0c;用于图像分割或平滑处理。 该函数将输入图像中的…...

RSS 2025|从说明书学习复杂机器人操作任务:NUS邵林团队提出全新机器人装配技能学习框架Manual2Skill

视觉语言模型&#xff08;Vision-Language Models, VLMs&#xff09;&#xff0c;为真实环境中的机器人操作任务提供了极具潜力的解决方案。 尽管 VLMs 取得了显著进展&#xff0c;机器人仍难以胜任复杂的长时程任务&#xff08;如家具装配&#xff09;&#xff0c;主要受限于人…...

DeepSeek源码深度解析 × 华为仓颉语言编程精粹——从MoE架构到全场景开发生态

前言 在人工智能技术飞速发展的今天&#xff0c;深度学习与大模型技术已成为推动行业变革的核心驱动力&#xff0c;而高效、灵活的开发工具与编程语言则为技术创新提供了重要支撑。本书以两大前沿技术领域为核心&#xff0c;系统性地呈现了两部深度技术著作的精华&#xff1a;…...

算法250609 高精度

加法 #include<stdio.h> #include<iostream> #include<string.h> #include<math.h> #include<algorithm> using namespace std; char input1[205]; char input2[205]; int main(){while(scanf("%s%s",input1,input2)!EOF){int a[205]…...

[QMT量化交易小白入门]-六十二、ETF轮动中简单的评分算法如何获取历史年化收益32.7%

本专栏主要是介绍QMT的基础用法,常见函数,写策略的方法,也会分享一些量化交易的思路,大概会写100篇左右。 QMT的相关资料较少,在使用过程中不断的摸索,遇到了一些问题,记录下来和大家一起沟通,共同进步。 文章目录 相关阅读1. 策略概述2. 趋势评分模块3 代码解析4 木头…...

linux设备重启后时间与网络时间不同步怎么解决?

linux设备重启后时间与网络时间不同步怎么解决&#xff1f; 设备只要一重启&#xff0c;时间又错了/偏了&#xff0c;明明刚刚对时还是对的&#xff01; 这在物联网、嵌入式开发环境特别常见&#xff0c;尤其是开发板、树莓派、rk3588 这类设备。 解决方法&#xff1a; 加硬件…...