在循环内显示图像时减少循环开销
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 中加速动画图形的方法是不使用 imshow
或 plot
等函数,这些函数会清除轴、创建新图形对象、调整轴属性等。 . 这些函数在幕后做了很多在屏幕上动画时不需要的工作。
改为修改现有图形对象:
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
才能看到图像变化。
我正在循环触发视频,利用它的数据,并使用 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 中加速动画图形的方法是不使用 imshow
或 plot
等函数,这些函数会清除轴、创建新图形对象、调整轴属性等。 . 这些函数在幕后做了很多在屏幕上动画时不需要的工作。
改为修改现有图形对象:
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
才能看到图像变化。