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");
}
}
Spróbuje zakodować obraz jako .png. –
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". –
SOLVED. Problem polegał na tym, że aparat potrzebuje czasu na zainicjowanie. Dodałem "Thread.sleep (1000);" po "VideoCapture camera = new VideoCapture (0);". –