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个参数算错了,导致吸嘴校验失败。
怎么办?
- 还是使用openpnp-2022-0801版本,进行完顶部相机高级矫正后,就算是标定完成。不过这么做,对于重度洁癖患者心里很隔应。
- 使用开发版本 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 驱动的电子表格生成工具,专门用于将 Python 数据结构(如字典、列表等)转换为电子表格文件(如 Excel)。Marmir 的设计目标是提供比传统电子表格库(如 xlwt)更强大和灵活的…...

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

Stream流的终结方法(二)——collect
1.Stream流的终结方法 2. collect方法 collect方法用于收集流中的数据放到集合中去,可以将流中的数据放到List,Set,Map集合中 2.1 将流中的数据收集到List集合中 package com.njau.d10_my_stream;import java.util.*; import java.util.f…...
【C语言系统编程】【第一部分:操作系统知识】1.1.操作系统原理
第一部分:操作系统知识 1.1 操作系统原理 1.1.1 进程管理 1.1.1.1 进程的概念与生命周期 进程是程序在计算机中的一次执行实例,包括了程序的代码、数据、以及运行的上下文环境。进程管理是操作系统的核心任务之一。 作用:管理所有执行中…...

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

leetcode-42. 接雨水 单调栈
给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 示例 1: 输入:height [0,1,0,2,1,0,1,3,2,1,2,1] 输出:6 解释:上面是由数组 [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开发领域,PHP是一种广泛使用的开源脚本语言,而ThinkPHP则是一个基于PHP的MVC…...

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

IDEA关联Tomcat
一、Tomcat服务器 web服务器,就是运行web项目的容器 即运行java代码的一个容器 webapp(web应用程序) --> 就是我们写的javaweb项目 Tomcat 是Apache 软件基金会(Apache Software Foundation)下的一个核心项目,免费开源、并支持Servlet 和J…...
MongoDB mongoose 的 save、insert 和 create 方法的比较
目录 save 方法 insert 方法 create 方法 使用会话和事务 总结 在本文中,我们将介绍 MongoDB 中使用 mongoose 操作 数据库时的三种常见方法:save、insert 和 create。这些方法可以用于将数据存储到 MongoDB 数据库中,并且在一定程度上具…...

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

微信第三方开放平台接入本地消息事件接口报错问题java.security.InvalidKeyException: Illegal key size
先看报错: 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用法和插件市场,还有相对路径的人 插件 在obsidian插件市场搜索—开梯子 配置 首先使用ctrlp打开命令面板,也可以在左侧通过图标打开命令面板,…...

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 🚀 【算法介绍】 YOLOv11是一种先进的对象检测算法,它通过单个神经网络实现了快速的物体检测。其中,旋转框检测是YOLOv11的一项重要特性,它可以有效地检…...

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

winFrom界面无法打开
🏆本文收录于《全栈Bug调优(实战版)》专栏,主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案,希望能够助你一臂之力,帮你早日登顶实现财富自由🚀;同时,欢迎大家关注&&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系统下的图形…...

第19节 Node.js Express 框架
Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...
HTML 语义化
目录 HTML 语义化HTML5 新特性HTML 语义化的好处语义化标签的使用场景最佳实践 HTML 语义化 HTML5 新特性 标准答案: 语义化标签: <header>:页头<nav>:导航<main>:主要内容<article>&#x…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

CentOS下的分布式内存计算Spark环境部署
一、Spark 核心架构与应用场景 1.1 分布式计算引擎的核心优势 Spark 是基于内存的分布式计算框架,相比 MapReduce 具有以下核心优势: 内存计算:数据可常驻内存,迭代计算性能提升 10-100 倍(文档段落:3-79…...

基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...

JVM虚拟机:内存结构、垃圾回收、性能优化
1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...
PAN/FPN
import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...
Go 并发编程基础:通道(Channel)的使用
在 Go 中,Channel 是 Goroutine 之间通信的核心机制。它提供了一个线程安全的通信方式,用于在多个 Goroutine 之间传递数据,从而实现高效的并发编程。 本章将介绍 Channel 的基本概念、用法、缓冲、关闭机制以及 select 的使用。 一、Channel…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...