我有一个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:
看到这些图像,它们是相同的手势,但其中一个以比另一个更慢的动作完成。
我还没有捕捉到同一个手势的图像,其中一个比另一个小,可能会稍后添加。
答案 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