我目前正在开发一个项目,该项目结合了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
答案 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)
这将通过最小化循环内的操作来提高性能。