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

标签 c++ image-processing computer-vision opencv3.0

我正在尝试分析一条蛇的图像并确定最粗的点,哪一端是头部,哪一端是尾部。这是原始图像。
enter image description here
到目前为止我已经通过灰度,二进制处理了图像并处理了蛇的精明轮廓。
enter image description here
我还通过细化算法获得了精明的骨架,大致是蛇的中心线。
enter image description here
现在我有了 Canny 轮廓和骨架轮廓,可以使用什么技术来确定蛇身最胖部分的像素宽度以及确定头部和尾部?
c
我还没有找到任何可用于创建这些测量值或确定头尾的 OpenCV C++ 技术。
任何帮助和指导将不胜感激。

最佳答案

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

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

  • 从查看您的图像来看,这应该足够健壮,可以忽略图像中的小瑕疵。知道这种局部厚度的实现在靠近四肢的地方有点偏离,但它应该足以满足您的描述。
    希望这对你有用。

    关于c++ - 在 OpenCV C++ 中确定蛇的厚度、头部和尾部,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68918746/

    相关文章:

    c++ - C++ 中的新运算符和数组

    c++ - 如何使用 libssh 运行 makefile?

    c++ - Ubuntu 上的 argstream.h 库

    python - 如何量化两个图像之间的差异?

    c++ - 在 C++ 中使用临时对象时的返回值优化 (RVO)

    c++ - MFC:CMFCToolBar SetButtonStyle 不适用于样式 TBBS_PRESSED?

    python - 简单图像反卷积问题

    opencv - 运动追踪

    c++ - 什么是大点云的高速子采样库?

    opencv - 从人脸图像中提取头发像素的简单方法