我一直在从事图像处理和机器人技术的自我项目,而机器人像往常一样检测颜色并挑选物体,它试图检测板上的孔(类似于不同的多边形).为了更好地理解设置,这里是一张图片:
如您所见,我必须检测这些孔,找出它们的形状,然后使用机器人将物体装入孔中.我正在使用kinect深度相机来获取深度图像.图片如下所示:
我想到如何使用相机检测孔洞,最初使用遮罩来移除背景部分和一些基于深度测量的前景部分,但是这并没有成功,因为在相机的不同方向上孔将与板合并...类似于排列(它完全变白).然后我遇到了adaptiveThreshold
功能
adaptiveThreshold(depth1,depth3,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,7,-1.0);
使用侵蚀,扩张和高斯模糊消除噪音; 它以更好的方式检测到孔,如下图所示.然后我使用了cvCanny边缘检测器来获得边缘,但到目前为止它还不如下图所示.之后我尝试了来自SIFT,SURF,ORB,GoodFeaturesToTrack的各种特征检测器,发现ORB给出了最好的时间和检测到的功能.在此之后,我尝试通过查找其关键点并匹配这些关键点来获得查询图像的相对相机姿势,以便为该findHomography
函数提供良好的匹配.结果如下图所示:
最后,我想获得两个图像之间的相对相机姿势,并使用从solvePnP函数获得的旋转和平移向量将机器人移动到该位置.
那么有没有其他方法可以提高检测到的关键点检测和匹配孔的质量?
我也曾尝试过轮廓检测和近似,但近似的形状并不是很好:
我已经尝试调整阈值和canny函数的输入参数,但这是我能得到的最好的
另外,我的方法是让相机姿势正确吗?
更新:无论我尝试什么,我都无法获得良好的可重复功能来映射.然后我在网上看到深度图像的分辨率很低,它只用于掩蔽和获取距离等东西.所以,由于低分辨率的图像及其杂乱的边缘,这让我觉得功能不合适.所以我想到了检测RGB图像上的特征并使用深度图像来获得这些特征的距离.我得到的功能质量完全脱离了图表.它甚至检测到了主板上的螺丝!以下是使用GoodFeaturesToTrack关键点检测检测到的关键点..我遇到了另一个障碍,同时距离不正确的点距离.我搜索了可能的原因,很长一段时间后,由于相机之间的偏移,RGB和深度图像中存在偏移.我可以从前两个图像中看到这一点.然后,我在网上搜索了如何补偿这种偏移,但找不到有效的解决方案.
如果你们中的任何一个人可以帮助我补偿抵消,那就太好了!
更新:我无法正常使用goodFeaturesToTrack函数.该函数给出了Point2f类型的角点.如果你想计算描述符,我们需要关键点并将Point2f转换为Keypoint,下面的代码片段会导致缩放和旋转不变性的丢失.
for( size_t i = 0; i < corners1.size(); i++ ) { keypoints_1.push_back(KeyPoint(corners1[i], 1.f)); }
功能匹配的可怕结果如下所示 .
我现在必须开始不同的功能匹配.我会发布进一步的更新.如果有人可以帮助消除偏移问题,那将非常有用.