1

如何获得每一帧的“积分”?现在我得到最后一帧的“积分”。我想为每一帧而不是最后一帧获取“点”x 和 y 坐标。

clear all;
clc;
videoFileReader=vision.VideoFileReader('Test.avi');
videoPlayer=vision.VideoPlayer('Position', [100, 100, 680, 520]);
objectFrame=step(videoFileReader);
objectRegion=[1121, 353, 16, 16];
objectImage=insertShape(objectFrame, 'Rectangle', objectRegion,'Color', 'red');
figure;
imshow(objectImage);
title('Yellow box shows object region');
points=detectMinEigenFeatures(rgb2gray(objectFrame), 'ROI', objectRegion);
pointImage=insertMarker(objectFrame, points.Location, '+', 'Color', 'white');
figure,
imshow(pointImage),
title('Detected interest points');
tracker=vision.PointTracker('MaxBidirectionalError', 1);
initialize(tracker, points.Location, objectFrame);
while ~isDone(videoFileReader)
    frame=step(videoFileReader);
    [points, validity]=step(tracker, frame);
    out=insertMarker(frame, points(validity, :), '+');
    step(videoPlayer, out);
end
release(videoPlayer);
release(videoFileReader);
4

1 回答 1

1

您正在用每个新帧覆盖点。因此,当所有代码完成时,只points保存最新的。一个问题VideoFileReader是,在您全部阅读之前,您无法轻易找出有多少帧。(我可能是错的,所以有人随时纠正我)。所以你可以创建一个单元格数组。单元格可以保存各种数据、奇异值、向量、矩阵。这也很好,因为与常规数组的串联不同,每一层不必是相同的大小。因此,假设您有 10 个点frame 1和 3 个点进行frame 2简单的数组连接会失败,因为它们的大小不同。另一方面,细胞并不真正关心这一点。

因此,在您的循环之前,我创建了一个空单元格数组来存储每个帧的值。然后在循环内部,它增加索引并将当前存储points到元胞数组中。在处理结束时,每个帧都会有自己的条目,hist_points希望这会有所帮助

%initialize frame count and cell array
num_frame=1;
hist_points = {};

while ~isDone(videoFileReader)
    frame=step(videoFileReader);

    [points, validity]=step(tracker, frame);

    %this should work no matter what dimension points is, and even if points is
    %a different size each iteration
    hist_points{num_frame} = points;

    out=insertMarker(frame, points(validity, :), '+');
    step(videoPlayer, out);

    %moves to next array location 
    num_frame = num_frame+1
end
于 2015-05-23T00:14:53.923 回答