Холст JavaCV остается пустым

Я хочу постоянно снимать с веб-камеры и позволять ей смотреть на холст. Сохранение изображения в порядке. Он делает снимок каждую секунду. Но canvas.showImage () не работает. Мой экран остается пустым. На консоли на каждом кадре появляется сообщение «Убрана камера».

Первый класс:

public class StartUp {
public static void main(String[] args) {
    CanvasFrame canvas = new CanvasFrame("Cam");
    canvas.setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);
    CaptureImage captureimage = new CaptureImage();
    while(true){
        try {
            IplImage img = captureimage.captureFrame();
            canvas.showImage(img);
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}
}

Второй класс:

public class CaptureImage {

public IplImage captureFrame() {
    final OpenCVFrameGrabber grabber = new OpenCVFrameGrabber(0);
    try {
        grabber.start();
        IplImage img = grabber.grab();
        if (img != null) {
            cvSaveImage("Image.jpg",img);     
            return img;
        }

    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}
}

person Yves Dejager    schedule 03.12.2012    source источник


Ответы (2)


Попробуйте использовать этот код для захвата веб-камеры. Загрузите библиотеки перед запуском этого кода. (Jar-файлы JavaCV и т. Д.)

import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.FrameGrabber.Exception;
import com.googlecode.javacv.OpenCVFrameGrabber;
import static com.googlecode.javacv.cpp.opencv_core.*;

public class capture{

CanvasFrame frame,fr;
IplImage image,im;
OpenCVFrameGrabber grabber,gr;
public capture() throws Exception {
    frame=new CanvasFrame("Cam 1");
    grabber=new  OpenCVFrameGrabber(0);
     grabber.start();
     while (((frame.isVisible()) && (image = grabber.grab()) != null)){
         //cvFlip(image,image,1); if needed to flip.

         frame.showImage(image);


     }
     frame.setDefaultCloseOperation(1);
     frame.setDefaultCloseOperation(CanvasFrame.EXIT_ON_CLOSE);
}

}

person Anooj Krishnan G    schedule 16.12.2012
comment
В приведенном выше коде переменные fr, im, gr не используются и не требуются. - person Anooj Krishnan G; 16.12.2012

У самого была такая же проблема. Закончилось переписыванием метода initCanvas следующим кодом:

protected void initCanvas(boolean fullScreen, DisplayMode displayMode, double gamma) {
    canvas = new Canvas() {
        /**
         * 
         */
        private static final long   serialVersionUID    = 1L;
        @Override public void update(Graphics g) {
            paint(g);
        }
        @Override public void paint(Graphics g) {
            // Calling BufferStrategy.show() here sometimes throws
            // NullPointerException or IllegalStateException,
            // but otherwise seems to work fine.
            try {
                BufferStrategy strategy = canvas.getBufferStrategy();
                if (strategy != null) {
                    do {
                        do {
                            g = strategy.getDrawGraphics();
                            if (color != null) {
                                g.setColor(color);
                                g.fillRect(0, 0, getWidth(), getHeight());
                            }
                            if (image != null) {
                                g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
                            }
                            if (buffer != null) {
                                g.drawImage(buffer, 0, 0, getWidth(), getHeight(), null);
                            }
                            g.dispose();
                        } while (strategy.contentsRestored());
                        strategy.show();
                    } while (strategy.contentsLost());
                }
                else {
                    g = canvas.getGraphics();
                    if (color != null) {
                        g.setColor(color);
                        g.fillRect(0, 0, getWidth(), getHeight());
                    }
                    if (image != null) {
                        g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
                    }
                    if (buffer != null) {
                        g.drawImage(buffer, 0, 0, getWidth(), getHeight(), null);
                    }
                    g.dispose();
                }
            } catch (NullPointerException e) {
            } catch (IllegalStateException e) { 
            }
        }
    };
    if (fullScreen) {
        canvas.setSize(getSize());
        needInitialResize = false;
    } else {
        needInitialResize = true;
    }
    getContentPane().add(canvas);
    canvas.setVisible(true);
    canvas.createBufferStrategy(2);
    //canvas.setIgnoreRepaint(true);
}
person Nguyễn Minh Vũ    schedule 13.11.2013
comment
Это работает, но вам нужно изменить исходный код ... Это исправление должно быть зафиксировано в проекте. - person rednoyz; 14.10.2014