Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 获取二值图像中非几何线的坐标_Android_Algorithm_Opencv - Fatal编程技术网

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

Android 获取二值图像中非几何线的坐标,android,algorithm,opencv,Android,Algorithm,Opencv,我正在尝试在Android的OpenCV中识别手的位置。我想将检测到的手形简化为一组简单的线(=点序列)。我正在使用细化算法查找检测到的手形的骨架线。下面是一个示例性结果(我左手的图像): 在这张图像中,我想得到骨架线的坐标,即图像的“矢量化”。我尝试过HoughLinesP,但这只会产生大量非常短的行,这不是我想要的 我的第二种方法使用查找对象: // Get contours Mat skeletonFrame; //image above ArrayList<MatOfPoint&

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

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

我的第二种方法使用
查找对象

// 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);
//获取轮廓
垫骨架//上图
ArrayList等高线=新的ArrayList();
Imgproc.findContours(骨架框架、轮廓、新垫()、Imgproc.RETR\u CCOMP、Imgproc.CHAIN\u近似简单);
//求最长轮廓
双maxLen=0;
MatOfPoint max=null;
用于(点c:等高线){
double len=Imgproc.arcLength(Util.convert(c),true);//Util.convert在MatOfPoint和MatOfPoint2f之间进行转换
如果(len>maxLen){
maxLen=len;
max=c;
}
}
//简化检测轮廓
MatOfPoint2f结果=新的MatOfPoint2f();
Imgproc.approxPolyDP(Util.convert(max),结果,5.0,false);
这基本上是可行的;但是,
findContours
返回的轮廓始终是闭合的,这意味着所有骨架线都表示了两次

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

所以我的问题是:如何避免这些闭合轮廓,而只获得一组“单笔划”点序列?


我在OpenCV文档中遗漏了什么吗?我不一定要代码,给我一个可以自己实现的算法的提示也很好。谢谢

我将从真正的手骨骼开始,作为运动学

  • 查找手指端点和手/手腕底部及周长边界(红色)
  • 求解逆运动学

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

  • 为了简化,可以像这样使用运动学

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

  • 如何解决当前实施中的问题

    第一种细化方法更好,因此当您得到大量直线时,在计算每条直线的角度之后,将它们连接到多段线。如果两条连接的线具有相似的角度(直到treshold),则连接它们时,应根据需要进行操作,但不要期望得到与人体骨骼相似的线,尤其是曲线,结果将大不相同。在线条和形状的计数中

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

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


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

    谢谢您的详细回答!该项目已经完成(我使用了一些难看的变通方法),但我会尽快完成您的解决方案。由于该项目不需要解剖上正确的识别,因此“如果两条连接线具有相似的角度,则连接它们”的想法可能是最简单的方法。然而,我不确定具体的实现是否可行。。。