【问题标题】:opencv corner detection on object contour对象轮廓上的opencv角点检测
【发布时间】:2016-08-07 01:21:48
【问题描述】:

我有一个熔炼立方体的图像,随着时间的推移形成一个液滴。到目前为止,我提取了它的轮廓,但接下来我需要区分对象和表面。我的想法是检测物体接触表面的角落,但我正在努力寻找一种合理的方法来做到这一点(最好使用 opencv 的 c++ 接口)。如有任何建议,我将不胜感激。
以下是提取轮廓的一些示例:

编辑: @哈里斯:

我已经尝试了你的建议的一个变体,它正在为我做这项工作:

在近似轮廓中,我从左侧接近,寻找具有指定范围内的值的第一个角度,然后从右侧寻找相同的角度。由于近似的轮廓点是原始轮廓点的子集,因此我确定了原始序列中的 2 个角点,并在两个角处对其进行切割。中间部分我作为水滴,左右部分我重新组合为我的表面线。可能有更好、更稳定的方法,但这对我有用。谢谢!

【问题讨论】:

  • 用原始图像(以阈值为例)可能会更容易区分物体与表面。我们可以看到原图吗?
  • 第一个想法。如果轮廓点按顺序存储(因为它们在图像中)。我将选择一个“好的”d_Index 表示〜5(用于平滑的小噪声)并为每个点 i 计算“切线”向量 P[i+5]-P[i]。相邻切向量的内积将显示角下降。找到液滴的最小位置/i(通过线性插值??)。第一个 min i_h 和最后一个 min i_e 将从 all 中分割出对象的轮廓。如果需要该区域,请在原始图像中从 P[i_h] 到 P[i_e] 画一条线,然后再次找到轮廓。

标签: c++ opencv image-processing


【解决方案1】:

你可以试试这个方法,

  1. 查找contour and approxPolyDP.

  2. 假设您有 approxPolyDP 点,如 P1、P2、P3 等...

  3. 现在计算连续线之间的角度,即线(P1,P2),线(P2,P3)等之间的角度。检查每条调整线的角度差异,如果差异接近90度你可以说有一个角落。

对于角度,您可以使用方程式

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

【讨论】:

  • 感谢您的回答!听起来确实不错,但我不知道 approxPolyDP 函数会优化哪些轮廓点,我现在太累了,无法阅读,但肯定会在接下来的几天内完成 :-) 我会让你知道结果
  • approxPolyDP 采用对角度计算很重要的精度或公差参数。在多维数据集融化时它保持不变,因此更容易在帧的连接序列中找到一条线。类似于前景减法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 1970-01-01
  • 1970-01-01
  • 2014-09-28
  • 1970-01-01
  • 2016-10-24
  • 2014-12-12
相关资源
最近更新 更多