我正在使用camera2 API在Android中构建图像处理项目。我使用TextureView获取预览屏幕,使用ImageReader获取图像帧。出于图像处理的目的,我需要在ImageReader中获得最大尺寸的帧,并且对预览帧的大小没有任何要求。所以我分别使用以下代码设置帧的大小:
StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
imageDimension = map.getOutputSizes(SurfaceTexture.class)[0];
texture.setDefaultBufferSize(imageDimension.getWidth(), imageDimension.getHeight());
List<Size> outputSizes = Arrays.asList(map.getOutputSizes(sImageFormat));
largest = Collections.max(outputSizes, new CompareSizesByArea());
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), sImageFormat, 1);
在测试Android设备华为P9:imageDimension为:1280 * 720;最大的是:3968 * 2976。
我发现预览屏幕运行良好,但是onImageAvailable中捕获的图像是完全黑色的,我想没有捕获任何内容。
我尝试了两种方法来弄清楚这里发生了什么。 1)我将ImageReader的大小设置为imageDimension,发现捕获的图像没问题。 2)我将预览帧的大小设置为最大,发现预览屏幕为黑色。
因此,我想知道ImageReader中捕获图像的大小是否应该小于预览帧的大小。在这种情况下,我该如何设置预览帧的最大分辨率?
无论如何,我的目的是获得具有最大分辨率的帧以及流畅的预览屏幕。欢迎任何建议。感谢。
答案 0 :(得分:1)
理论上,只要您在the documentation for CameraDevice.createCaptureSession()表格中列出的多个流的分辨率保证范围内,两个单独输出的分辨率就没有区别。如果您的操作分辨率高于这些保证,则事情可能无法按预期运行。
一般情况下,我建议保持预览分辨率&lt; = 1080p(1920x1080);许多设备无法在超过该尺寸的分辨率下生成平滑的30fps预览;有些甚至可能需要720p或更低。 此外,设备上的GPU实际上可能无法处理全分辨率相机输出,这可能解释了一些黑色预览输出。
ImageReader没有理由需要小于预览;我怀疑你可能只有太高的预览尺寸。
请尝试配置:
答案 1 :(得分:0)
在某些设备上,如果捕获的宽高比不适合预览的宽高比,则捕获可能需要更长的时间。