Программное обеспечение для обнаружения объектов

Я хочу создать программное обеспечение для обнаружения движения, получающее входное видео через камеру Live Stream. Это программное обеспечение должно будет сделать следующее:

1- Когда на нем обнаружено движение, он рисует прямоугольник вокруг области, в которой есть движение. -Для рисования прямоугольника я думал использовать vision.CascadeObjectDetector, так как есть пример, который они используют для распознавания лиц, но проблема в том, что я не знаю, работает ли CascadeObjectDetector с кодом, который я сделал (видеоввод). Следует ли это делать с помощью imaqVideoDevice?

2- Зарегистрируйте, сколько раз было движение на экране в течение постоянного времени, и верните, сколько движений было в течение минуты. Как выполнение количества движений в минуту. - Как вы можете видеть в кодах, я использовал функцию тик-так, чтобы сделать счетчик, и переменную «cont» для подсчета зарегистрированных движений. Я хотел бы знать, что мне нужно сделать, чтобы закончить счетчик...-

Хотя я новичок в Matlab, я знаю, что его библиотека полна потенциала, и я хочу узнать о ней больше. Вот мой код. Вы, ребята, можете игнорировать прокомментированные части, потому что они на бразильском португальском языке.

Заранее спасибо.


Мне удалось перестроить мой код для vision.ForegroundDetector, но теперь у меня проблема... Я не знаю, как воспроизвести его результаты в subplot(1,2,1); imshow(FrameRGB); title('Imagem Recebida'), единственное, что я знаю, это то, что я не использую imshow...

%O botão Fechar, deve finalizar o código e parar a câmera
uicontrol('String', 'Fechar',...
          'Callback', 'stop(camera)',...
          'Callback', 'close');
camera = videoinput('winvideo', 1, 'MJPG_320x240');

Detect = vision.ForegroundDetector(...
       'NumTrainingFrames', 100, ... % 5 because of short video
       'InitialVariance', 30*30); % initial standard deviation of 30
hblob = vision.BlobAnalysis(...
       'CentroidOutputPort', false, 'AreaOutputPort', false, ...
       'BoundingBoxOutputPort', true, ...
       'MinimumBlobAreaSource', 'Property', 'MinimumBlobArea', 250);
hsi = vision.ShapeInserter('BorderColor','White');

set(camera,'TriggerRepeat', Inf);
camera.FrameGrabInterval = 1.5;

cont = 0; %cont é a variável que vai armazenar o movimento
A = 0;
timerEnd = 0;

start(camera)
timerStart = tic;
hsnk = vision.VideoPlayer();

while(camera.FramesAcquired>=0)

        FrameRGB = getsnapshot(camera);
        fgMask = step(Detect, FrameRGB);
        bbox   = step(hblob, fgMask);
        out    = step(hsi, FrameRGB, bbox); % draw bounding boxes around cars
        %drawnow;
        subplot(1,2,1); imshow(hsnk); title('Imagem Recebida')
        text(cont, timerEnd,...
        ['Contador:', num2str(cont/timerEnd)],...
        'HorizontalAlignment', 'left');


        IM = getdata(camera,2);
        IMGray = rgb2gray(IM(:,:,1:3));
        IMbw=im2bw(IMGray,0.5);
        IMneg=imadjust(IMGray,[0 1],[1 0]);

        i1=IM(:,:,:,1);
        i2=IM(:,:,:,2);
        i1=rgb2gray(i1(:,:,1:3));
        i2=rgb2gray(i2(:,:,1:3));
        m=abs(double(i1)-double(i2))/256;
        subplot(1,2,2);imshow(m);title('Detecção de Movimentos')



        if sum(sum(m))>700

            cont = cont+1;
            A = mod(cont,0);
        end

        timerEnd = toc(timerStart);
        fprintf('Em %d minutos e %f segundos, obteve-se %14.0f movimentos  \n', floor(timerEnd/60), rem(timerEnd,60), A);

end

stop(camera)

%O botão Fechar, deve finalizar o código e parar a câmera
uicontrol('String', 'Fechar',...
          'Callback', 'stop(camera)',...
          'Callback', 'close');
camera = videoinput('winvideo', 1, 'MJPG_320x240');

Detect = vision.ForegroundDetector(...
       'NumTrainingFrames', 10, ... % 5 because of short video
       'InitialVariance', 4.5*4.5); % initial standard deviation of 30

