文章目录
- openpnp - 单独用CvPipeLineEditor来调试学习图片识别参数
- 概述
- 笔记
- 官方给出的单独启动CvPipeLineEditor的方法
- 我自己环境单独启动CvPipeLineEditor的方法
- CvPipeLineEditor启动后的样子
- 添加命令的方法
- 删除不要的命令参数
- 调整多个命令参数的执行顺序
- 添加命令用来载入实验用的.png
- 识别吸嘴内壁
- 调试openpnp无法正确识别的吸嘴内壁或者其他视觉识别参数
- 备注
- 原始图像的保存
- END
openpnp - 单独用CvPipeLineEditor来调试学习图片识别参数
概述
在使用openpnp的过程中,可能由于某些原因(e.g. 光线变化大),使标定设备时好使的吸嘴,在自动归零后,自动校验吸嘴同心度时失败。
这时,不用重新去标定设备,吸嘴也是同一批型号,同心度一致性差不多,设备刚标定完后,还可以自动归零,吸嘴校验成功。
现在只过了一会,只是openpnp软件关了,再重新开,自动归零时,出现吸嘴校验失败。
所以这种情况下的吸嘴自动校验失败,只和吸嘴的图像识别参数有关。
因为就想实验调整哪些参数影响吸嘴内壁图像的识别,如果开着设备,有点没必要。是否有离线实验的方法?
翻看官方资料, 看到可以单独启动CvPipelineEditor来实验图像参数的识别。
试了一下,好使。
那这样的话,就可以将吸嘴校验失败时的图像抓下来,保存到本地为.png图像。
然后将设备关了,安心的用单独启动的CvPipelineEditor来实验如何才能正确识别图像中的吸嘴内壁。
笔记
官方给出的单独启动CvPipeLineEditor的方法
java -cp openpnp-gui-0.0.1-alpha-SNAPSHOT.jar org.openpnp.vision.pipeline.ui.StandaloneEditor
我自己环境单独启动CvPipeLineEditor的方法
我现在用的是我自己编译的openpnp版本, 启动的命令行写了笔记(openpnp - 程序发布包的制作)
我只需要在这个笔记的基础上,将要启动的class改为 org.openpnp.vision.pipeline.ui.StandaloneEditor 即可。
完整的启动命令另存为run_cvPipeLine.cmd,内容如下
.\jdk11.0.17_8\bin\java.exe -Dfile.encoding=UTF-8 -classpath .\classes;.\m2_repository\net\java\dev\jna\jna\5.8.0\jna-5.8.0.jar;.\m2_repository\org\jfree\jfreechart\1.5.3\jfreechart-1.5.3.jar;.\m2_repository\com\github\sarxos\webcam-capture\0.3.10\webcam-capture-0.3.10.jar;.\m2_repository\com\nativelibs4java\bridj\0.6.2\bridj-0.6.2.jar;.\m2_repository\org\slf4j\slf4j-api\1.7.2\slf4j-api-1.7.2.jar;.\m2_repository\org\ostermiller\utils\1.07.00\utils-1.07.00.jar;.\m2_repository\commons-codec\commons-codec\1.6\commons-codec-1.6.jar;.\m2_repository\org\simpleframework\simple-xml\2.7.1\simple-xml-2.7.1.jar;.\m2_repository\stax\stax-api\1.0.1\stax-api-1.0.1.jar;.\m2_repository\stax\stax\1.2.0\stax-1.2.0.jar;.\m2_repository\xpp3\xpp3\1.1.3.3\xpp3-1.1.3.3.jar;.\m2_repository\commons-io\commons-io\2.7\commons-io-2.7.jar;.\m2_repository\com\fazecast\jSerialComm\2.10.3\jSerialComm-2.10.3.jar;.\m2_repository\org\swinglabs\swingx\swingx-all\1.6.4\swingx-all-1.6.4.jar;.\m2_repository\org\openpnp\opencv\4.5.1-2\opencv-4.5.1-2.jar;.\m2_repository\com\google\code\gson\gson\2.2.3\gson-2.2.3.jar;.\m2_repository\org\apache\xmlgraphics\batik-transcoder\1.7\batik-transcoder-1.7.jar;.\m2_repository\org\apache\xmlgraphics\fop\0.94\fop-0.94.jar;.\m2_repository\org\apache\xmlgraphics\xmlgraphics-commons\1.2\xmlgraphics-commons-1.2.jar;.\m2_repository\org\apache\avalon\framework\avalon-framework-api\4.3.1\avalon-framework-api-4.3.1.jar;.\m2_repository\org\apache\avalon\framework\avalon-framework-impl\4.3.1\avalon-framework-impl-4.3.1.jar;.\m2_repository\org\apache\xmlgraphics\batik-awt-util\1.7\batik-awt-util-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-bridge\1.7\batik-bridge-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-anim\1.7\batik-anim-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-css\1.7\batik-css-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-ext\1.7\batik-ext-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-parser\1.7\batik-parser-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-script\1.7\batik-script-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-js\1.7\batik-js-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-dom\1.7\batik-dom-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-gvt\1.7\batik-gvt-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-svg-dom\1.7\batik-svg-dom-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-svggen\1.7\batik-svggen-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-util\1.7\batik-util-1.7.jar;.\m2_repository\org\apache\xmlgraphics\batik-xml\1.7\batik-xml-1.7.jar;.\m2_repository\xml-apis\xml-apis\1.3.04\xml-apis-1.3.04.jar;.\m2_repository\xml-apis\xml-apis-ext\1.3.04\xml-apis-ext-1.3.04.jar;.\m2_repository\com\google\zxing\javase\2.2\javase-2.2.jar;.\m2_repository\com\google\guava\guava\14.0.1\guava-14.0.1.jar;.\m2_repository\com\jgoodies\jgoodies-forms\1.8.0\jgoodies-forms-1.8.0.jar;.\m2_repository\com\jgoodies\jgoodies-common\1.8.0\jgoodies-common-1.8.0.jar;.\m2_repository\org\tros\l2fprod-properties-editor\1.0.3\l2fprod-properties-editor-1.0.3.jar;.\m2_repository\org\tros\l2fprod-common-annotations\1.0.3\l2fprod-common-annotations-1.0.3.jar;.\m2_repository\xalan\xalan\2.7.2\xalan-2.7.2.jar;.\m2_repository\xalan\serializer\2.7.2\serializer-2.7.2.jar;.\m2_repository\de\onvif\onvif-java-lib\2016-03-16\onvif-java-lib-2016-03-16.jar;.\m2_repository\org\python\jython-standalone\2.7.1\jython-standalone-2.7.1.jar;.\m2_repository\org\beanshell\bsh\2.0b5\bsh-2.0b5.jar;.\m2_repository\org\tinylog\tinylog\1.3\tinylog-1.3.jar;.\m2_repository\com\google\zxing\core\3.3.0\core-3.3.0.jar;.\m2_repository\com\github\kennedyoliveira\pastebin4j\1.2.1\pastebin4j-1.2.1.jar;.\m2_repository\com\mashape\unirest\unirest-java\1.4.9\unirest-java-1.4.9.jar;.\m2_repository\org\apache\httpcomponents\httpclient\4.5.2\httpclient-4.5.2.jar;.\m2_repository\org\apache\httpcomponents\httpcore\4.4.4\httpcore-4.4.4.jar;.\m2_repository\org\apache\httpcomponents\httpasyncclient\4.1.1\httpasyncclient-4.1.1.jar;.\m2_repository\org\apache\httpcomponents\httpcore-nio\4.4.4\httpcore-nio-4.4.4.jar;.\m2_repository\org\apache\httpcomponents\httpmime\4.5.2\httpmime-4.5.2.jar;.\m2_repository\org\json\json\20160212\json-20160212.jar;.\m2_repository\org\javassist\javassist\3.27.0-GA\javassist-3.27.0-GA.jar;.\m2_repository\org\jdesktop\beansbinding\1.2.1\beansbinding-1.2.1.jar;.\m2_repository\commons-beanutils\commons-beanutils\1.9.3\commons-beanutils-1.9.3.jar;.\m2_repository\commons-logging\commons-logging\1.2\commons-logging-1.2.jar;.\m2_repository\commons-collections\commons-collections\3.2.2\commons-collections-3.2.2.jar;.\m2_repository\org\apache\commons\commons-math3\3.6.1\commons-math3-3.6.1.jar;.\m2_repository\org\openpnp\openpnp-capture-java\0.0.22\openpnp-capture-java-0.0.22.jar;.\m2_repository\com\nativelibs4java\jnaerator-runtime\0.12\jnaerator-runtime-0.12.jar;.\m2_repository\com\nativelibs4java\ochafik-util\0.12\ochafik-util-0.12.jar;.\m2_repository\javax\xml\bind\jaxb-api\2.2.11\jaxb-api-2.2.11.jar;.\m2_repository\com\sun\xml\bind\jaxb-core\2.2.11\jaxb-core-2.2.11.jar;.\m2_repository\com\sun\xml\bind\jaxb-impl\2.2.11\jaxb-impl-2.2.11.jar;.\m2_repository\javax\activation\activation\1.1.1\activation-1.1.1.jar;.\m2_repository\javax\xml\ws\jaxws-api\2.3.0\jaxws-api-2.3.0.jar;.\m2_repository\javax\xml\soap\javax.xml.soap-api\1.4.0\javax.xml.soap-api-1.4.0.jar;.\m2_repository\com\formdev\flatlaf\1.0\flatlaf-1.0.jar;.\m2_repository\com\formdev\flatlaf-extras\1.0\flatlaf-extras-1.0.jar;.\m2_repository\com\formdev\svgSalamander\1.1.2.4\svgSalamander-1.1.2.4.jar org.openpnp.vision.pipeline.ui.StandaloneEditor
CvPipeLineEditor启动后的样子
添加命令的方法
选中一个命令,点击接受,命令参数就添加到了CvPipeLineEditor
每个opencv命令参数都有可以选择的命令参数,自己可以改。
如果这个opencv命令是影响图像的,在右边的图像预览中,就可以看到效果。
删除不要的命令参数
选中要删除的命令,点击删除按钮,这个命令参数就从CvPipeLineEditor的界面上删除了。
调整多个命令参数的执行顺序
用鼠标左键可以拖动 CvPipeLineEditor 中的命令参数行的上下顺序,这样就可以调节opencv命令的执行顺序。
添加命令用来载入实验用的.png
我已经将截图文件另存为了D:\my_tmp\dbg_openpnp1.png
添加ImageRead命令
将file参数用按钮浏览到D:\my_tmp\dbg_openpnp1.png, 确定。图片就显示在CvPipeLineEditor的预览中了。
识别吸嘴内壁
添加DetectCircularSymmetry命令
勾选诊断选项,就可以看到已经选择了吸嘴外壁。
如果要选择吸嘴内壁,就尝试着去改DetectCircularSymmetry命令的其他参数。
调试openpnp无法正确识别的吸嘴内壁或者其他视觉识别参数
openpnp是给了一些实际参数的,在吸嘴校验的pipeline edit中。
可以将这些参数的目标图片另存下来, 用ImageRead命令载入图片到CvPipeLineEditor。
然后将openpnp不好使的那些参数(或者曾经好使过的参数),抄录下来,在单独打开的CvPipeLineEditor中尝试调节参数。
或者再尝试查一下CvPipeLineEditor提供的这些opencv命令的用途,尝试加一些相关的opencv命令,尝试参数调节。
这样的话,理论上就可以找出,为啥设备标定时,吸嘴的图像识别是好的,但是过了一会,或过了一段时间就不好使了。
备注
那些过了一段时间,不能正确开机校验的吸嘴的图像,我看质量还挺好的。
尝试找一下哪些参数会影响图像识别。
CvPipeLineEditor是带图像识别预览的,如果参数调节的合适。这些参数用到openpnp中,效果也是一样的。
原始图像的保存
因为要保存的图像,是openpnp cvPipeline不能正确识别的图像。
如果再用第三方截图软件保存,恐怕会失真。
必须将openpnp判断时的图像,原样保存下来。
准备在CvPipeLineEditor中加入命令来自动保存。
openpnp默认配置的cvPipeline中,有一些命令。
第一条命令是ImageCapture, 这是从对应的摄像头(NT1/NT2的摄像头)捕获图像。
我们就在这条命令后,加入ImageWrite, 将参数file写为我们要保存的图像。
点击工具条的第一个按钮“刷新”,让pipeline的所有已经配置上的命令执行一下。
再去看d:\my_tmp中,就有了我们指定要保存的摄像头的图像了。