Java OpenCv VideoCapture ускоряет получение изображений
Я пытаюсь написать функцию Java, которая получает изображения из фрейм-граббера в отдельном потоке. Изображения должны быть переданы в Matlab, записав их в файл общей памяти. Код работает, но получение изображений происходит очень медленно (0,08 - 0,1 с). Есть ли способ ускорить мой код? Я использую Eclipse и пакет org.opencv.*.
Спасибо за помощь!
public void run()
{
// load Library
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
// Shared Memory Initialisieren
SharedMemory Memory = null;
try {
//Init Variables
Memory = new SharedMemory(imageWidth, imageHeight);
Mat IM = new Mat(imageWidth, imageHeight, CvType.CV_8UC3);
ArrayList<Mat> rgb = new ArrayList<Mat>(3);
ArrayList<Mat> rgb_t = new ArrayList<Mat>(3);
rgb_t.add(new Mat());
rgb_t.add(new Mat());
rgb_t.add(new Mat());
// Channels which are passed to Matlab
byte[] buff_r = new byte[(int) (imageWidth*imageHeight)];
byte[] buff_g = new byte[(int) (imageWidth*imageHeight)];
byte[] buff_b = new byte[(int) (imageWidth*imageHeight)];
//Init Camera
VideoCapture camera = new VideoCapture();
// Open Camera
camera.open(cam_id);
camera.set(2, 60);
// Proporties sind dokumentiert: https://stackru.com/questions/11420748/setting-camera-parameters-in-opencv-python
camera.set(3, imageWidth);
camera.set(4, imageHeight);
// KAMERA AQUISITION LOOP
for(int i = 0; i<100; i++) {
long start = System.nanoTime();
//grab Frame
boolean stat = camera.grab();
if (stat) {
camera.read(IM);
}
System.out.println((System.nanoTime()-start)*1e-9);
// Prepare Data for Matlab
// Farbkanäle aufsplitten
Core.split(IM, rgb);
// transponieren
Core.transpose(rgb.get(0),rgb_t.get(0));
Core.transpose(rgb.get(1),rgb_t.get(1));
Core.transpose(rgb.get(2),rgb_t.get(2));
rgb_t.get(0).get(0, 0, buff_r);
rgb_t.get(1).get(0, 0, buff_g);
rgb_t.get(2).get(0, 0, buff_b);
// Kanäle schreiben
Memory.write_pic(buff_r, buff_g, buff_b);
System.out.println((System.nanoTime()-start)*1e-9);
System.out.println('-');
}
// Write data by Shared Memory to Matlab
try {
call_matlab(Memory.getMemoryInfo());
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
// Am Ende dann:
try {
Memory.close();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
camera.release();
System.out.println(imageWidth);
System.out.println(imageHeight);
} catch (IOException e2) {
// TODO Auto-generated catch block
e2.printStackTrace();
}
}