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

Reduce loop overhead when displaying images inside a loop

我正在循环触发视频,利用它的数据,并使用 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 进行一些更改。

任何时候使用 imshow,您的程序都会 运行 变慢。可能有助于加快速度的一件事是显示数据的一个子集。例如,您可以在每个方向上缩小 10 倍。虽然绘图开销基本保持不变,但 imshow 要显示的数据将减少 100 倍:

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

如果图像是彩色的,则在颜色维度上添加一个 : 索引。

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

但最终,鱼与熊掌不可兼得:要么显示图形并接受开销,要么不显示图形。

在 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 才能看到图像变化。