这是视频中的对象检测代码。
我想逐帧裁剪此视频中的对象。
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), :);
"指数超过矩阵维度"错误来了。 请帮我如何从图像中裁剪对象
答案 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个像素的数组。