Matlab Video Reader - рисовать диск на объектах - PullRequest
2 голосов
/ 08 января 2020

Я пытаюсь нарисовать диск на объектах в видео (объект - это автомобили, которые движутся по дороге слева направо).

мой код:

obj = VideoReader('Cars.avi');
get(obj)

im = read(obj,71);
nframes = get(obj,'NumberOfFrames');

sedisk = strel('disk',10);
im_new = imopen(im,sedisk);
stats = regionprops(im_new);
area_array = [stats.Area];

im2 = read(obj,1);
figure,imagesc(im2);
for i=1:nframes-1
    stats(i).Centroid
    frame = read(obj,i);
    imshow(frame);
end

я вижу кадры а не диск на авто, почему не работает? может что то в логи c не так?

спасибо всем

1 Ответ

0 голосов
/ 08 января 2020

Вам необходимо ввести код regionprops в поле для l oop и нанести области на изображение.

  • Начните с следующей документации MATLAB regionprops

Я создал пример кода с traffic.avi в качестве входного файла.
traffic.avi file поставляется с моей установкой MATLAB (в папке toolbox/images/imdata/).

Вот пример кода (пожалуйста, прочитайте комментарии):

clear
close all

%obj = VideoReader('Cars.avi');
obj = VideoReader('traffic.avi');

nframes = get(obj, 'NumberOfFrames');

%sedisk = strel('disk', 10);
sedisk = strel('disk', 2); %Smaller disk fits traffic.avi (you can keep sedisk = strel('disk', 10))

%Read first image (assume no cars). In your code you can keep: im = read(obj,71);
im1 = read(obj,1);

for i = 2:nframes
    im = read(obj, i);

    imshow(im); %Show the frame

    %Subtract frame form the first frame - assume the cars will pop up in the difference image.
    diff_im = uint8(abs(double(im) - double(im1)));

    I = rgb2gray(diff_im); %Convert to grayscale image
    BW = imbinarize(I); %Convert to binary image.

    im_new = imopen(BW, sedisk);
    stats = regionprops('table', im_new, 'Centroid', 'MajorAxisLength', 'MinorAxisLength'); %MATLAB documentation code sample

    %imshow(im_new);

    if (~isempty(stats))
        %stats(i).Centroid
        centers = stats.Centroid; %Get centers (MATLAB documentation code sample)

        %Get radius of the circles (MATLAB documentation code sample).
        diameters = mean([stats.MajorAxisLength stats.MinorAxisLength],2);
        radii = diameters/2;

        %Plot the circles on the displayed video frame.
        hold on
        viscircles(centers,radii);
        hold off
    end

    pause(0.1); %Pause 0.1 seconds
end

Код не маркирует автомобили точно (просто демонстрирует этапы).

Вот пример кадра:
enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...