在 OpenCV C++ 中确定蛇的厚度、头部和尾部

Cos*_*h66 5 c++ image-processing computer-vision opencv3.0

我正在尝试分析一条蛇的图像并确定最粗的点,哪一端是头部,哪一端是尾部。这是原始图像。

在此处输入图片说明

到目前为止我已经通过灰度,二进制处理了图像并处理了蛇的精明轮廓。

在此处输入图片说明

我还通过细化算法获得了精明的骨架,大致是蛇的中心线。

在此处输入图片说明

现在我有了 Canny 轮廓和骨架轮廓,可以使用什么技术来确定蛇身最胖部分的像素宽度以及确定头部和尾部?

C

我还没有找到任何可用于创建这些测量值或确定头尾的 OpenCV C++ 技术。

任何帮助和指导将不胜感激。

LNi*_*rha 2

这是我的建议,假设计算成本不是问题:

  • 厚度:对于骨架的每个点,通过计算骨架当前点与轮廓各点的距离并保持最小距离,可以近似得到局部厚度。那么最厚的点就是局部厚度最大的点。 thickness(x_skelet) = min([distance(x_skelet, x_contour) for x_contour in countour])(是的,我知道这是糟糕的 python 风格的伪代码,希望它有意义)
  • 头部/尾部差异:头部和尾部的主要区别在于平均厚度。首先,我会定义尾巴和头部占身体的百分比(乍一看我会说 5%)。然后,使用上面定义的局部厚度,计算蛇每侧 5% 点的平均厚度。头部应该是平均厚度最高的一侧。根据定义,尾巴是另一个。

从您的图像来看,这应该足够强大,可以忽略图像中的小伪影。要知道,这种局部厚度的实现在靠近四肢的地方有点偏离,但对于您所描述的情况来说应该足够好了。

希望这对您有用。