Image 如何改进关键点检测和匹配

Image 如何改进关键点检测和匹配,image,opencv,computer-vision,kinect,keypoint,Image,Opencv,Computer Vision,Kinect,Keypoint,我一直在做一个图像处理和机器人学的自我项目,机器人像往常一样检测颜色并挑出物体,它试图检测电路板上的孔(类似于不同的多边形)。为了更好地了解设置,请参见以下图片: 如你所见,我必须检测这些孔,找出它们的形状,然后使用机器人将物体放入孔中。我正在使用kinect深度相机获取深度图像。图片如下: 我陷入了如何用相机检测孔的想法中,最初基于深度测量使用遮罩去除背景部分和一些前景部分,但这不起作用,因为在相机的不同方向上,孔会与电路板合并。。。有点像变白(完全变白)。然后我遇到了adaptiveTh

我一直在做一个图像处理和机器人学的自我项目,机器人像往常一样检测颜色并挑出物体,它试图检测电路板上的孔(类似于不同的多边形)。为了更好地了解设置,请参见以下图片:

如你所见,我必须检测这些孔,找出它们的形状,然后使用机器人将物体放入孔中。我正在使用kinect深度相机获取深度图像。图片如下:

我陷入了如何用相机检测孔的想法中,最初基于深度测量使用遮罩去除背景部分和一些前景部分,但这不起作用,因为在相机的不同方向上,孔会与电路板合并。。。有点像变白(完全变白)。然后我遇到了
adaptiveThreshold
函数

adaptiveThreshold(depth1,depth3,255,ADAPTIVE_THRESH_GAUSSIAN_C,THRESH_BINARY,7,-1.0);
使用腐蚀、扩张和高斯模糊去除噪声;如下图所示,以更好的方式检测孔。然后,我使用cvCanny边缘检测器获取边缘,但到目前为止,它并没有如下图所示的那么好。在此之后,我尝试了来自SIFT、SURF、ORB、GoodFeaturesToTrack的各种特征检测器,发现ORB提供了最佳时间和检测到的特征。在这之后,我试图通过查找查询图像的关键点并匹配这些关键点来获得查询图像的相对相机姿势,以便为
findHomography
函数提供良好的匹配。结果如下图所示:

最后,我想得到两幅图像之间的相对相机姿态,并使用solvePnP函数得到的旋转和平移向量将机器人移动到该位置

那么,有没有其他方法可以提高产品质量 是否检测到关键点检测和匹配的孔

我也尝试过轮廓检测和approxPolyDP,但近似的形状不是很好:

我尝试过调整阈值和canny函数的输入参数,但是 这是我能得到的最好的了

还有,我的拍摄姿势是否正确

更新:无论我做了什么尝试,我都无法获得良好的可重复功能来映射。然后我在网上读到,深度图像的分辨率很低,它只用于掩蔽和获取距离之类的东西。因此,我突然意识到这些特征是不合适的,因为低分辨率的图像边缘凌乱。因此,我想到了在RGB图像上检测特征,并使用深度图像仅获取这些特征的距离。我得到的功能的质量简直超出了图表。它甚至检测到了电路板上的螺丝!!以下是使用GoodFeaturesToTrack关键点检测功能检测到的关键点。。 我在获得距离时遇到了另一个障碍,因为分数的距离没有正确地计算出来。我搜索了可能的原因,过了很长一段时间,我发现RGB和深度图像中有一个偏移,这是因为相机之间的偏移。你可以从前两张图像中看到这一点。然后,我在网上搜索了如何补偿这种偏移,但找不到有效的解决方案

如果你们中有人能帮我补偿补偿补偿,那就太好了

更新:我无法充分利用goodFeaturesToTrack功能。该函数给出Point2f类型的角点。如果您想计算描述符,我们需要关键点,使用下面的代码片段将Point2f转换为关键点会导致失去缩放和旋转不变性

for( size_t i = 0; i < corners1.size(); i++ )
{
keypoints_1.push_back(KeyPoint(corners1[i], 1.f));
}
for(size_t i=0;i
特征匹配的可怕结果如下所示


我现在必须开始不同的功能匹配。我将发布进一步的更新。如果有人能帮助消除偏移问题,那将非常有帮助。

补偿图像输出和世界坐标之间的差异:

您应该使用好的旧相机校准方法来校准相机响应,并可能为相机输出生成校正矩阵(以便将它们转换为真实比例)

一旦你打印出一个棋盘模板并捕捉到各种各样的镜头,事情就不会那么复杂了。(对于此应用程序,您不需要担心旋转不变性。只需使用图像阵列校准世界视图即可。)

您可以在此处找到更多信息:

--

现在,由于我似乎无法对这个问题发表评论,我想问一下,您的具体应用是否需要机器在飞行中“找出”孔的形状。如果孔形状数量有限,则可以对其进行数学建模,并在黑白边缘图像上查找支持预定义模型的像素

例如(x)^2+(y)^2-r^2=0表示半径为r的圆,而x和y是像素坐标


尽管如此,我认为需要对应用程序的要求(形状检测)进行更多的澄清。

如果要检测特定的形状,如提供的图像中的形状,最好使用Classifier。深入研究Haar分类器,或者更好的是,查看一袋单词

使用BoW,您需要训练一组数据集,包括正样本和负样本。阳性样本将包含要检测的每个形状的N个唯一样本。如果N大于10,则效果更好;如果N大于100,则效果最好;如果N具有高度的变异性和唯一性,则具有良好的鲁棒性分类器训练

负片样本(很明显)包含的东西不能以任何方式代表你的形状。这只是为了检查分类器的准确性

此外,一旦您对分类器进行了培训,您就可以分发分类器数据(例如,假设