2013-04-05 19 views
5

Jestem nowy w świecie Stackoverflow oraz w programowaniu OpenCV. Zrobiłem kilka projektów z Wiązaniami OpenCV dla Javy (urzędnicy opencv.org, nie JavaCV), takimi jak rozpoznawanie obiektów za pomocą funkcji ORB i SURF, praca z obrazami. Wszystko w porządku. Teraz przechodzę do rozpoznawania obiektów w strumieniach wideo. Chcę pobrać strumień z kamery internetowej i zastosować rozpoznawanie obiektów. Nie jestem guru Java, więc znalazłem w OpenCV klasę VideoCapture, ale nie jestem w stanie uzyskać zdjęć z kamery.OpenCV 2.4.4 Java - Grab Webcam picture/stream (OSX)

Mam swój projekt w środowisku Eclipse z wiązaniami OpenCV 2.4.4, w systemie OSX Mountain Lion.

Wynik w konsoli:

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

Kod:

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

Spróbuje zakodować obraz jako .png. –

+0

Problem nie dotyczy formatu obrazu. Konsola mówi, że szerokość obrazu wynosi 0. Zmiana formatu obrazu na PNG zmienia ostatnią linię w konsoli na: "libpng warning: szerokość obrazu wynosi zero w IHDR"; "libpng warning: Wysokość obrazu wynosi zero w IHDR"; "Błąd libpng: nieprawidłowe dane IHDR". –

+1

SOLVED. Problem polegał na tym, że aparat potrzebuje czasu na zainicjowanie. Dodałem "Thread.sleep (1000);" po "VideoCapture camera = new VideoCapture (0);". –

Odpowiedz

7

Problem polegał na tym, że kamera po prostu potrzeba czasu, aby zainicjować. Dodałem

Thread.sleep(1000); 

po

VideoCapture camera = new VideoCapture(0); 
3

Próbowałem ten kod w MacOS i znalazł inny błąd.

System.loadLibrary("opencv_java244"); 

Powyższa linia powraca ten błąd

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

Aby go pokonać, Wymieniłem tę linię z tym jednym

System.loadLibrary(Core.NATIVE_LIBRARY_NAME); 

i kod działa!

Używam OpenCV 2.4.8, włączając go jako biblioteki użytkownika w moim projekcie Eclipse

+0

Dla innych tam: Miałem pewne problemy z UnsatisfiedLinkError też. Brakowało mi kroku, aby ustawić "Bibliotekę macierzystą" biblioteki użytkownika na "/lib". Mam nadzieję, że to pomaga komuś. – Christof

3

Wymień
System.loadLibrary("opencv_java244");
z
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);