【问题标题】:Object Detection software物体检测软件
【发布时间】:2024-01-22 22:12:01
【问题描述】:

我想创建一个运动检测软件,通过 Live Stream Camera 获取输入视频。该软件必须执行以下操作:

1- 当检测到移动时,它会在有移动的区域周围绘制一个矩形。 - 对于绘制矩形,我想使用 vision.CascadeObjectDetector,因为有一个他们用来进行人脸识别的示例,但问题是我不知道 CascadeObjectDetector 是否适用于我制作的代码(视频输入)。应该用imaqVideoDevice来做吗?-

2- 记录在恒定时间内屏幕上有多少次移动,并返回一分钟内有多少次移动。就像每分钟计算一次动作一样。 - 正如您在代码中看到的那样,我使用 tic-toc 函数来制作计数器和“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 

它有什么问题,还是只是所在的地方无法正常工作? 再次感谢!

【问题讨论】:

    标签: matlab computer-vision object-detection matlab-cvst


    【解决方案1】:

    vision.CascadeObjectDetector 用于检测特定的对象类别,例如面部、眼睛、鼻子等。对于运动检测,您应该使用vision.ForegroundDetector,它会给您一个二进制掩码,将像素标记为背景(静止)或前景(移动)。但是,这仅在您的相机不移动时才有效。

    查看example了解更多详情。

    请参阅example,了解如何将 vision.VideoPlayer 放入自定义 UI。

    【讨论】:

    • 实际上该项目是针对静态相机的。我试试看!
    • 我添加了一个示例链接。祝你好运!
    • 所以,我尝试用 vision.ForegroundDetector 替换 vision.CascadeObjectDetector。我根据 ForegroundDetector 的设置重建了整个代码。现在我想知道,如何在不使用 VideoPlayer 的情况下使用 ForegroundDetector 调用图像。或者如果可以在 VideoPlayer 中显示 subplot(1,2,2);imshow(m);title('Detecção de Movimentos') 的内容...
    • 您可以在视频播放器中显示任何图像,只要它们具有相同的大小和数据类型。或者您可以在 imshow 中显示由前景检测器创建的蒙版。我还将添加一个指向如何在自定义轴中使用视频播放器的示例的链接。
    • 我设法把它放在我的另一个图中,那个是用“subplot”创建的,但我没有使用“vision.VideoPlayer”,而是使用了“videoinput”。现在我正在尝试实现计数器,但我不知道为什么它在此过程中没有激活。我会更新我的问题。