Tôi là người mới trong thế giới của Stackoverflow và trong lập trình OpenCV. Tôi đã thực hiện một số dự án với OpenCV Bindings for Java (các quan chức opencv.org, không phải JavaCV), như nhận dạng đối tượng thông qua các tính năng ORB và SURF, làm việc với hình ảnh. Mọi thứ ok. Bây giờ tôi đang chuyển sang nhận dạng đối tượng trong luồng video. Tôi muốn lấy luồng từ webcam và áp dụng nhận dạng đối tượng. Tôi không phải là một guru Java, vì vậy tôi tìm thấy trong OpenCV lớp VideoCapture, nhưng tôi không thể có được hình ảnh từ máy ảnh.OpenCV 2.4.4 Hình ảnh/luồng webcam Java - Grab (OSX)
Tôi đang chạy dự án của mình trong Eclipse với các liên kết OpenCV 2.4.4, trong OSX Mountain Lion.
Kết quả trong giao diện điều khiển:
Hello, OpenCV
Camera OK?
Frame Obtained
Captured Frame Width 0
Invalid memory access of location 0x7fae00000000 rip=0x7fff8b4c5263
Mã:
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");
}
}
Hãy thử để mã hóa hình ảnh như .png. –
Sự cố không ở định dạng hình ảnh. Giao diện điều khiển nói chiều rộng hình ảnh là 0. Thay đổi định dạng hình ảnh thành PNG thay đổi dòng cuối cùng trong bảng điều khiển thành: "libpng warning: Chiều rộng hình ảnh bằng 0 trong IHDR"; "cảnh báo libpng: Chiều cao hình ảnh bằng 0 trong IHDR"; "Lỗi libpng: Dữ liệu IHDR không hợp lệ". –
SOLVED. Vấn đề đơn giản là máy ảnh cần thời gian để khởi tạo. Tôi đã thêm "Thread.sleep (1000);" sau "VideoCapture camera = new VideoCapture (0);". –