Android 获取二值图像中非几何线的坐标
我正在尝试在Android的OpenCV中识别手的位置。我想将检测到的手形简化为一组简单的线(=点序列)。我正在使用细化算法查找检测到的手形的骨架线。下面是一个示例性结果(我左手的图像): 在这张图像中,我想得到骨架线的坐标,即图像的“矢量化”。我尝试过HoughLinesP,但这只会产生大量非常短的行,这不是我想要的 我的第二种方法使用Android 获取二值图像中非几何线的坐标,android,algorithm,opencv,Android,Algorithm,Opencv,我正在尝试在Android的OpenCV中识别手的位置。我想将检测到的手形简化为一组简单的线(=点序列)。我正在使用细化算法查找检测到的手形的骨架线。下面是一个示例性结果(我左手的图像): 在这张图像中,我想得到骨架线的坐标,即图像的“矢量化”。我尝试过HoughLinesP,但这只会产生大量非常短的行,这不是我想要的 我的第二种方法使用查找对象: // Get contours Mat skeletonFrame; //image above ArrayList<MatOfPoint&
查找对象
:
// 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文档中遗漏了什么吗?我不一定要代码,给我一个可以自己实现的算法的提示也很好。谢谢 我将从真正的手骨骼开始,作为运动学
当移动的周长导致太薄的形状时,停止并连接到上一步的变薄点(黄线)。这都是在矢量(多段线)上完成的,而不是在图像像素上!!!宽度可以计算为与任何附近直线的最小垂直距离。谢谢您的详细回答!该项目已经完成(我使用了一些难看的变通方法),但我会尽快完成您的解决方案。由于该项目不需要解剖上正确的识别,因此“如果两条连接线具有相似的角度,则连接它们”的想法可能是最简单的方法。然而,我不确定具体的实现是否可行。。。