我想做视频分析,以检测特定持续时间内的运动。例如,我在我的房子外面有一段我的小巷的视频。我想检查一下它是否保持干净。因此,我想要检测周围的垃圾(以防它被清理)。我尝试了很多网站,他们说我必须把视频分成帧,然后对帧进行异或运算,找出物体的运动。
我试图找到示例代码,但我找不到相同的代码。所以,如果任何人有这方面的专业知识使用OpenCV/Xuggler/JavaCV/或任何软件和一些代码,你可以请张贴,这样我就可以开始了。
我的主要目标是开发一些软件,通过它我可以实时跟踪我屋外的垃圾,并检查谁在倾倒垃圾,以及垃圾是否正在被清理。有可能吗?如有任何想法/建议/建议,欢迎光临。非常感谢!
我尝试过OpenCV,但不知道如何将视频分割成帧并对其应用对象检测。
谢谢!
发布于 2014-02-22 19:11:45
这是基于背景减除技术的代码。如果背景中有任何变化(在本例中是您的车道),您将能够检测到它。
您应该有一个由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;
}发布于 2014-02-22 19:22:51
就您对将视频拆分为帧的查询而言,您应该知道视频只不过是几个帧的集合。因此,每当您在openCV中使用VideoCapture capture(videoFilename);时,您都是在从视频中捕获单个帧/图像。
发布于 2014-03-01 03:02:41
在google的opencv和javacv libraries.The的帮助下,它非常简单,逻辑只是简单地从摄像头中抓取帧,继续使用线程,并在两个后续帧之间执行减法。如果两个帧之间有任何变化,它将产生一个白色的pixel.Black像素,表示帧之间没有变化没有运动detected.The完整的实现可以找到at here
https://stackoverflow.com/questions/21952891
复制相似问题