视频分析检测对象[实时]

时间:2014-02-22 10:18:18

标签: opencv video image-processing object-detection

我想进行视频分析以及时检测一段时间内的移动。例如,我的房子外面有我的车道视频。我想检查它是否仍然干净。所以,我想检测周围的垃圾(以防它被清理)。我尝试了很多网站,他们说我必须拍摄视频并将其划分为帧并对帧进行XOR并找出对象移动。

我试图为此找到示例代码,但我无法找到相同的代码。因此,如果有人使用OpenCV / Xuggler / JavaCV /或任何软件和一些代码在这个领域的专业知识,请你发帖,所以我可以开始。

我的主要目标是开发一些软件,通​​过它我可以实时跟踪我家外面的垃圾,检查是谁倾倒它,以及是否正在清理它。可能吗?任何想法/建议/意见表示赞赏。非常感谢!

我尝试过OpenCV,但不知道如何将视频分割成帧并在其上应用对象检测。

谢谢!

3 个答案:

答案 0 :(得分:0)

这是基于背景减法的技术代码。如果背景中有任何变化(在这种情况下是您的车道),您将能够检测到它。

您应该有一个由openCV样本提供的“背景扣除”示例代码。

#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/video/background_segm.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdio.h>

#include <iostream>
#include <vector>

using namespace std;
using namespace cv;

int main()
{

    VideoCapture cap;
    bool update_bg_model = true;

    cap.open(0);
    cv::BackgroundSubtractorMOG2 bg;//(100, 3, 0.3, 5);
    bg.set ("nmixtures", 3);
    std::vector < std::vector < cv::Point > >contours;

    cv::namedWindow ("Frame");
    cv::namedWindow ("Background");

    Mat frame, fgmask, fgimg, backgroundImage;

    for(;;)
    {
        cap >> frame;
        bg.operator()(frame, fgimg);
        bg.getBackgroundImage (backgroundImage);
        cv::erode (fgimg, fgimg, cv::Mat ());
        cv::dilate (fgimg, fgimg, cv::Mat ());

        cv::findContours (fgimg, contours, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
        cv::drawContours (frame, contours, -1, cv::Scalar (0, 0, 255), 2);

        cv::imshow ("Frame", frame);
        cv::imshow ("Background", backgroundImage);


        char k = (char)waitKey(30);
        if( k == 27 ) break;

    }

    return 0;
}

答案 1 :(得分:0)

就您关于将视频拆分为帧的问题而言,您应该知道视频只不过是几个帧的集合。因此,无论何时在openCV中使用VideoCapture capture(videoFilename);,您都会从视频中捕获单个帧/图像。

答案 2 :(得分:0)

借助google的opencv&amp; amp; javacv libraries。逻辑只是继续使用线程从网络摄像头抓取帧并在2个相关帧之间执行减法。如果两帧之间有任何变化,它将产生一个白色像素。黑色像素表示帧之间没有变化[未检测到运动]。可以找到完整的实现at here