High cpu usage in OpenCV java

asked 2018-04-25 03:52:18 -0600

SuExeC gravatar image

OpenCV v3.10

I have written a multithreaded application that fetches rtsp streams from several cameras. Quality of cameras varies from 640x480 cameras to 4k hd cameras.

I am struggling with very high cpu usage. Opening 4 cameras simultaneously has my CPU loaded at 40-50-60% (depending on test bench), which is way too high. Especially the 4k cameras introduce a massive CPU increase. The increased CPU is caused by the following code alone, before I do any parsing and/or drawing of the fetched mats.

Here is code for fetching from the streams:

Thread grabber = new Thread(new Runnable() {
            @Override
            public void run() {
                int error_count = 0;
                while(keep_running) {
                    while(camera.grab()) {
                        error_count = 0; // Reset error count - we're OK
                        if(!keep_running)
                            break; // Someone stopped the camera!
                        // Spawn a new thread that can retrieve the frame!
                        Thread t = new Thread(() -> {
                            mutex = true;
                            Mat tmp = new Mat();
                            if(camera.retrieve(tmp)) {
                                tmp.copyTo(grabbed_frame);
                            }
                            tmp.release();
                            if(write_video) {
                                video_writer.write(grabbed_frame);
                            }
                            mutex = false;
                        });t.start();
                    }
                    error_count++;
                    if(error_count > 50) {
                        System.out.println("Error count too high on camera " + name + "("+ip+")");
                        keep_running = false;
                        break;
                    }
                }

Is there any way I can reduce the cpu usage dramatically?

edit retag flag offensive close merge delete

Comments

decoding 4k streams costs cpu time. figure out how to decode with hardware support. what's available depends on your hardware and operating system.

crackwitz gravatar imagecrackwitz ( 2018-04-25 14:25:27 -0600 )edit

Any hinters on where I could start looking for solutions on how to do this with hardware?

SuExeC gravatar imageSuExeC ( 2018-04-26 01:59:46 -0600 )edit