2013-04-05 3 views
5

Я новичок в мире Stackoverflow и программирования OpenCV. Я сделал несколько проектов с OpenCV Bindings для Java (должностные лица opencv.org, а не JavaCV), как распознавание объектов через функции ORB и SURF, работа с изображениями. Все в порядке. Теперь я перехожу к распознаванию объектов в видеопотоках. Я хочу захватить поток с веб-камеры и применить распознавание объектов. Я не Java-гуру, поэтому я нашел в OpenCV класс VideoCapture, но я не могу получить фотографии с камеры.OpenCV 2.4.4 Java - захват изображения/потока веб-камеры (OSX)

Я запускаю свой проект в Eclipse с помощью OpenCV 2.4.4 привязок, в OSX Mountain Lion.

В результате в консоли:

Hello, OpenCV 
Camera OK? 
Frame Obtained 
Captured Frame Width 0 
Invalid memory access of location 0x7fae00000000 rip=0x7fff8b4c5263 

Код:

import org.opencv.core.Mat; 
import org.opencv.highgui.Highgui; 
import org.opencv.highgui.VideoCapture; 

public class Webcam { 

    public static void main (String args[]){ 

    System.out.println("Hello, OpenCV"); 
    // Load the native library. 
    System.loadLibrary("opencv_java244"); 

    VideoCapture camera = new VideoCapture(0); 
    camera.open(0); //Useless 
    if(!camera.isOpened()){ 
     System.out.println("Camera Error"); 
    } 
    else{ 
     System.out.println("Camera OK?"); 
    } 

    Mat frame = new Mat(); 

    //camera.grab(); 
    //System.out.println("Frame Grabbed"); 
    //camera.retrieve(frame); 
    //System.out.println("Frame Decoded"); 

    camera.read(frame); 
    System.out.println("Frame Obtained"); 

    /* No difference 
    camera.release(); 
    */ 

    System.out.println("Captured Frame Width " + frame.width()); 

    Highgui.imwrite("camera.jpg", frame); 
    System.out.println("OK"); 
    } 
} 
+0

Кодируется изображение .png. –

+0

Проблема не в формате изображения. Консоль говорит, что ширина изображения равна 0. Изменение формата изображения в PNG изменяет последнюю строку в консоли на: «предупреждение libpng: ширина изображения равна нулю в IHDR»; «Предупреждение libpng: высота изображения равна нулю в IHDR»; «Ошибка libpng: неверные данные IHDR». –

+1

РЕШЕН. Проблема заключалась в том, что для инициализации камера требует времени. Я добавил «Thread.sleep (1000)»; после "VideoCapture camera = new VideoCapture (0);". –

ответ

7

Проблема заключалась в том, что просто камера нужно время для инициализации. Я добавил

Thread.sleep(1000); 

после

VideoCapture camera = new VideoCapture(0); 
3

Я попробовал этот код в MacOS, и нашел другую ошибку.

System.loadLibrary("opencv_java244"); 

Над линией возвращает эту ошибку

java.lang.UnsatisfiedLinkError: org.opencv.highgui.VideoCapture.VideoCapture_2(I)J 

Чтобы преодолеть его, я заменил эту строку с этим одним

System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 

и код работает!

Я использую OpenCV 2.4.8, включая его в качестве пользовательской библиотеки в моем затмение проекта

+0

Для других: у меня были некоторые проблемы с UnsatisfiedLinkError. Я пропустил шаг, чтобы установить «Локальное расположение библиотеки» в пользовательской библиотеке на «/lib». Надеюсь, это поможет кому-то. – Christof

3

Заменить
System.loadLibrary("opencv_java244");
с
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);