我正在循环触发视频,利用其数据,并使用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
进行一些更改。
答案 0 :(得分:4)
在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
才能查看图像更改。
答案 1 :(得分:1)
每次使用imshow
时,程序都会运行缓慢。可能有助于加快处理速度的一件事是显示数据的子集。例如,您可以在每个方向上缩小10倍。尽管打印开销将基本保持不变,但是imshow
的显示数据量却减少了100倍:
imshow(image(1:10:end, 1:10:end))
如果图像是彩色的,则沿颜色尺寸添加一个:
索引。
如果绘制任何类型的叠加层,请记住将所有坐标确定10来补偿缩小的图像尺寸。
但是最后,您不能同时吃蛋糕和吃蛋糕:要么显示图形并接受开销,要么不这样做。