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();
        }



   }

0 ответов

Другие вопросы по тегам