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()運行後,前景變量不顯示任何編輯符號。它在捕獲時顯示當前幀。 我在做什麼錯? 謝謝
感謝您的答覆。我在我的問題中加入了更多描述。簡而言之,前臺變量是從crrntframe變量中克隆的。通過apply()運行後,沒有任何變化。我剛剛檢查並且背景已經在RGB色彩空間中。 – Thomas