Как изменить формат веб-камеры в JavaCV?

Наконец-то я заставил JavaCV работать с моей веб-камерой, но я не могу найти способ изменить выходной формат захваченного изображения.

В моем ноутбуке HP установлена ​​фиксированная веб-камера HP HD (720p). Единственное разрешение, которое я получаю, - 640x480. Я пробовал использовать все доступные подклассы FrameGrabber.

Я использую этот простой код:

import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.FrameGrabber;
import com.googlecode.javacv.cpp.opencv_core.IplImage;

public class Webcam {

    public static void main(String[] args) throws Exception {
        FrameGrabber grabber = FrameGrabber.createDefault(0);
        grabber.start();

        IplImage grabbedImage = grabber.grab();

        CanvasFrame frame = new CanvasFrame("Some Title", CanvasFrame.getDefaultGamma() / grabber.getGamma());

        while (frame.isVisible() && (grabbedImage = grabber.grab()) != null) {
            frame.showImage(grabbedImage);
        }

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

}

Мне что-то не хватает или есть другой способ захвата изображения с веб-камеры с помощью JavaCV?


person Branislav Kuliha    schedule 04.04.2012    source источник


Ответы (1)


Я нашел другой способ захвата с веб-камеры, а также установил некоторые свойства, такие как предпочтительная ширина и высота.

Этот код работает для меня:

import com.googlecode.javacv.CanvasFrame;
import com.googlecode.javacv.cpp.opencv_core.IplImage;
import com.googlecode.javacv.cpp.opencv_highgui;
import com.googlecode.javacv.cpp.opencv_highgui.CvCapture;

public class Webcam {

    public static void main(String[] args) throws Exception {
        CvCapture capture = opencv_highgui.cvCreateCameraCapture(0);

        opencv_highgui.cvSetCaptureProperty(capture, opencv_highgui.CV_CAP_PROP_FRAME_HEIGHT, 720);
        opencv_highgui.cvSetCaptureProperty(capture, opencv_highgui.CV_CAP_PROP_FRAME_WIDTH, 1280);

        IplImage grabbedImage = opencv_highgui.cvQueryFrame(capture);

        CanvasFrame frame = new CanvasFrame("Webcam");

        while (frame.isVisible() && (grabbedImage = opencv_highgui.cvQueryFrame(capture)) != null) {
            frame.showImage(grabbedImage);
        }

        frame.dispose();
        opencv_highgui.cvReleaseCapture(capture);
    }

}

Надеюсь, это поможет кому-то с той же проблемой.

person Branislav Kuliha    schedule 05.04.2012
comment
Вызов grabber.setImageWidth() и setImageHeight() перед start() также должен делать то, что вам нужно. - person Samuel Audet; 15.04.2012
comment
Ты прав, Самуэль, я это как-то пропустил или поставил после start(). - person Branislav Kuliha; 23.04.2012
comment
@BranislavKuliha, когда я установил свой Logitech C910 на его родные 5MP, я обнаружил, что FPS FrameGrabber немного падает по сравнению с 640x480 (маслянисто плавно). Это больше доступных ресурсов моей системы, чем что-либо еще? Я хочу использовать это как корпоративное решение, и если мне просто нужно настроить очень мощный компьютер, пусть будет так! - person Davek804; 03.08.2012
comment
@ Davek804: Я не знаю, ваша веб-камера поддерживает захват 5 МП с такой высокой частотой кадров. Установите флажок ссылка, чтобы увидеть полные спецификации и системные требования. Я думаю, что ваш fps должен быть плавным при максимальном разрешении 1080p, то есть захвате 2MP. - person Branislav Kuliha; 04.08.2012