hblob = vision.BlobAnalysis(...
       'CentroidOutputPort', false, 'AreaOutputPort', false, ...
       'BoundingBoxOutputPort', true, ...
       'MinimumBlobAreaSource', 'Property', 'MinimumBlobArea', 250);
hsi = vision.ShapeInserter('BorderColor','White');

set(camera,'TriggerRepeat', Inf);
camera.FrameGrabInterval = 1.5;

cont = 0; %cont é a variável que vai armazenar o movimento
A = 0;


start(camera)
timerStart = tic;
% hsnk = vision.VideoPlayer();


while(camera.FramesAcquired>=0)

        FrameRGB = getsnapshot(camera);
        fgMask = step(Detect, FrameRGB);
        bbox   = step(hblob, fgMask);
        out    = step(hsi, FrameRGB, bbox); % draw bounding boxes around cars
        subplot(1,2,1);imshow(out);title('Imagem x')


        IM = getdata(camera,2);
        IMGray = rgb2gray(IM(:,:,1:3));
        IMbw=im2bw(IMGray,0.5);
        IMneg=imadjust(IMGray,[0 1],[1 0]);

        i1=IM(:,:,:,1);
        i2=IM(:,:,:,2);
        i1=rgb2gray(i1(:,:,1:3));
        i2=rgb2gray(i2(:,:,1:3));
        m=abs(double(i1)-double(i2))/256;
        subplot(1,2,2);imshow(m);title('Detecção de Movimentos')



        if sum(sum(m))>700

            cont = cont+1;
            A = mod(cont,0); 
        end

         if toc(timerStart) == 15.0000
            plot(A, timerEnd, 'c');
            cont = 0;      
            A = 0;
        end 

        timerEnd = toc(timerStart);
        fprintf('Em %f segundos, obteve-se %14.0f movimentos  \n',rem(timerEnd,60), A);
        %fprintf('Em %d minutos e %f segundos, obteve-se %14.0f movimentos  \n', floor(timerEnd/60), rem(timerEnd,60), A);

end


stop(camera)

Осталась единственная проблема — счетчик, который я пытался построить через эту строку:

 if timerEnd == 15.0000
                plot(A, timerEnd, 'c');
                cont = 0;      
                A = 0;
            end 

Что-то не так с этим, или это просто место, где он расположен, что не заставляет его работать должным образом? Еще раз спасибо!


person HextechEnthusiast    schedule 03.06.2014    source источник


Ответы (1)


vision.CascadeObjectDetector предназначен для обнаружения определенных категорий объектов, таких как лица, глаза, носы и т. д. Для обнаружения движения вы должны использовать vision.ForegroundDetector, что даст вам бинарную маску, помечающую пиксели как фон (неподвижные) или передний план (движущиеся). Однако это будет работать только в том случае, если ваша камера не двигается.

Дополнительные сведения см. в этом примере.

См. этот пример как поместить vision.VideoPlayer в пользовательский интерфейс.

person Dima    schedule 03.06.2014
comment
Собственно проект для статической камеры. Я попробую! - person HextechEnthusiast; 04.06.2014
comment
Я добавил ссылку на пример. Удачи! - person Dima; 04.06.2014
comment
Итак, я попытался заменить vision.CascadeObjectDetector на vision.ForegroundDetector. Я перестраиваю весь код на основе набора ForegroundDetector. Теперь я хочу знать, как мне вызвать изображение с действующим ForegroundDetector, но без использования VideoPlayer. Или, если возможно показать содержимое из subplot(1,2,2);imshow(m);title('Detecção de Movimentos') внутри VideoPlayer... - person HextechEnthusiast; 04.06.2014
comment
Вы можете показывать любые изображения в видеоплеере, если все они имеют одинаковый размер и тип данных. Или вы можете показать маску, созданную детектором переднего плана в imshow. Также добавлю ссылку на пример использования видеоплеера в кастомных осях. - person Dima; 04.06.2014
comment
Мне удалось поместить его в другую фигуру, созданную с помощью subplot, но вместо vision.VideoPlayer я просто использовал видеоввод. Теперь я пытаюсь реализовать счетчик, и я понятия не имею, почему он не активируется во время процесса. Я буду обновлять свой вопрос. - person HextechEnthusiast; 05.06.2014