如何使用matlab在我的图像中更快地更新数据?

use*_*678 4 performance matlab image-processing computer-vision matlab-cvst

我正在编写一个用于车道检测的算法,

这是我用过的骨架代码,

while ~isDone(video)
   currentFrame = getFrame(video);
   .
   . % Do segmentation and lane detection
   .
   figure(1),imshow(currentFrame),hold on
   figure(1),plot( theLinesThatWereDetected );
   pause(.0001); % without pause the plot command wouldn't work like a streamer.
end
Run Code Online (Sandbox Code Playgroud)

这是模拟的视频https://www.youtube.com/watch?v=K881hFCyiQ8,问题:输出视频在显示每个帧后变得越来越慢,但是一旦关闭图形窗口,它就会自动重启(当代码运行时,它变得更快(检查视频).为什么会发生这种情况,是否有一些内存积累正在减缓绘图速度?除了手动关闭图形窗口外,我还能做些什么来加快速度?

我知道有一个video.ShapeInserter对象可用,它比我用过的绘图方法更快.我没有使用它的原因是因为更改了视频中的线条粗细.ShapeInserter对象仅在2014版本中出现,我使用的是2013版本.我希望我的车道检测有非常明显的粗线.

请给我一些建议.

编辑:这是应用Shai建议的编辑后的视频.https://www.youtube.com/watch?v=LJ_may0hkaE&feature=youtu.be

Sha*_*hai 5

问题:

基本上,由于hold on轴处理的状态,所有帧都会在您的图形中添加到另一个帧中.这会导致内存堆积并减慢您的速度.

解:

您应该hold在绘制线条后关闭,因此imshow下一帧的内容将丢弃前一帧.

imshow(currentFrame);
hold on;
plot( theLinesThatWereDetected  );
hold off; %// super critical!
drawnow; %// instead of pause
Run Code Online (Sandbox Code Playgroud)

评论:

  1. 正如Ander所指出的,使用drawnow而不是使用更好的做法pause(0.001).
  2. 只是改变XDataYData你的情节(所建议Benoit_11)是不够的,它并没有解决造成图中的"持有"所有的帧存储器的浪费.

  • @ user10678你需要有两个句柄:一个用于图像,一个用于图:`ih = imshow(currFrame); ph = plot(currentLane);`这是第一次.然后,对于所有其他帧`set(ih,'CData',currFrame);`和`set(ph,'XData',laneX,'YData',laneY);`.但是,既然你绘制了两​​个通道,那么你可能只有一个`ph`手柄.您需要自己检查一下. (2认同)