代码之家  ›  专栏  ›  技术社区  ›  Raja

从com访问摄像头。谷歌。安卓gms。视力CameraSource和增加/减少预览亮度

  •  5
  • Raja  · 技术社区  · 6 年前

    我必须在Google Vision API的CameraSource中实现,以构建摄像头,并在捕获图像之前进行人脸检测。现在,我面临的问题很少,所以我需要从CameraSource访问camera对象。

    1. 如何使用CameraSource提高或降低相机预览亮度?

    这是我的CameraSource Builder

     mCameraSource = new CameraSource.Builder(context, detector)
                    .setRequestedPreviewSize(640, 480)
                    .setFacing(CameraSource.CAMERA_FACING_FRONT)
                    .setRequestedFps(30.0f)
                    .build();
    

    在这里,我必须尝试从mCameraSource对象访问/获取相机。

    Field[] declaredFields = CameraSource.class.getDeclaredFields();
    
            for (Field field : declaredFields) {
                if (field.getType() == Camera.class) {
                    field.setAccessible(true);
                    try {
                        Camera camera = (Camera) field.get(mCameraSource);
                        if (camera != null) {
                            Camera.Parameters params = camera.getParameters();                        
                            params.setExposureCompensation(1500);
                            camera.setParameters(params);
                        }
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
    
                }
            }
    

    但是 camera 仅返回null,我的第二个问题是如何执行亮度选项。。。

    if (camera != null) {
         Camera.Parameters params = camera.getParameters();                        
         params.setExposureCompensation(1500);
         camera.setParameters(params);
     }
    
    1 回复  |  直到 6 年前
        1
  •  2
  •   Raja    6 年前

    我必须这样实现我的目标,

    摄像头亮度级别为-12至12。所以最小亮度级别是-12,最大亮度级别是12。

    现在我必须自定义CameraSourcePreview构造函数,如

    private int defaultBrightness = 12;
    
    public CameraSourcePreview(Context context, AttributeSet attrs) {
        super(context, attrs);
        mContext = context;
        mStartRequested = false;
        mSurfaceAvailable = false;
    
        mSurfaceView = new SurfaceView(context);
        mSurfaceView.getHolder().addCallback(new SurfaceCallback());
        addView(mSurfaceView);
        mSurfaceView.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                cameraFocus(mCameraSource, brightness);
            }
        });
    }
    
    private static boolean cameraFocus(@NonNull CameraSource cameraSource, int brightness) {
        Field[] declaredFields = CameraSource.class.getDeclaredFields();
    
        for (Field field : declaredFields) {
            if (field.getType() == Camera.class) {
                field.setAccessible(true);
                try {
                    Camera camera = (Camera) field.get(cameraSource);
                    if (camera != null) {
                        Camera.Parameters params = camera.getParameters();
                            params.setExposureCompensation(brightness);
                        camera.setParameters(params);
                        return true;
                    }
    
                    return false;
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
    
                break;
            }
        }
    
        return false;
    }
    

    然后我必须通过seekbar实现动态亮度调整。

    喜欢

    seekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() {
                @Override
                public void onProgressChanged(SeekBar seekBar, int i, boolean b) {
    
    
                    cameraFocus(mCameraSource,i-12);
                }
    
                @Override
                public void onStartTrackingTouch(SeekBar seekBar) {
                }
    
                @Override
                public void onStopTrackingTouch(SeekBar seekBar) {
                }
            });
    

    seekbar xml代码

    <SeekBar
                android:id="@+id/seekBar1"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:max="24"
                android:layout_gravity="center_vertical"/>
    

    最后,我得到了解决方案……:)