2014-04-04 280 views
3

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

编辑: @Haris:

我已经想你的建议的一个变种,它是做的工作对我来说:

r1r2r2

在ap接近轮廓i从左边靠近,寻找具有指定范围中的值的第一个角度,然后从右边开始。由于逼近的轮廓点是原始轮廓点的一个子集,我然后确定原始序列中的2个角点,并在两个角落处剪切它。我把中间的部分当作水滴,左边和右边的部分,我重新宣布是我的表面线。可能会有更好,更稳定的方法,但这对我有用。谢谢!

+0

也许它会更容易从表面的物体与原始图像区分(与为例一个阈值)。我们有可能看到原始图像吗?首先想到的是 – Irisciences

+0

。如果轮廓点按顺序存储(如它们在图像中一样)。我将选择一个“好”的d_Index表示〜5(对于平滑的小噪声),并为每个点i计算“正切”向量P [i + 5] -P [i]。邻接切线向量的内积将显示拐角处的下降。找到下降的最小位置/ i(通过线性插值??)。第一个min_i_h和最后一个min_i_e将分割来自所有对象的轮廓。如果您需要该区域,请在P [i_h]到P [i_e]的原始图像中画一条线,然后重新找到轮廓线。 – maythe4thbewithu

回答

7

你可以试试这个方法,

  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; 
+0

谢谢你的回答!它肯定听起来不错,我不知道哪个轮廓点正好能够优化出approxPolyDP函数,而且我现在太累了,现在就自己去阅读一下,但是在接下来的几天里肯定会得到它:-) I'将让您知道结果 – user2950911

+1

approxPolyDP采用对角度计算非常重要的精度或公差参数。因为在立方体融化时它保持相同,所以在连结帧序列中找到一条线更容易。像前景减法。 – Vlad