我想进行视频分析以及时检测一段时间内的移动。例如,我的房子外面有我的车道视频。我想检查它是否仍然干净。所以,我想检测周围的垃圾(以防它被清理)。我尝试了很多网站,他们说我必须拍摄视频并将其划分为帧并对帧进行XOR并找出对象移动。
我试图为此找到示例代码,但我无法找到相同的代码。因此,如果有人使用OpenCV / Xuggler / JavaCV /或任何软件和一些代码在这个领域的专业知识,请你发帖,所以我可以开始。
我的主要目标是开发一些软件,通过它我可以实时跟踪我家外面的垃圾,检查是谁倾倒它,以及是否正在清理它。可能吗?任何想法/建议/意见表示赞赏。非常感谢!
我尝试过OpenCV,但不知道如何将视频分割成帧并在其上应用对象检测。
谢谢!
答案 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