首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >目标检测软件

目标检测软件
EN

Stack Overflow用户
提问于 2014-06-03 07:15:00
回答 1查看 476关注 0票数 1

我想要创建一个运动检测软件获取输入视频通过实时流相机。该软件必须执行以下操作:

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

2-记录在固定时间内屏幕上有多少次移动,并在一分钟内返回有多少次移动。比如每分钟做一次动作计数。您可以在代码中看到-As,我使用toc函数来生成计数器,并使用"cont“变量来计数已注册的移动。我想知道,我需要做什么才能完成柜台.-

虽然我对Matlab有点陌生,但我知道它的库充满了潜力,我愿意更多地了解它。这是我的密码。你们可能想忽略评论部分,因为它是巴西葡萄牙语。

提前谢谢。

我为vision.ForegroundDetector完成了代码的重建,但现在我遇到了一个问题.我不知道如何在subplot(1,2,1); imshow(FrameRGB); title('Imagem Recebida')上重现它的结果,我只知道我不使用imshow.

代码语言:javascript
复制
%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)
代码语言:javascript
复制
%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)

剩下的唯一问题是计数器,我试图通过这一行构建它:

代码语言:javascript
复制
 if timerEnd == 15.0000
                plot(A, timerEnd, 'c');
                cont = 0;      
                A = 0;
            end 

它有什么问题吗?或者仅仅是它所在的地方没有使它正常工作?再次感谢!

EN

回答 1

Stack Overflow用户

发布于 2014-06-03 14:44:38

vision.CascadeObjectDetector用于检测特定的对象类别,如人脸、眼睛、鼻子等。对于运动检测,应该使用vision.ForegroundDetector,这将给出一个二进制掩码,将像素标记为背景(静止)或前景(移动)。然而,这将只有当你的相机不移动时才能工作。

有关更多细节,请参见此示例

有关如何将示例放入自定义UI中,请参阅此vision.VideoPlayer。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24009152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档