标签: android-camera2

在 Android 中基于叠加裁剪位图 - Camera API 2

我正在使用相机 api 来捕获身份证照片,我有一个叠加层,如下图所示。我想裁剪框中的图像。你能建议一下具体应该如何做吗?我已经写下了我所尝试过的以及它给我的结果。

这是我想要捕获的 id 的屏幕截图..

在此输入图像描述

输出。

在此输入图像描述

白色矩形框是一个相框,位于相对布局的中心

<View
    android:id="@+id/photo_frame"
    android:layout_width="match_parent"
    android:layout_height="212dp"
    android:background="@drawable/bg_photo_frame"
    android:layout_centerInParent="true"
    android:layout_margin="@dimen/double_padding"
    android:visibility="visible"/>
Run Code Online (Sandbox Code Playgroud)

如何计算这个帧来剪切图像

这就是我必须剪切需要修改的图像,但不确定前进的方向是什么

       public Bitmap cutImage(final Bitmap srcBmp, final int pixepWidth, final int pixelsHeight, float widthRatio) {
//        Bitmap croppedBitmap = Bitmap.createBitmap(bitmap, 20, 20, pixepWidth, pixelsHeight);
//        return croppedBitmap;
        Bitmap dstBmp;
        if (srcBmp.getWidth() >= srcBmp.getHeight()){

            dstBmp = Bitmap.createBitmap(
                    srcBmp,
                    srcBmp.getWidth()/2 - srcBmp.getHeight()/2,
                    0,
                    srcBmp.getHeight(),
                    srcBmp.getHeight()
            );

        }else{

            dstBmp = Bitmap.createBitmap(
                    srcBmp,
                    0,
                    srcBmp.getHeight()/2 - srcBmp.getWidth()/2,
                    srcBmp.getWidth(),
                    srcBmp.getWidth()
            );
        }

        return dstBmp;
    }
Run Code Online (Sandbox Code Playgroud)

android bitmap android-camera android-bitmap android-camera2

5
推荐指数
1
解决办法
2868
查看次数

Android Camera2 应用程序在离开相机活动并重新进入后中断

我正在尝试根据此处的教程实现一个简单的相机照片捕获应用程序:https://android.jlelse.eu/the-least-you-can-do-with-camera2-api-2971c8c81b8b

该应用程序第一次运行效果很好。预览显示,我可以正确保存照片。

我的问题是,当我关闭应用程序、回击、最小化应用程序等...然后返回相机活动时,预览不再显示任何内容,并且当我尝试拍照时应用程序崩溃。

我几乎肯定我没有以某种方式正确关闭相机,但是与工作实现相比,我已经逐行梳理了我的代码,并且我看不出我在做什么不同/错误的事情。

package com.example.cameratest;

import android.Manifest;
import android.content.Context;
import android.content.pm.PackageManager;
import android.graphics.Bitmap;
import android.graphics.Point;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCaptureSession;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.CaptureRequest;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Environment;
import android.os.Handler;
import android.os.HandlerThread;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Size;
import android.view.Display;
import android.view.Surface;
import android.view.TextureView;
import android.view.View;
import android.view.ViewGroup;
import android.view.WindowManager;
import android.widget.Toast;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Locale;

public class SecondCamera …
Run Code Online (Sandbox Code Playgroud)

android android-hardware android-camera android-camera2

5
推荐指数
1
解决办法
5743
查看次数

Android - 使用 Renderscript 和 Camera2 API 处理相机数据

下面我想展示我的自定义相机应用程序代码的片段。我的目标是对传入的视频帧应用过滤器并输出它们。为此,我使用 Renderscript 和 Camera2。

这是我的 MainActivity.java (因为它有点长,我删除了处理获取相机权限的方法):

public class MainActivity extends AppCompatActivity {

    private static final String TAG = "MainActivity";
    private static final int REQUEST_CAMERA_PERMISSION_RESULT = 0;

