Не могу получить передний план от MOG2

Я новичок в OpenCV/JavaCV, и я пытаюсь реализовать MOG2 с использованием JavaCV. Тем не менее, я не могу получить изображение на переднем плане. Фон возвращается просто отлично. Однако, когда я запускаю 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() переменная переднего плана не показывает никаких признаков редактирования. Он отображает текущий кадр, как он был захвачен. Что я делаю неправильно? Спасибо

1 ответ

Решение

Не могли бы вы предоставить больше информации? Что вы подразумеваете под "не могу получить изображение на переднем плане"? Как вы понимаете, что у вас его нет? Это пусто? Это просто черный, когда вы пытаетесь отобразить его?

Я использую C++, но у меня также была проблема с изображением переднего плана, когда я пытался отобразить его вместе с другими изображениями в одном окне. Сначала я должен был преобразовать изображение из серого в цветовое пространство rgb (в C++ есть метод cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0) за это). Может быть, попытка этого может помочь вам, но, возможно, нет, так как я не знаю, в чем ваша конкретная проблема;-)

Другие вопросы по тегам