(个人)实时交互的太极拳学习系统创新实训第三周(二)

DTW算法
我已经实现了DTW算法对三维位置信息的计算,代码如下:
#include <stdlib.h>
#include <iostream>
#include <vector>
#include "dtw.h"
using namespace std;
double distan[DTWMAXNUM][DTWMAXNUM]; /*保存距离*/
//double dtwpath[DTWMAXNUM][DTWMAXNUM]; /*保存路径*/

double Euclidean(vector<vector<double>>A, vector<vector<double>>B,int i,int j)
{
	double E = sqrt(pow((A[i][0] - B[j][0]),2)+pow((A[i][1] - B[j][1]), 2)+ pow((A[i][2] - B[j][2]),2));
	return E;
}
/* DTWDistance,求两个数组之间的匹配距离
/* A,B分别为第一第二个数组,I,J为其数组长度,r为匹配窗口的大小
/* r的大小一般取为数组长度的1/10到1/30
/* 返回两个数组之间的匹配距离,如果返回-1.0,表明数组长度太大了*/
double DTWDistance(vector<vector<double>>A, int I, vector<vector<double>> B, int J, int r)
{
	int i, j;
	double dist;
	int istart, imax;
	int r2 = r + ABS(I - J);/*匹配距离*/
	double g0,g1, g2, g3;
	//int pathsig = 1;/*路径的标志*/

					/*检查参数的有效性*/
	if (I>DTWMAXNUM || J>DTWMAXNUM) {
		//printf("Too big number\n");
		return -1.0;
	}

	/*进行一些必要的初始化*/
	for (i = 0; i<I; i++) {
		for (j = 0; j<J; j++) {
			//dtwpath[i][j] = 0;
			distan[i][j] = DTWVERYBIG;
		}
	}

	//动态规划求最小距离
	distan[0][0] = (double)2 * Euclidean(A,B,0,0);
	for (i = 1; i <= r2; i++) {
		distan[i][0] = distan[i - 1][0] + Euclidean(A,B,i,0);
	}
	for (j = 1; j <= r2; j++) {
		distan[0][j] = distan[0][j - 1] + Euclidean(A,B,0,j);
	}

	for (j = 1; j<J; j++) {
		istart = j - r2;
		if (j <= r2)
			istart = 1;
		imax = j + r2;
		if (imax >= I)
			imax = I - 1;

		for (i = istart; i <= imax; i++) {
			g0 = Euclidean(A,B,i,j);
			g1 = distan[i - 1][j] + g0;
			g2 = distan[i - 1][j - 1] + 2 * g0;
			g3 = distan[i][j - 1] + g0;
			g2 = MIN(g1, g2);
			g3 = MIN(g2, g3);
			distan[i][j] = g3;
		}
	}
	dist = distan[I - 1][J - 1] / ((double)(I + J));
	cout << dist;
	return dist;	
}/*end DTWDistance*/


int main(int argc, char * argv[])
{
	int norm_len = 6;
	int test_len = 10;
	int r = 1;

	/*输入数据*/
	vector<vector<double>> norm(norm_len, vector<double>(3));
	norm[0] = { 7.0, 6.0, 5.0 };
	norm[1] = { 7.0, 8.0, 5.0 };
	norm[2] = { 6.5, 9.0, 5.5 };
	norm[3] = { 7.0, 10.0, 5.5 };
	norm[4] = { 6.5, 11.5, 6.0 };
	norm[5] = { 6.0, 11.0, 5.5 };
	//norm.push_back();
	vector<vector<double>> test(test_len, vector<double>(3));
	test[0] = { 0.0, 0.0, 0.0 };
	test[1] = { 0.0, 0.0, 0.0 };
	test[2] = { 3.0, 4.0, 2.0 };
	test[3] = { 6.0, 5.0, 4.5 };
	test[4] = { 7.0, 6.0, 5.0 };
	test[5] = { 7.0, 8.0, 5.0 };
	test[6] = { 6.5, 9.0, 5.5 };
	test[7] = { 7.0, 10.0, 5.5 };
	test[8] = { 6.5, 11.5, 6.0 };
	test[9] = { 6.0, 11.0, 5.5 };
	double a = DTWDistance(norm, norm_len, test, test_len, r);
	system("pause");
}

可以说写的是非常“通俗易懂”了。
下一步就是把它移植到UE4中,还需要考虑数据读取的问题。目前我正在学习UR4的编程,现在只是刚刚入门的阶段,接下来的一周我会继续学习。在学习过程中还有一个小插曲,就是我按照教程创建一个C++项目时,总是报错:
我怀疑是我的UE4找不到我的VS,后来询问了学长,因为 我的VS是2017版的,相比于2015版进行了“瘦身”,所以有的东西得手动添加才可以。最后通过更新VS并下载UR4相关内容后得以解决。

诺亦腾修复
我现在可以确定之前的扭曲变形是地面磁场造成的了,我拿到我们学校机房去用,一点问题也没有。

猜你喜欢

转载自blog.csdn.net/qq_33244381/article/details/80043873