    private TextureView mTextureView;
    private Button mButton;
    private CameraDevice mCameraDevice;
    private String mCameraId;
    private HandlerThread mBackgroundHandlerThread;
    private Handler mBackgroundHandler;
    private Size mPreviewSize;
    private CaptureRequest.Builder mCaptureRequestBuilder;
    private RsSurfaceRenderer mRenderer;
    private Surface mPreviewSurface;
    private Surface mProcessingNormalSurface;
    private RsCameraPreviewRenderer cameraPreviewRenderer;
    private RenderScript rs;
    private List<Surface> mSurfaces;

    private Toast rendererNameToast;
    private String rendererName;

    private int currentRendererIndex = 0; …
Run Code Online (Sandbox Code Playgroud)

java android landscape-portrait android-camera2

5
推荐指数
1
解决办法
976
查看次数

相机2像素值与传感器曝光时间不成线性关系

我尝试使用 YUV_420_888 图像格式(我的索尼 XA1 不支持原始数据)通过camera2 API 来近似原始传感器输出。我将所有内容都改为手动并停用了我能找到的所有纠正程序:

            mBuilder.set(CaptureRequest.CONTROL_MODE, CameraMetadata.CONTROL_MODE_OFF);
            mBuilder.set(CaptureRequest.CONTROL_AF_MODE, CameraMetadata.CONTROL_AF_MODE_OFF);
            mBuilder.set(CaptureRequest.CONTROL_AE_MODE, CameraMetadata.CONTROL_AE_MODE_OFF);
            mBuilder.set(CaptureRequest.CONTROL_AWB_MODE, CameraMetadata.CONTROL_AWB_MODE_OFF);
            mBuilder.set(CaptureRequest.TONEMAP_MODE, CameraMetadata.TONEMAP_MODE_CONTRAST_CURVE);
            mBuilder.set(CaptureRequest.TONEMAP_CURVE,
                    new TonemapCurve(
                            new float[]{0.0f,0.0f,1.0f,1.0f},
                            new float[]{0.0f,0.0f,1.0f,1.0f},
                            new float[]{0.0f,0.0f,1.0f,1.0f}
                    ));
            mBuilder.set(CaptureRequest.COLOR_CORRECTION_MODE, CameraMetadata.COLOR_CORRECTION_MODE_TRANSFORM_MATRIX);
            mBuilder.set(CaptureRequest.COLOR_CORRECTION_TRANSFORM, new ColorSpaceTransform(new int[]{
                    1, 1, 0, 1, 0, 1,
                    0, 1, 1, 1, 0, 1,
                    0, 1, 0, 1, 1, 1
            }));
            mBuilder.set(CaptureRequest.COLOR_CORRECTION_GAINS, new RggbChannelVector(1.0f,1.0f,1.0f,1.0f));
            mBuilder.set(CaptureRequest.SHADING_MODE, CameraMetadata.SHADING_MODE_OFF);
            mBuilder.set(CaptureRequest.STATISTICS_LENS_SHADING_MAP_MODE, CameraMetadata.STATISTICS_LENS_SHADING_MAP_MODE_OFF);
            mBuilder.set(CaptureRequest.COLOR_CORRECTION_ABERRATION_MODE, CameraMetadata.COLOR_CORRECTION_ABERRATION_MODE_OFF);
            mBuilder.set(CaptureRequest.CONTROL_AE_ANTIBANDING_MODE, CameraMetadata.CONTROL_AE_ANTIBANDING_MODE_OFF);
            mBuilder.set(CaptureRequest.CONTROL_EFFECT_MODE, CameraMetadata.CONTROL_EFFECT_MODE_OFF);
            mBuilder.set(CaptureRequest.CONTROL_ENABLE_ZSL, false);
            mBuilder.set(CaptureRequest.CONTROL_SCENE_MODE, CameraMetadata.CONTROL_SCENE_MODE_DISABLED);
            mBuilder.set(CaptureRequest.EDGE_MODE, CameraMetadata.EDGE_MODE_OFF);
            mBuilder.set(CaptureRequest.HOT_PIXEL_MODE, CameraMetadata.HOT_PIXEL_MODE_OFF);
            mBuilder.set(CaptureRequest.NOISE_REDUCTION_MODE, CameraMetadata.NOISE_REDUCTION_MODE_OFF);
Run Code Online (Sandbox Code Playgroud)

之后,我连拍了 10 张照片,曝光时间线性增加,ISO 为 40。我分析了 …

android android-camera2 exposure

5
推荐指数
1
解决办法
212
查看次数

如何在服务或接收器中使用没有 XML 和 PreviewView 的 CameraX?

我想在没有任何 xml 和 PreviewView 或其他用于显示图片的东西的情况下使用 CameraX 拍照,但我有问题。

android android-camera android-camera2 android-camerax

5
推荐指数
1
解决办法
1426
查看次数

在 CameraX 中使用 CameraCaptureSession.CaptureCallback()

在相机 1 中,我们有FaceDetectionListener方法camera.startFaceDetection()。使用这种方式可以更容易地找到面孔。

在相机 2 中,我们可以使用 CameraCaptureSession.CaptureCallback() 方法和此静态变量执行相同操作

Integer mode = result.get(CaptureResult.STATISTICS_FACE_DETECT_MODE);
Face[] faces = result.get(CaptureResult.STATISTICS_FACES);
Run Code Online (Sandbox Code Playgroud)

现在有一个名为 CameraX 的新相机库。它是Camera2的包装,推荐使用。如果是Camera 2的封装,我们可以很容易得到如下的回调结果CameraCaptureSession.CaptureCallback()

但经过三天的尝试,我未能找到解决方案。

谁能给我像camera2一样调用以下方法的解决方案?

在相机2中,

