Can't get > 10 FPS (Java) [closed]
Hey all, I've been working on building a Java application using OpenCV that grabs data from the webcam and records it. However, I've been unable to achieve frame rates greater than 10 FPS (Intel i5-5200u, 8 GB RAM), which doesn't seem right to me. My webcam supports up to 30 FPS and 1280 x 720 resolution. Recording at 640 x 480 only increases to about 12 FPS. Recording at 720p (which I need to do for my application) nets the aforementioned 10. My first idea was that the VideoCapture.read() function takes a relatively long time to process, so I tried moving those calls to a thread pool, but it gave no gain. I've read all about how fast this library is supposed to be, so I must be doing something wrong. Below is the loop for capturing data:
VideoCapture cam = new VideoCapture();
cam.open(0);
// set proper resolution
cam.set(Videoio.CV_CAP_PROP_FRAME_WIDTH, CAMERA_WIDTH);
cam.set(Videoio.CV_CAP_PROP_FRAME_HEIGHT, CAMERA_HEIGHT);
// Matrix for storing camera images, provided by OpenCV
ArrayList<Mat> framesList = new ArrayList<>();
long startTime = System.currentTimeMillis();
if( ! cam.isOpened()) {
System.err.println("Camera could not be opened.");
}
else {
System.out.println("Capturing...");
while(System.currentTimeMillis() - startTime < 1000 * SECONDS_TO_RUN) {
Mat frame = new Mat();
cam.read(frame);
framesList.add(frame);
}
cam.release();
System.out.println("Done recording. " + framesList.size() + " frames captured.");
System.out.println("Framerate : " + framesList.size() / SECONDS_TO_RUN);
Have you tried changing cameras ? Or trying to visualize stream instead of recording it? I've never experienced this problem.
Thanks for the reply. Unfortunately I don't have any other cameras at my disposal right now. But other built-in applications can record at 720p up to 20 FPS, so I don't think it's a hardware issue.
I'm not sure how to implement a visualization in OpenCV, but I've done a live stream using a different library called Webcam-Capture and it supplied 30 FPS. But as soon as I attempt to actually record the stream, the FPS staggers, which is understandable. But I would think, then, that moving the actual recording process to a separate thread would at least moderately increase the FPS...but no such luck.
Instead of storing the frame, try to visualize it. Never did it in java but it should be pretty easy.
In C++ it would be cv::imshow("Window name", frame); cv::waitKey(30);
Just to make sure this isn't something with the way you are storing Mat into that vector.