【问题标题】:Getting smaller data from camera preview in Android从 Android 中的相机预览中获取更小的数据
【发布时间】:2015-10-15 21:13:43
【问题描述】:

您好,我正在 Android 上开发实时图像处理应用程序。我正在使用 PreviewCallback 在每一帧中获取图像。当我在平板设备中获取数据时,数据返回非常大。所以实时处理大数据太难了。 我的问题是,有没有办法从相机预览中获取更小分辨率的数据。

相机预览代码:

public void onPreviewFrame(byte[] data, Camera camera) {
                        // TODO Auto-generated method stub
                        Camera.Parameters params = camera.getParameters();

                        Log.v("image format", Integer.toString(params.getPreviewFormat()));
                        //Frame captureing via frameManager
                        frameManager.initCamFrame(params.getPreviewSize().width, params.getPreviewSize().height,
                                data);
                    }
                });

【问题讨论】:

    标签: android android-camera


    【解决方案1】:

    你可以调用parameters.setPreviewSize(width, height),但是你想在相机预览开始之前做。而且您需要使用支持的值,即以前的答案。

    而且您也不应该在每一帧都调用 camera.getParameters(),只需执行一次并将值保存到某个变量中。您在 onPreviewFrame 中的时间有限,因为 byte[] 数据在每一帧上都会被覆盖,因此请尝试仅在此处执行重要的操作。

    你应该使用setPreviewCallbackWithBuffer,它可以大大提高性能 - 检查this post

    【讨论】:

      【解决方案2】:

      您是否知道可以通过调用getSupportedPreviewSizes() 从相机参数中获取支持的预览尺寸列表?我尝试过的所有设备都返回了一个排序列表,尽管有时是升序,有时是降序。您可能需要手动迭代列表以找到“最小”预览大小,或者先对其进行排序并获取第一项。

      【讨论】:

        【解决方案3】:

        你可以试试这个:

         @Override
                public void onPreviewFrame(byte[] data, Camera camera) {
                try {
                    byte[] baos = convertYuvToJpeg(data, camera);
                    StringBuilder dataBuilder = new StringBuilder();
                    dataBuilder.append("data:image/jpeg;base64,").append(Base64.encodeToString(baos, Base64.DEFAULT));
                    mSocket.emit("newFrame", dataBuilder.toString());
                } catch (Exception e) {
                   Log.d("########", "ERROR");
                }
            }
        
        };
        
        
        public byte[] convertYuvToJpeg(byte[] data, Camera camera) {
        
            YuvImage image = new YuvImage(data, ImageFormat.NV21,
                    camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height, null);
        
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            int quality = 20; //set quality
            image.compressToJpeg(new Rect(0, 0, camera.getParameters().getPreviewSize().width, camera.getParameters().getPreviewSize().height), quality, baos);//this line decreases the image quality
        
        
            return baos.toByteArray();
        }
        

        【讨论】:

          猜你喜欢
          • 2013-07-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-10-24
          • 2012-08-04
          相关资源
          最近更新 更多