 private val mCaptureCallback = object : CameraCaptureSession.CaptureCallback() {
    override fun onCaptureProgressed(
        session: CameraCaptureSession,
        request: CaptureRequest,
        partialResult: CaptureResult
    ) {
        

    }

    override fun onCaptureCompleted(
        session: CameraCaptureSession,
        request: CaptureRequest,
        result: TotalCaptureResult
    ) {
        
    }
}



mCaptureSession.setRepeatingRequest(mPreviewRequest, mCaptureCallback,
                mBackgroundHandler);
Run Code Online (Sandbox Code Playgroud)

如何使用CameraX获取回调结果?

camera android callback android-camera2 android-camerax

5
推荐指数
1
解决办法
1235
查看次数

没有支持 FEATURE_CAMERA_EXTERNAL 的 Android 设备

根据此文档,某些 Android 设备允许使用 Camera2 API 访问外部 USB 摄像头。我检查了大约 10 部三星手机(Galaxy Tab S4/7、Galaxy A71、Galaxy S10e)。它们都没有 FEATURE_CAMERA_EXTERNAL。

if(packageManager.hasSystemFeature(PackageManager.FEATURE_CAMERA_EXTERNAL)) {
   Log.v("TestApp", "Supports external camera")
}
else {
   Log.v("TestApp", "Doesnt support external camera")
}
Run Code Online (Sandbox Code Playgroud)

有谁知道哪些设备支持FEATURE_CAMERA_EXTERNAL?

camera android android-camera2

5
推荐指数
0
解决办法
629
查看次数

如何使用 Camera2 扩展 API 获取实时位图图像

我正在使用Camera2 扩展示例进行实时图像处理。在此之前我使用的是Camera2 Basic。在基本示例中,我从下面的代码片段中获取实时图像。

val captureRequest = camera.createCaptureRequest(
    CameraDevice.TEMPLATE_PREVIEW
).apply {
    addTarget(getViewDataBinding()?.viewFinder!!.holder.surface)
    addTarget(imageReader.surface)
}

// This will keep sending the capture request as frequently as possible until the
// session is torn down or session.stopRepeating() is called
captureRequest.set(
    CaptureRequest.CONTROL_MODE,
    CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE
)
captureRequest.set(CaptureRequest.FLASH_MODE, CaptureRequest.FLASH_MODE_OFF)
session.setRepeatingRequest(captureRequest.build(), null, cameraHandler)
Run Code Online (Sandbox Code Playgroud)

你可以看到,我在上面的代码中添加了目标imageReader。我使用扩展 API 几乎类似的方式。但是在ExtensionSessionConfiguration配置方法中。

cameraExtensionSession = session
try {
    val captureRequest = camera.createCaptureRequest(
        CameraDevice.TEMPLATE_PREVIEW
    ).apply {
        addTarget(previewSurface)
        addTarget(imageReader.surface)
    }
    captureRequest.set(
        CaptureRequest.CONTROL_MODE,
        CameraMetadata.CONTROL_AF_MODE_CONTINUOUS_PICTURE
    )
    cameraExtensionSession.setRepeatingRequest(
        captureRequest.build(),
        Dispatchers.IO.asExecutor(), captureCallbacks
    ) …
Run Code Online (Sandbox Code Playgroud)

java android image-processing android-camera android-camera2

5
推荐指数
0
解决办法
293
查看次数

Android"权限拒绝:无法使用相机"

我正在关注在Android应用程序中使用相机的教程.我在模拟器和物理设备上运行调试时收到错误"权限拒绝:无法使用相机".我在清单文件中尝试了各种权限.似乎大多数有此错误的人都有错误,缺少权限或权限不在其清单中的正确位置.

这是我的清单文件:

<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.karudo.dbzrealpowerup" >

    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.FLASHLIGHT" />
    <uses-permission android:name="android.permission.CAMERA" />
    <uses-feature android:name="android.hardware.camera2" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/AppTheme" >
        <activity
            android:name=".DBZHome"
            android:label="@string/app_name" >
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".DBZStartPowerUp"
            android:label="@string/title_activity_dbzstart_power_up" >
        </activity>
    </application>

</manifest>
Run Code Online (Sandbox Code Playgroud)

这是我的活动:

package com.example.karudo.dbzrealpowerup;

import android.app.Activity;
import android.content.Context;
import android.graphics.SurfaceTexture;
import android.hardware.camera2.CameraAccessException;
import android.hardware.camera2.CameraCharacteristics;
import android.hardware.camera2.CameraDevice;
import android.hardware.camera2.CameraManager;
import android.hardware.camera2.params.StreamConfigurationMap;
import android.os.Bundle;
import android.util.Size;
import android.view.Menu;
import android.view.MenuItem;
import android.view.TextureView;
import android.widget.Toast; …
Run Code Online (Sandbox Code Playgroud)

android android-camera android-permissions android-camera2

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

Android Camera:尝试在空对象引用上的android.hardware.Camera.getParameters()'上调用虚拟方法Android Camera Parameters

我使用了我的Fabric服务,并在运行我的应用程序的大多数设备上发现了此错误.

错误是这样的:

致命异常:java.lang.NullPointerException尝试在空对象引用上调用虚拟方法'android.hardware.Camera $ Parameters android.hardware.Camera.getParameters()'

这是我的代码:

 public class CameraActivity extends Activity implements SurfaceHolder.Callback{

    android.hardware.Camera camera;
    int moi = 0;
    @InjectView(R.id.s)
    SurfaceView surfaceView;

    @InjectView(R.id.takeaphoto)
    ImageView imageView;
    SurfaceHolder surfaceHolder;
    private Camera.Face[] mFaces;





    // Draw rectangles and other fancy stuff:
    private FaceOverlayView mFaceView;
    private int mOrientation;
    private float x1,x2;
    static final int MIN_DISTANCE = 150;
    private int mOrientationCompensation;
    private OrientationEventListener mOrientationEventListener;

    // Let's keep track of the display rotation and orientation also:
    private int mDisplayRotation;
    private int mDisplayOrientation;


    Camera.PictureCallback callback; …
Run Code Online (Sandbox Code Playgroud)

java android android-camera android-studio android-camera2

4
推荐指数
2
解决办法
1万
查看次数