gpt4 book ai didi

android - 获取二值图像中非几何线的坐标

转载 作者:太空宇宙 更新时间:2023-11-03 10:19:55 28 4
gpt4 key购买 nike

我正在尝试识别 OpenCV for Android 中的手部位置。我想将检测到的手形简化为一组简单线条(= 点序列)。我正在使用细化算法来查找检测到的手形的骨架线。这是一个示例性结果(我的左手的图像):

enter image description here

在此图像中,我想获取骨架线的坐标,即“矢量化”图像。我试过 HoughLinesP 但这只会产生大量非常短的线条,这不是我想要的。

我的第二种方法使用 findContours:

// Get contours
Mat skeletonFrame; //image above
ArrayList<MatOfPoint> contours = new ArrayList<MatOfPoint>();
Imgproc.findContours(skeletonFrame, contours, new Mat(), Imgproc.RETR_CCOMP, Imgproc.CHAIN_APPROX_SIMPLE);

// Find longest contour
double maxLen = 0;
MatOfPoint max = null;
for (MatOfPoint c : contours) {
double len = Imgproc.arcLength(Util.convert(c), true); //Util.convert converts between MatOfPoint and MatOfPoint2f
if (len > maxLen) {
maxLen = len;
max = c;
}
}

// Simplify detected contour
MatOfPoint2f result = new MatOfPoint2f();
Imgproc.approxPolyDP(Util.convert(max), result, 5.0, false);

这基本上是可行的;然而,findContours 返回的轮廓总是闭合的,这意味着所有的骨架线都被表示了两次

示例结果:(灰线 = 检测到的轮廓,不是第一张图像的骨架线)

enter image description here

所以我的问题是:我怎样才能避免这些封闭的轮廓并只得到“单笔画”点序列的集合?

我是否遗漏了 OpenCV 文档中的内容?我不一定要代码,提示我可以自己实现的算法也很棒。谢谢!

最佳答案

我会从真正的手部骨骼作为运动学开始

  1. 找到手指端点和手/腕基部和周边边界(红色)
  2. 求解逆运动学

    例如通过 CCD 来匹配手指端点而不重叠图像。这样你应该得到解剖学上正确的答案

  3. 为了简化,您可以使用这样的运动学

    xray/kinematics

    您应该以不同的方式处理男性/女性/ child (不同的手指长度)或使用某种校准或测量,因为手指长度不同。如您所见,我跳过了手/腕骨,它们并不那么重要。可以在周长较小的 curve radius 处找到红色轮廓。

如何解决您当前实现中的问题?

第一种细化方法更好,所以当你得到大量的线时,在计算每条线的角度后将它们连接到多段线。如果两条连接线具有相似的角度(达到阈值),那么连接它们应该做你想做的,但不要期望你会得到类似于人体骨骼的线,特别是对于曲线,结果会有很大不同。在线条和形状方面。

为了获得更好的结果,您需要使用几何细化

但我不知道它是否存在于 OpenCV 中(我不使用此库)我的想法是找到周界线并将其垂直向内移动一小步,类似于 this 。如果获得了所需的宽度则停止

geometrical thinning

当移动的周长导致太细的形状时,停在那里并连接到上一步的细化点(黄线)。这一切都是在矢量(折线)上完成的,而不是在图像像素上完成的!宽度可以计算为到任何附近线的最小垂直距离。

关于android - 获取二值图像中非几何线的坐标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25462161/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com