Я хочу создать программное обеспечение для обнаружения движения, получающее входное видео через камеру 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
Что-то не так с этим, или это просто место, где он расположен, что не заставляет его работать должным образом? Еще раз спасибо!