我使用camera2接口时获得的图像质量和帧率与我使用相机应用程序手动将视频录制到文件中时获得的图像质量和帧率不匹配。
我正在尝试在安卓系统上使用OpenCV进行实时图像处理。我使用内置的相机应用程序手动录制了一段视频,一切都运行得很好:图像质量很好,帧率稳定在30帧/秒。
我的最小SDK版本是22,所以我使用的是camera2接口的重复请求。我已经设置了它,以及ImageReader和YUV_420_888格式。我尝试了PREVIEW和RECORD捕获请求模板,尝试在构建器中手动设置18个捕获请求参数(例如,禁用自动白平衡,将色彩校正模式设置为快速),但FPS仍在8-9左右,图像质量也很差。另一部手机也得到了同样的结果,尽管它是最大的。FPS为16.67 (而不是30)。
罪魁祸首不是我的图像处理(它发生在另一个线程中,除了读取图像的缓冲区):当我不对帧做任何操作时(我甚至没有显示图像),我检查了FPS,它仍然在8-9左右。
你可以在这里看到相关的代码:
//constructor:
HandlerThread thread = new HandlerThread("MyApp:CameraCallbacks", Process.THREAD_PRIORITY_MORE_FAVORABLE);
thread.start();
captureCallbackHandler = new Handler(thread.getLooper());//some UI event:
cameraManager.openCamera(cameraId, new CameraStateCallback()), null);//CameraStateCallback#onOpened:
//size is 1280x720, same as the manually captured video's
imageReader = ImageReader.newInstance(size.getWidth(), size.getHeight(), ImageFormat.YUV_420_888, 1);
imageReader.setOnImageAvailableListener(new ImageAvailableListener(), captureCallbackHandler);
camera.createCaptureSession(Collections.singletonList(imageReader.getSurface()), new CaptureStateCallback(), captureCallbackHandler);//CaptureStateCallback#onConfigured:
CaptureRequest.Builder builder = activeCamera.createCaptureRequest(CameraDevice.TEMPLATE_RECORD);
builder.addTarget(imageReader.getSurface());
//setting the FPS range has no effect: this phone only has one option
session.setRepeatingRequest(builder.build(), null, captureCallbackHandler);//ImageAvailableListener#onImageAvailable:
long current = System.nanoTime();
deltaTime += (current - last - deltaTime) * 0.1;
Log.d("MyApp", "onImageAvailable FPS: " + (1000000000 / deltaTime));
//prints around 8.7
last = current;
try (Image image = reader.acquireLatestImage()) { }发布于 2019-02-03 17:42:13
在三星Galaxy J3 (2016)上,使用Camera.Parameters#setRecordingHint(true) (同时使用废弃的摄像头接口)完全达到了我想要的效果:视频质量和帧率变得与内置录像机相同。不幸的是,这也意味着我无法修改分辨率,并且在Doogee X5 MAX上设置提示无法达到同样的效果。
https://stackoverflow.com/questions/54463571
复制相似问题