比较图形值或结构

时间:2015-09-04 09:47:57

标签: java

我有一个Android应用程序正在获取手势坐标(3轴 - x,y,z)。我需要将它们与我在数据库中的坐标进行比较,并确定它们是否相同。

我还需要增加一些容差,因为加速度计(捕获手势的设备)非常敏感。这很容易,但我也想考虑一下"大圈"在空中绘制,与#34;小圆圈相同"画在空中。意思是会有不同的值,但图的结构会相同,对吗?

我听说过将图值转换为比特然后进行比较。这是正确的方法吗?这样的比较有没有图书馆?

到目前为止,我只是硬编码,涵盖了我的所有要求,除了最后一个(大圆圈与小圆圈)。

我的代码现在:

 private int checkWhetherGestureMatches(byte[] values, String[] refValues) throws IOException {
        int valuesSize = 32;
        int ignorePositions = 4;

        byte[] valuesX = new byte[valuesSize];
        byte[] valuesY = new byte[valuesSize];
        byte[] valuesZ = new byte[valuesSize];

        for (int i = 0; i < valuesSize; i++) {
            int position = i * 3 + ignorePositions;
            valuesX[i] = values[position];
            valuesY[i] = values[position + 1];
            valuesZ[i] = values[position + 2];
        }


        Double[] valuesXprevious = new Double[valuesSize];
        Double[] valuesYprevious = new Double[valuesSize];
        Double[] valuesZprevious = new Double[valuesSize];


        for (int i = 0; i < valuesSize; i++) {
            int position = i * 3 + ignorePositions;
            valuesXprevious[i] = Double.parseDouble(refValues[position]);
            valuesYprevious[i] = Double.parseDouble(refValues[position + 1]);
            valuesZprevious[i] = Double.parseDouble(refValues[position + 2]);
        }


        int incorrectPoints = 0;
        for (int j = 0; j < valuesSize; j++) {
            if (valuesX[j] < valuesXprevious[j] + 20 && valuesX[j] > valuesXprevious[j] - 20
                    && valuesY[j] < valuesYprevious[j] + 20 && valuesY[j] > valuesYprevious[j] - 20
                    && valuesZ[j] < valuesZprevious[j] + 20 && valuesZ[j] > valuesZprevious[j] - 20) {
            } else {
                incorrectPoints++;
            }
        }
        return incorrectPoints;
    }

编辑:

我找到JGraphT,它可能有用。如果您对此已有所了解,请与我联系。

EDIT2:

看到这些图像,它们是相同的手势,但其中一个以比另一个更慢的动作完成。

更快一个: Faster

较慢的一个: enter image description here

我还没有捕捉到同一个手势的图像,其中一个比另一个小,可能会稍后添加。

3 个答案:

答案 0 :(得分:2)

如果你的手势列表很复杂,我建议训练一个神经网络,它可以根据你提到的图形值位对手势进行分类。该任务非常类似于手写数字的分类,网上有大量资源。

另一种方法是以数学方式猜测手势的形状,但我怀疑考虑到加速度计的容差以及用户不会绘制精确形状的事实,这将是有用的。

答案 1 :(得分:2)

(a)将您的3D坐标转换为2D平面图。使用matrix transformations

(b)将您的手势量表标准化 - 再次使用矩阵变换

(c)标准化点数或在下一步使用插值。

(d)计算您存储的手势和当前(c)手势之间的差异

Sum((Xs[i] - Xc[i])^2 + (Ys[i] - Yc[i])^2) where i = 0 .. num of points

如果差异低于预定义的精度 - 手势相等。

答案 2 :(得分:0)

我使用了Dynamic Time Wrapping算法的Java实现。该库名为fastDTW。

不幸的是,由于我的支持,他们不再支持它了,尽管我找到了它的用途。 https://code.google.com/p/fastdtw/

我现在不记得了,但我想我用过这个并自己编译: https://github.com/cscotta/fastdtw/tree/master/src/main/java/com/fastdtw/dtw