在 Matlab 中使用 MarkerInserter 时出错

Error using MarkerInserter in Matlab

我正在做一个项目,我应该编写一个程序来跟踪视频中的对象。该程序将在 Matlab 中编写。

我遇到的问题是我无法找到一种方法来为函数 vision.MarkerInseter 提供视频中对象的位置坐标。

当我 运行 我的代码时,我收到一条错误消息说

Error using MarkerInserter/step
The Points input must be an M-by-2 matrix. Each row specifies a different center and is of the form [x y].

Error in Tracking_object_in_video (line 69)
        tracking_on_frame = step(tracking_shape, frame, tracking_box);

当我检查 tracking_box 的维度时,它说这是一个 13x1 矩阵。第一个数字因我使用的输入视频而异。但它总是 x1.

这是我到目前为止编写的代码。

请帮帮我,我真的卡住了!

fore_ground_detector = vision.ForegroundDetector('NumTrainingFrames',24,'InitialVariance',0.05);
blob_analyzer = vision.BlobAnalysis('AreaOutputPort',true,'MinimumBlobArea',20,'CentroidOutputPort',true,'ExcludeBorderBlobs',true);

%% Kod för videospelarna som ska användas att visa trackingen på.

tracking_player = vision.DeployableVideoPlayer('Location',[200 200]);
fore_ground_player = vision.DeployableVideoPlayer('Location',[600 200]);

tracking_shape = vision.MarkerInserter('Size', 18, 'Shape', 'square', 'Fill', 0.3, 'FillColor', 'White', 'Opacity', 0.5);

%% Stycke för att spela upp video samt spåra objecten.

while ~isDone(video)

    frame = step(video);                                                   % Tar ut en frame i videon åt gången.
    gray_frame = rgb2gray(frame);                                          % Gör om den framen till gråskala.

    masking = step(fore_ground_detector, gray_frame);                      % Letar rätt på områden som skiljer sig från bakgrunden.
    noise_reduction = bwareaopen(masking,25);                              % Ignorera områden som består av mindre än X antal ihopkopplade pixlar
    tracking_box = step(blob_analyzer, noise_reduction);                   % Bestämmer områden som är av intresse.


    [~,detection] = step(blob_analyzer, noise_reduction);                  % Variable som visar om programmet hittar något objekt eller inte.

    if ~isempty (detection)                                                % Om detection INTE är tom.
        tracking_on_frame = step(tracking_shape, frame, tracking_box);     % Bestämmer var på skärmen som tracking boxen ska vara.
        step(tracking_player, tracking_on_frame);                          % Sätter ihop tracking boxen och framen som vi har analyserat.
    else                                                                   % Om detection ÄR tom.
        step(tracking_player,frame);                                       % Visar bara upp framen som vi har analyserat utan tracking_box.
    end

    step(fore_ground_player, masking);                                     % Spelar upp filmen som blob_analyzern ser den.      
end


delete(tracking_player);
delete(fore_ground_player);

在您的代码中,blob_analyzer 的 tracking_box 输出实际上包含斑点区域。创建 vision.BlobAnalysis 时,除了质心输出外,您还启用了区域输出端口。如果您想标记您的对象,您似乎只需要质心输出。因此,您应该只将 CentroidOutputPort 设置为 true,将 AreaOutputPort 设置为 false。如果你想要两者,你应该如下所示分配两个输出并使用质心输出作为你的标记插入器对象的输入。

[areas, centroids] = step(blob_analyzer, noise_reduction);
...
tracking_on_frame = step(tracking_shape, frame, centroids);