减少在循环中显示图像时的循环开销

时间:2019-08-06 04:44:08

标签: image matlab loops matlab-figure

我正在循环触发视频,利用其数据,并使用imshow预览正在发生的事情。外接摄像机的速度为30 fps,但是在循环中使用imshow时,它会将帧速率大幅降低至5-7 fps。有没有解决方法?以下是代码段:

Vid = videoinput('some_cam',1);
triggerconfig(Vid, 'manual');
Vid.FramesPerTrigger = 1;
Vid.TriggerRepeat = inf;
viewer = vision.DeployableVideoPlayer();

start(Vid);
himg = figure;
while ishandle(himg)
    trigger(Vid);
    [image, timeStamp] = getdata(Vid);
    imshow(image); %This line significantly reduce the performance
    %Do something with the images...This part is important and would need as many frame rate as possible
end

所以我在想,如果我发送imshow在另一个线程上运行怎么办?但是在这种情况下,由于我需要访问image,因此我不知道该怎么做。在我的情况下,预览或任何其他命令均不起作用,因为我必须事先对image进行一些更改。

2 个答案:

答案 0 :(得分:4)

在MATLAB中加速动画图形的方法是不使用诸如imshowplot之类的函数,这些函数会清除轴,创建新的图形对象,调整轴属性等。这些功能在幕后做了很多工作,而在屏幕上制作动画时则不需要这些工作。

相反,修改现有的图形对象:

start(Vid);
hfig = figure;
trigger(Vid);
[image, timeStamp] = getdata(Vid);
himg = imshow(image);
while ishandle(hfig)
    trigger(Vid);
    [image, timeStamp] = getdata(Vid);
    himg.CData = image; % update the existing graphics object
    %...
end

对于非常旧的MATLAB版本,请使用set(himg,'CData',image)更新图形对象。

您可能需要在循环内添加drawnow才能查看图像更改。

答案 1 :(得分:1)

每次使用imshow时,程序都会运行缓慢。可能有助于加快处理速度的一件事是显示数据的子集。例如,您可以在每个方向上缩小10倍。尽管打印开销将基本保持不变,但是imshow的显示数据量却减少了100倍:

imshow(image(1:10:end, 1:10:end))

如果图像是彩色的,则沿颜色尺寸添加一个:索引。

如果绘制任何类型的叠加层,请记住将所有坐标确定10来补偿缩小的图像尺寸。

但是最后,您不能同时吃蛋糕和吃蛋糕:要么显示图形并接受开销,要么不这样做。

相关问题