openpnp - 吸嘴校正失败的opencv参数分析
文章目录
- openpnp - 吸嘴校正失败的opencv参数分析
- 概述
- 笔记
- 阶段验证 - N2吸嘴校验完
- NT1
- NT2
- 阶段验证 - 底部相机高级校验完
- NT1
- NT2
- 参数比对
- 保存 “阶段验证 - N2吸嘴校验完” 的NT1/NT2图像
- 重建参数检测环境
- NT1ok的3个参数值
- NT1err的3个参数值
- NT2ok的3个参数值
- NT2err的3个参数值
- DetectCircularSymmetry前3个参数比对结果
- 找一下这3个参数在哪里?
- 这3个属性是可覆盖的属性
- 总结
- 怎么办?
- 备注
- 补充
- 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
@Override
public 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)是比较大的正常值。