我有一个Android应用程序,它获取手势坐标(3轴 - x,y,z).我需要将它们与我在数据库中的坐标进行比较,并确定它们是否相同.
我还需要增加一些容差,因为加速度计(捕获手势的设备)非常敏感.这很容易,但我也想考虑例如在空中画出的"大圆圈",就像在空中画出的"小圆圈"一样.意思是会有不同的值,但图的结构会是一样的,对吧?
我听说过将图值转换成位然后进行比较.这是正确的方法吗?这样的比较有没有图书馆?
到目前为止,我只是硬编码,涵盖了我的所有要求,除了最后一个(大圆圈与小圆圈).
我的代码现在:
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;
}
Run Code Online (Sandbox Code Playgroud)
编辑:
我发现JGraphT,它可能会奏效.如果您对此已有所了解,请告诉我.
EDIT2:
看到这些图像,它们是相同的手势,但是一个以比另一个更慢的动作完成.
我没有捕获相同手势的图像,其中一个比另一个小,可能稍后添加.
我使用了算法的Java实现Dynamic Time Wrapping。该库称为 fastDTW。
不幸的是,据我了解,他们不再支持它,尽管我发现了它的用途。 https://code.google.com/p/fastdtw/
我现在不记得了,但我想我使用了这个并自己编译了它: https ://github.com/cscotta/fastdtw/tree/master/src/main/java/com/fastdtw/dtw
| 归档时间: |
|
| 查看次数: |
293 次 |
| 最近记录: |