我现在正在写一个关于kinect的小程序,定义了一个
vector<double>inputvector(12)
,也就是inputvector里面有12个元素,全部初始化为0,现在是我要把我从kinect里面获得的骨骼数据流,总共12个数据每帧这样送到inputvector中去,然后将所有获取到的数据保存到txt文档中,下面我贴出我的代码,现在有一个问题是我只能获取最后一帧的数据保存到txt中,之前所有的帧数据都没有保存进去,求大神帮忙看一下!我基础不好,底子薄 这个问题困扰我一天了!万分感谢!
bool getSkeletonImage(HANDLE &skeletonEvent, Mat &skeletonImage, Mat &colorImage)
{
UINT gestureLabel = 1;
trainingData.setNumDimensions(12);
trainingData.setDatasetName("sensorData");
trainingData.setInfoText("this data contains some sensor data");
NUI_SKELETON_FRAME skeletonFrame = { 0 };
bool bfoundskeleton = false;
if (NuiSkeletonGetNextFrame(0, &skeletonFrame) == S_OK)
{
for (int i = 0; i < NUI_SKELETON_COUNT; i++)
{
if (skeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED)
{
bfoundskeleton = true;
break;//跳出for循环
}
}
}
else
{
cout << "没有找到合适的骨骼" << endl;
return FALSE;
}
if (!bfoundskeleton)
{
return FALSE;
}
NuiTransformSmooth(&skeletonFrame, NULL);
skeletonImage.setTo(0);
for (int i = 0; i < NUI_SKELETON_COUNT; i++)
{
if (skeletonFrame.SkeletonData[i].eTrackingState == NUI_SKELETON_TRACKED&&skeletonFrame.SkeletonData[i].eSkeletonPositionTrackingState[NUI_SKELETON_POSITION_SHOULDER_CENTER] != NUI_SKELETON_POSITION_NOT_TRACKED)
{
float fx, fy;
for (int j = 0; j < NUI_SKELETON_POSITION_COUNT; j++)
{
NuiTransformSkeletonToDepthImage(skeletonFrame.SkeletonData[i].SkeletonPositions[j], &fx, &fy);//骨骼坐标转换到深度图像中去
skeletonPoint[i][j].x = (int)fx;
skeletonPoint[i][j].y = (int)fy;
}
for (int j = 0; j < NUI_SKELETON_POSITION_COUNT; j++)
{
if (skeletonFrame.SkeletonData[i].eSkeletonPositionTrackingState[j] != NUI_SKELETON_POSITION_NOT_TRACKED)
{
LONG colorx, colory;
//从深度空间中获取颜色空间对应像素点的坐标
NuiImageGetColorPixelCoordinatesFromDepthPixel(NUI_IMAGE_RESOLUTION_640x480, 0, skeletonPoint[i][j].x, skeletonPoint[i][j].y, 0, &colorx, &colory);
colorPoint[i][j].x = int(colorx);
colorPoint[i][j].y = int(colory);
circle(skeletonImage, skeletonPoint[i][j], 4, cvScalar(0, 255, 255), 1, 8, 0);
circle(colorImage, colorPoint[i][j], 4, cvScalar(0,0,255), 1, 8, 0);
}
}
drawskeleton(colorImage, colorPoint[i], i);//在彩色图像上画上骨骼
drawskeleton(skeletonImage, skeletonPoint[i], i);//画出骨骼图像信息
inputvector[0] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].x;
inputvector[1] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].y;
inputvector[2] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_LEFT].z;
inputvector[3] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_LEFT].x;
inputvector[4] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_LEFT].y;
inputvector[5] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_LEFT].z;
inputvector[6] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].x;
inputvector[7] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].y;
inputvector[8] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_HAND_RIGHT].z;
inputvector[9] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_RIGHT].x;
inputvector[10] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_RIGHT].y;
inputvector[11] = skeletonFrame.SkeletonData[i].SkeletonPositions[NUI_SKELETON_POSITION_WRIST_RIGHT].z;
cout << "KinectLeftHandData:" << "X=" << inputvector[0] << " Y=" << inputvector[1] << " Z=" << inputvector[2] << endl;
cout << "KinectLeftWristData: " << "X=" << inputvector[3] << "Y=" << inputvector[4] << "Z=" << inputvector[5] << endl;
cout << "KinectRightHandData:" << "X=" << inputvector[6] << " Y=" << inputvector[7] << " Z=" << inputvector[8] << endl;
cout << "KinectRightWristData:" << "X=" << inputvector[9] << " Y=" << inputvector[10] << " Z=" << inputvector[11] << endl;
//cout << inputvector.size() << endl;
trainingData.addSample(gestureLabel, inputvector);
}
if (!trainingData.save("TrainingData.txt"))
{
cout << "error:failed to save dateset to file!" << endl;
return EXIT_FAILURE;
}
string datasetName = trainingData.getDatasetName();
string infoText = trainingData.getInfoText();
UINT numSamples = trainingData.getNumSamples();
UINT numDimensions = trainingData.getNumDimensions();
UINT numClasses = trainingData.getNumClasses();
ClassificationData testData = trainingData.partition(80);
if (!trainingData.merge(testData))
{
//cout << "failed to save merge datasets" << endl;
return EXIT_FAILURE;
}
trainingData.clear();
}
}