我目前正在尝试录制相机的镜头,并使用“image”命令在图形窗口中用matlab表示它。我面临的问题是图像的重绘速度很慢,这当然会影响我的整个脚本。这是一些快速伪代码来解释我的程序:
figure
while(true)
Frame = AcquireImageFromCamera(); % Mex, returns current frame
image(I);
end
AcquireImageFromCamera()是来自相机API的mex。 现在,在不显示所获取的图像的情况下,脚本可以轻松地抓取来自摄像机的所有帧(它以有限的帧速率记录)。但是,只要我显示实时视频流的每个图像,它就会非常慢,因此帧会因为没有被捕获而丢失。
有没有人知道如何分割获取图像并显示它们以便使用CPU的多个核心的过程?并行计算是我脑海中浮现的第一件事,但并行工具箱的工作方式与我想要的完全不同......
编辑:我是学生,在我的教师的matlab版本中包括所有工具箱:)
答案 0 :(得分:4)
运行两个线程或工作人员会有点棘手。而不是那样,你可以不经常更新屏幕吗?像这样:
figure
count = 0;
while(true)
Frame = AcquireImageFromCamera(); % Mex, returns current frame
count = count + 1;
if count == 5
count = 0;
image(I);
end
end
要尝试的另一件事是调用image()一次来设置绘图,然后直接更新像素。这应该比每帧调用image()快得多。您可以通过获取图像句柄并更改CData属性来完成此操作。
h = image(I); % first frame only
set(h, 'CData', newPixels); % other frames update pixels like this
请注意,更新此类像素可能需要调用drawnow才能在屏幕上显示更改。
答案 1 :(得分:2)
Matlab在计算机视觉工具箱中有一个video player,它比使用image()更快。
player = vision.VideoPlayer
while(true)
Frame = AcquireImageFromCamera(); % Mex, returns current frame
step(player, Frame);
end
答案 2 :(得分:2)
我不确定您的伪代码有多精确,但创建图像对象需要相当多的开销。创建一次然后只设置图像数据要快得多。
figure
himg = image(I)
while(true)
Frame = AcquireImageFromCamera(); % Mex, returns current frame
set(himg,'cdata',Frame);
drawnow; %Also make sure the screen is actually updated.
end