相关疑难解决方法(0)

使用Android L和Camera2 API处理相机预览图像数据

我正在开发一个Android应用程序,它正在处理来自摄像头的输入图像并将其显示给用户.这很简单,我PreviewCallback在相机对象上注册了一个setPreviewCallbackWithBuffer.这很简单,并且可以与旧的相机API一起使用

public void onPreviewFrame(byte[] data, Camera cam) {
    // custom image data processing
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试移植我的应用程序以利用新的Camera2 API,我不确定我该怎么做.我在L预览示例中使用了Camera2Video,可以录制视频.但是,样本中没有直接的图像数据传输,因此我不明白应该在何处获取图像像素数据以及如何处理它.

有人可以帮我或建议如何获得PreviewCallbackandroid L 的功能,或者如何在将其显示到屏幕之前处理相机的预览数据?(相机对象上没有预览回调)

谢谢!

camera android image-processing preview android-5.0-lollipop

39
推荐指数
4
解决办法
3万
查看次数

使用Camera2 API的低FPS

我使用新的camera2 api体验了低FPS率.具体来说,尽管选择了最高的FPS范围(30,30)

characteristics.get(CameraCharacteristics.CONTROL_AE_AVAILABLE_TARGET_FPS_RANGES);
Run Code Online (Sandbox Code Playgroud)

并设置它

mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_TARGET_FPS_RANGE, bestFPSRange);
Run Code Online (Sandbox Code Playgroud)

在我测试过的两款设备(三星S5和Xperia Z3 Compact)上,我获得了高图像分辨率的平均速率.以下是我设置的方法OnImageAvailableListener:

int format = ImageFormat.YUV_420_888;
Size largest = map.getOutputSizes(format)[0];
Log.d("Images", "sizes: " + Arrays.toString(map.getOutputSizes(format)));
mImageReader = ImageReader.newInstance(largest.getWidth(), largest.getHeight(), format,
        /* maxImages */50);
mImageReader.setOnImageAvailableListener(new OnImageAvailableListener() {

    private int  frames      = 0;
    private long initialTime = SystemClock.elapsedRealtimeNanos();

    @Override
    public void onImageAvailable(ImageReader reader) {
        reader.acquireLatestImage().close();
        frames++;
        if ((frames % 30) == 0) {
            long currentTime = SystemClock.elapsedRealtimeNanos();
            long fps = Math.round(frames * 1e9 / (currentTime - initialTime));
            Log.d("Image", "frame# : " + frames …
Run Code Online (Sandbox Code Playgroud)

android android-camera2

7
推荐指数
1
解决办法
3209
查看次数

android camera2处理每一帧并显示其预览

我使用https://github.com/googlesamples/android-Camera2Basic,但尝试修改它,以便在Surfaceview上绘制之前我可以访问每个帧.我明白了,我应该添加额外的表面(ImageReader.getSurface()),并在此回调中从中读取帧:

private final ImageReader.OnImageAvailableListener mOnImageAvailableListener
            = new ImageReader.OnImageAvailableListener() {

        @Override
        public void onImageAvailable(ImageReader reader) {

           Log.d("Img", "onImageAvailable");
            mBackgroundHandler.post(new ImageSaver(reader.acquireNextImage(), mFile));
        }

    };
Run Code Online (Sandbox Code Playgroud)

问题是只有当用户捕获图像而不是从摄像机发送到预览屏幕的eacg帧时,才会调用此回调.

这是我试图添加的内容:

private void createCameraPreviewSession() {
        try {
            SurfaceTexture texture = mTextureView.getSurfaceTexture();
            assert texture != null;

            // We configure the size of default buffer to be the size of camera preview we want.
            texture.setDefaultBufferSize(mPreviewSize.getWidth(), mPreviewSize.getHeight());

            // This is the output Surface we need to start preview.
            Surface surface = new Surface(texture);

            // We set up a …
Run Code Online (Sandbox Code Playgroud)

android image-processing surfaceview android-camera

6
推荐指数
1
解决办法
4964
查看次数