我是OpenCV/JavaCV的新手,我正在尝试使用JavaCV实现MOG2。然而,我似乎无法获得前景图像。背景恢复得很好。但是,当我运行apply()时,我没有得到前景图像。下面的代码是我当前的实现。为了将帧与背景进行比较,我将背景图像中的每个像素与当前帧进行比较。但是,我知道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()运行它之后,前台变量没有显示任何编辑的迹象。它在当前帧被捕获时显示当前帧。我做错了什么?由于
您能提供更多信息吗?你说"好像拍不到前景图"是什么意思?你是如何意识到你"没有它"的?是空的吗?当你试图显示它时,它只是黑色的吗?
我正在使用c++,但是当我试图将前景图像与其他图像一起显示在一个窗口中时,前景图像也有问题。我首先必须将图像从灰度转换为rgb色彩空间(在c++中有cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0)
方法)。也许尝试这可以帮助你,但也许不是因为我不知道你的确切问题是什么;-)