2014-02-22 56 views
0

我想做視頻分析來檢測一段時間內的運動。例如,我的房子外面有一條我的車道的視頻。我想檢查它是否保持乾淨。所以,我想檢測周圍的垃圾(以防萬一)。我嘗試了很多網站,他們說我必須拍攝視頻,並將其分爲幀和XOR幀並找出對象移動。視頻分析來檢測對象[實時]

我試圖找到這個示例代碼,我無法找到相同的。所以如果任何人在這個領域使用OpenCV/Xuggler/JavaCV /或任何軟件和一些代碼的專業知識,可以請發佈,所以我可以開始。

我的主要目標是開發一些軟件,通​​過它我可以實時跟蹤我家外面的垃圾,並檢查是誰傾倒垃圾,以及是否正在清理垃圾。可能嗎?任何想法/建議/建議表示讚賞。非常感謝!

我已經試過OpenCV,但沒有線索如何將視頻分割成幀並應用對象檢測。

謝謝!

+0

[OpenCV如何使用背景減法方法] (http://docs.opencv.org/trunk/doc/tutorials/video/background_subtraction/background_subtraction.html) – Haris

回答

0

這是背景減法技術的代碼。如果背景中有任何變化(在這種情況下是你的車道),你將能夠檢測到它。

你應該有一個由openCV樣本提供的「Background subtraction」的示例代碼。

#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; 
} 
+0

感謝您的輸入,生病嘗試並找回你。 – user3000805

0

就您關於將視頻分割爲幀的查詢而言,您應該知道視頻不過是多個幀的集合。因此,無論何時在openCV中使用VideoCapture capture(videoFilename);,您都會從視頻中捕獲單個幀/圖像。

0

這是非常簡單的藉助谷歌的opencv & javacv圖書館。邏輯是簡單地抓住從網絡攝像頭幀繼續使用一個線程,並執行2個相鄰幀之間的減法。如果兩幀之間有任何變化,它將產生一個白色像素。黑色像素表示幀之間沒有變化[未檢測到運動]。完整的實現可以發現at here