2013-05-29 101 views
6

我正在使用OpenCV243的項目,我需要在流中獲取前景,我的問題是,我使用cv :: absdiff得到它並沒有真正的幫助,這裏是我的代碼和結果。在OpencV中的背景和前景

#include <iostream> 
#include<opencv2\opencv.hpp> 
#include<opencv2\calib3d\calib3d.hpp> 
#include<opencv2\core\core.hpp> 
#include <opencv2\highgui\highgui.hpp> 

int main(){ 
    cv::VideoCapture cap(0); 
    cv::Mat frame,frame1,frame2; 
    cap >> frame; 
    frame.copyTo(frame1); 
    cv::imwrite("background.jpeg",frame1); 
    int key = 0; 
    while(key!=27){ 
     cap >> frame; 
     cv::absdiff(frame, frame1, frame2); // frame2 = frame -frame1 
     cv::imshow("foreground", frame2); 
     if(key=='c'){ 
      //frame.copyTo(frame2); 
      cv::imwrite("foreground.jpeg", frame2); 
      key = 0; 
     } 

     cv::imshow("frame",frame); 
     key = cv::waitKey(10); 
    } 
    cap.release(); 
    return 0; 
} 

Background foreground 你可以看到減法工作,但我想是的,改變,例如,如果在後臺與[130130130]和相同像素的像素僅值在框架[200200200]我想正是最後的值,而不是[70,70,70] 我已經看到了這個教程:http://mateuszstankiewicz.eu/?p=189 ,但我不明白的代碼,我有問題設置cv :: BackgroundSubtractorMOG2我OpenCV的版本

在此先感謝您的幫助

回答

3

BackgroundSubtractorMOG2應與#include "opencv2/video/background_segm.hpp" 工作,OpenCV的樣品有兩個很不錯的C++實例(樣品\ CPP目錄)。

  • bgfg_segm.cpp展示瞭如何使用BackgroundSubtractorMOG2
  • bgfg_gmg.cpp使用BackgroundSubtractorGMG

爲了得到最後的值(和asuming你的意思,以獲得前景像素值),你可以複製使用前景蒙版的框架。這也在第一個例子中完成,在以下代碼片段中:

bg_model(img, fgmask, update_bg_model ? -1 : 0); 
fgimg = Scalar::all(0); 
img.copyTo(fgimg, fgmask);