2014-05-02 19 views
0

我是OpenCV/JavaCV的新手,我正嘗試使用JavaCV實現MOG2。但是,我似乎無法獲得前景圖像。背景很好。但是,當我運行apply()時,我沒有得到前景圖像。下面的代碼是我目前的實現。爲了將幀與背景進行比較,我將背景圖像中的每個像素與當前幀進行比較。但是,我知道MOG2應該返回前景圖像。無法從MOG2獲得前景

import java.awt.Color; 
import java.awt.image.BufferedImage; 

import com.googlecode.javacv.CanvasFrame; 
import com.googlecode.javacv.FrameGrabber; 
import com.googlecode.javacv.FrameGrabber.Exception; 
import com.googlecode.javacv.cpp.opencv_core.IplImage; 
import com.googlecode.javacv.cpp.opencv_video.BackgroundSubtractorMOG2; 



public class Mog2Test { 

/** 
* @param args 
* @throws Exception 
*/ 
public static void main(String[] args) throws Exception { 
    BackgroundSubtractorMOG2 mog=new BackgroundSubtractorMOG2(10, 10, false); 

    FrameGrabber grabber= FrameGrabber.createDefault(0); 
    grabber.start(); 

    IplImage foreground; 
    IplImage background = null; 
    IplImage crrntFrame; 

    CanvasFrame frame = new CanvasFrame("Output"); 

    while(frame.isVisible() && (crrntFrame=grabber.grab())!=null){ 
     foreground=crrntFrame.clone(); 
     background=crrntFrame.clone(); 

     mog.apply(crrntFrame, foreground,.01); 
     mog.getBackgroundImage(background); 
     BufferedImage bfiBack=background.getBufferedImage(); 
     BufferedImage bficrrnt = crrntFrame.getBufferedImage(); 




     for(int x=0; x<bficrrnt.getWidth(); x++){ 
      for(int y=0; y<bficrrnt.getHeight(); y++){ 
      // System.out.println(x+" "+y); 
       Color cc = new Color(bficrrnt.getRGB(x, y)); 
       Color bgc = new Color(bfiBack.getRGB(x, y)); 

       int bgGray= (bgc.getRed()+bgc.getGreen()+bgc.getBlue())/3; 
       int cGray=(cc.getRed()+cc.getBlue()+cc.getGreen())/3; 

       if(!(cGray<bgGray+5 && cGray> bgGray-5)){ 
        bficrrnt.setRGB(x, y, 0); 
       } 
      } 
     } 

     frame.showImage(bficrrnt); 


    } 

    grabber.stop(); 
    frame.dispose(); 

} 

} 

正如您所看到的,我通過克隆抓取的圖像來初始化前景變量。通過apply()運行後,前景變量不顯示任何編輯符號。它在捕獲時顯示當前幀。 我在做什麼錯? 謝謝

回答

0

你能提供更多的信息嗎?你是什​​麼意思「似乎無法得到前景圖像」?你怎麼意識到你「沒有它」?它是空的嗎?當你試圖展示它時,它只是黑色嗎?

我使用C++,但是當我試圖在一個窗口中沿着其他圖像顯示它時,前景圖像也出現問題。我首先必須將圖像從灰色轉換爲rgb-colorspace(在C++中,此方法爲cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0))。也許嘗試這可能會幫助你,但也許不會,因爲我不知道你的確切問題是什麼;-)

+0

感謝您的答覆。我在我的問題中加入了更多描述。簡而言之,前臺變量是從crrntframe變量中克隆的。通過apply()運行後,沒有任何變化。我剛剛檢查並且背景已經在RGB色彩空間中。 – Thomas