使用MATLAB实时处理由另一个程序创建的文件

4
我正在使用MATLAB处理由相机创建并存储在Windows目录中的图像文件。我希望将反馈纳入到相机的控制中,因此需要MATLAB每次创建新图像并出现在目录中时处理一张图像。我从未创建过连续运行并等待事件发生的MATLAB程序。
根据我在网上阅读的内容,似乎最好的选择是使用计时器对象,并让MATLAB程序重复读取目录内容。这是一个好方法吗?还是有其他替代方案可以实施?
我想知道MATLAB程序是否可以通过出现在目录中的文件来“触发”,而不是不断监测该目录的内容。我希望有这种方式,因为随着目录填充,我发现MATLAB中的“dir”命令非常缓慢;慢到可能无法快速处理所需的图像。
作为后续步骤,请问如何部署此程序?我喜欢的一个想法是一个简单的GUI界面,带有“开始”和“停止”按钮。
谢谢。
2个回答

5
你可以按照以下步骤操作:
创建一个计时器对象,每10秒检查一次你的目录:
t = timer('TimerFcn', @mycallback, 'Period', 10.0, 'ExecutionMode', 'fixedSpacing');

你的'mycallback'函数应该长成这样:

DIR_TO_READ = 'C:\incoming-files';
DIR_TO_MOVE_PROCESSED = 'C:\processed-files';

% get list of files.
file_struct = dir(DIR_TO_READ)
% remove '.' and '..' directories
file_struct([file_struct.isdir]) = [];
for j = 1 : numel(file_struct)
    current_file = file_struct(j).name;
    full_filename = fullfile(DIR_TO_READ, current_file)

    % add your processing of the file here
    % e.g.
    bla = imread(full_filename);

    % now move the processed file to the processed file folder
    movefile(full_filename, fullfile(DIR_TO_MOVE_PROCESSED, current_file))

end       

现在您需要启动计时器对象。
start(t);

你可以使用以下代码停止计时器对象:

stop(t);

你应该在imread周围添加一个try/catch和暂停/重试循环,以处理尝试读取部分写入文件时出现错误的情况。计时器逻辑会注意到文件已经被创建,但它不知道它们是否仍然打开并正在被写入。 - Andrew Janke

1

正确的方法是购买MATLAB图像采集工具箱(http://www.mathworks.com/products/imaq/)。这个功能故意没有包含在基本的Matlab环境中。

或者,通过一些巧妙的编程,你可以实现一个解决方案。内置的MATLAB函数可能会太慢。你最好的选择是用Java编写所需的功能(参见http://www.exampledepot.com/egs/java.io/GetFiles.html),然后直接从Matlab调用你的Java代码(参见http://www.mathworks.com/help/techdoc/matlab_external/f44062.html)。

基本上,除非你直接访问相机驱动程序或帧抓取器,否则你总是需要实现某种形式的目录轮询。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接