如何在matlab中从图像中裁剪多个对象

时间:2014-11-16 06:20:32

标签: matlab image-processing matlab-cvst

这是视频中的对象检测代码。

我想逐帧裁剪此视频中的对象。

videoSource = vision.VideoFileReader('viptraffic.avi','ImageColorSpace','Intensity'...
'VideoOutputDataType','uint8');

detector = vision.ForegroundDetector(...
   'NumTrainingFrames', 5, ... 
   'InitialVariance', 30*30);

 blob = vision.BlobAnalysis(...
   'CentroidOutputPort', false, 'AreaOutputPort', false, ...
   'BoundingBoxOutputPort', true, ...
   'MinimumBlobAreaSource', 'Property', 'MinimumBlobArea', 250);

 shapeInserter = vision.ShapeInserter('BorderColor','White');

videoPlayer = vision.VideoPlayer();

while ~isDone(videoSource)

 frame  = step(videoSource);
 fgMask = step(detector, frame);
 bbox   = step(blob, fgMask);
 out    = step(shapeInserter, frame, bbox); 
 step(videoPlayer, out); 
end
release(videoPlayer);  
release(videoSource);

当我想从框架中裁剪bbox时 它总是给我错误"无效的输入参数"

如果我写这个命令。

 frame(bbox(1):bbox(1)+bbox(3), bbox(2):bbox(2)+bbox(4), :);

"指数超过矩阵维度"错误来了。 请帮我如何从图像中裁剪对象

2 个答案:

答案 0 :(得分:1)

尝试

frame(bbox(2):bbox(2)+bbox(4), bbox(1):bbox(1)+bbox(3), :);

bbox中的值采用格式[ x y w h ],而frame中的索引应采用行列顺序:您需要将x和y的顺序更改为行列

答案 1 :(得分:0)

您需要处理未检测到框(bbox为空)的情况以及检测到多个框时bbox是M-by-2矩阵)。

所以你应该有一个循环:

for i = 1:size(bbox, 1)
  croppedImage = frame(bbox(i, 2):bbox(i, 2)+bbox(i, 4), bbox(i, 1):bbox(i, 1)+bbox(i, 3), :);
  % do something wiht croppedImage
end

或者,您可以使用imcrop功能:

croppedImage = imcrop(bbox(i, :));

请注意,imcrop将返回x和y中比其他方法小1个像素的数组。