将Motion Capture System中的实时数据写入CSV文件?

时间:2016-03-11 19:59:22

标签: matlab csv real-time motion-detection

我目前正在开发一个项目,该项目结合了VICON运动捕捉系统来分析主体的步长。该系统使用带标记的红外摄像机来创建3D模型。目前,VICON系统已设置为使用DataStreamSDK在MATLAB中进行实时数据记录。我的最终目标是从一个特定标记(XYZ坐标)中提取数据并将该数据导出到txt文件,以便我稍后编辑它。我已经集成了预先存在的代码以及一些原始代码,以便我可以提取特定标记的坐标,并尝试将这些坐标放在CSV文件中,该文件为每个框架添加一个新坐标。但是,当我运行代码时,CSV文件似乎只包含在我告诉数据停止流式传输后最近帧的坐标重复。相反,我希望每帧的坐标输入到CSV文件的新行。我已经提供了以下代码。如果需要,我可以提供整个代码,但是大多数代码都涉及启用来自VICON Nexus程序的数据流。写入CSV文件的部分位于底部。

我应该如何编辑代码,以便在拉出新数据时连续更新CSV文件,而不是简单地将最近拉出的坐标点的1:n重复?提前谢谢。

for MarkerIndex = 9:9
  % Get the marker name
  MarkerName = MyClient.GetMarkerName( SubjectName, MarkerIndex ).MarkerName;

  % Get the marker parent
  MarkerParentName = MyClient.GetMarkerParentName( SubjectName, MarkerName ).SegmentName;

  % Get the global marker translation
  Output_GetMarkerGlobalTranslation = MyClient.GetMarkerGlobalTranslation( SubjectName, MarkerName );

  fprintf( '      Marker #%d: %s (%g, %g, %g) %s\n',                     ...
                     MarkerIndex - 1,                                    ...
                     MarkerName,                                         ...
                     Output_GetMarkerGlobalTranslation.Translation( 1 ), ...
                     Output_GetMarkerGlobalTranslation.Translation( 2 ), ...
                     Output_GetMarkerGlobalTranslation.Translation( 3 ), ...
                     AdaptBool( Output_GetMarkerGlobalTranslation.Occluded ) );



 ftemp = fopen('TestData.txt','w' );
for Output_GetFrameNumber = 1:n
    fprintf(ftemp, '%f,%f,%f\n',Output_GetMarkerGlobalTranslation.Translation( 1 ),Output_GetMarkerGlobalTranslation.Translation( 2 ),Output_GetMarkerGlobalTranslation.Translation( 3 ));
end
fclose(ftemp);
end    

1 个答案:

答案 0 :(得分:1)

您需要更改打开文件以进行写入的语句。你有:

ftemp = fopen('TestData.txt','w' );

'w'参数打开文件,丢弃现有内容。所以你在每个循环中覆盖文件。如果您使用'a',则会内容附加到该文件中。查看文档here并阅读"权限"参数。

所以你可以改变'w''到'a',您的代码应该有效。此外,您可以考虑在循环外打开文件:

ftemp = fopen('TestData.txt','a');
for MarkerIndex = 9:9
 % [insert your code for getting position data]
    for Output_GetFrameNumber = 1:n
        fprintf(ftemp, '%f,%f,%f\n',...); % [insert your print statement]
    end
end
close(ftemp)

这将通过最小化循环内的操作来提高性能。