在物体轮廓上使用OpenCV进行角点检测

3
我有一个冶炼立方体变成液滴的图片序列。到目前为止,我已经提取了它的轮廓,但接下来我需要区分物体和表面。我的想法是检测物体与表面接触的角点,但我很难找到一个合理的方法来实现(最好使用opencv的c++界面)。感谢任何建议。
以下是一些提取出的轮廓示例:
编辑: @Haris:
我尝试了您建议的变体,它对我很有用:
在近似轮廓中,我从左侧开始寻找第一个值在指定范围内的角度,然后从右侧进行相同操作。由于近似轮廓点是原始轮廓点的子集,因此我识别原始序列中的2个角点,并在这两个角上切割它。中间部分我视为液滴,而左右两侧重新组装成我的表面线。也许有更好、更稳定的方法,但这对我有用。谢谢!

也许通过原始图像(例如使用阈值)更容易区分对象和表面。我们能否看到原始图像? - Irisciences
首先想到的是,如果轮廓点按顺序存储(就像在图像中一样),我会选择一个“好”的d_Index,比如说5(用于平滑小噪声),并为每个点i计算“切向”向量P[i+5]-P[i]。相邻切向量的内积将显示出拐角处的下降。通过线性插值找到下降的最小位置/i,第一个最小值i_h和最后一个最小值i_e将把对象的轮廓与其他部分分割开来。如果需要面积,在原始图像中从P[i_h]到P[i_e]绘制一条线,并重新查找轮廓即可。 - maythe4thbewithu
1个回答

9
您可以尝试以下方法:
  1. 查找轮廓和approxPolyDP,详见此处

  2. 假设您已获得了像P1、P2、P3等的approxPolyDP点...

  3. 现在计算相邻直线之间的角度,即线条(P1,P2),线条(P2,P3)等之间的角度,并检查每个调整线条的角度差,如果差值接近90度,则表示有一个角落。

对于角度,您可以使用以下公式:

double Angle = atan2(y2 - y1, x2 - x1) * 180.0 / CV_PI; 

谢谢您的回答!听起来很不错,但我不知道approxPolyDP函数会优化哪些轮廓点,而且现在我太累了,无法自己阅读相关资料,但我一定会在接下来的几天里去了解它:-) 我会告诉您结果的。 - user2950911
1
approxPolyDP函数需要一个精度或容差参数,这对于角度计算非常重要。在一系列帧中找到一条线路比较容易,因为它在魔方融化时保持不变。就像前景减法一样。 - Vlad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接