我正在尝试使用Camera2 API获取QR码扫描功能的预览框架.在旧的Camera API中,它很简单:
android.hardware.Camera mCamera;
...
mCamera.setPreviewCallback(new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
// will be invoked for every preview frame in addition to displaying them on the screen
}
});
Run Code Online (Sandbox Code Playgroud)
不过,我不能找到一种方法来实现,使用新 Camera2 API.我想收到多个我可以处理的帧 - 最好的是接收旧API中的字节数组.任何想法如何做到这一点?
android android-hardware android-camera android-5.0-lollipop
我正在尝试使用这里提出的camera2 api实现相机预览图像数据处理:使用Android L和Camera2 API进行相机预览图像数据处理.
我使用onImageAvailableListener成功接收回调,但是为了将来的处理,我需要从YUV_420_888 android.media.Image获取位图.我搜索了类似的问题,但没有一个帮助.
你能否建议我如何将android.media.Image(YUV_420_888)转换为Bitmap,或者有更好的方法来监听预览帧?
我正在尝试让Android camera2在后台服务中运行,然后在回调ImageReader.OnImageAvailableListener中处理帧.我已经使用建议的原始格式YUV_420_888来获得最大fps,但是我只能在分辨率640x480上获得7fps左右.这甚至比我使用旧的Camera接口(我想升级到Camera2以获得更高的fps)或使用OpenCV JavaCameraView(我不能使用它,因为我需要在后台服务中运行处理)更慢.
以下是我的服务类.我错过了什么?
我的手机是运行Android 5.0.2的Redmi Note 3
public class Camera2ServiceYUV extends Service {
protected static final String TAG = "VideoProcessing";
protected static final int CAMERACHOICE = CameraCharacteristics.LENS_FACING_BACK;
protected CameraDevice cameraDevice;
protected CameraCaptureSession captureSession;
protected ImageReader imageReader;
// A semaphore to prevent the app from exiting before closing the camera.
private Semaphore mCameraOpenCloseLock = new Semaphore(1);
public static final String RESULT_RECEIVER = "resultReceiver";
private static final int JPEG_COMPRESSION = 90;
public static final int RESULT_OK = 0;
public static final …Run Code Online (Sandbox Code Playgroud) 我现在正在使用camera2Basic并试图让每个帧数据进行一些图像处理.我在Android5.0中使用camera2 API,当只进行相机预览并且它是流畅的时候一切都很好.但是当我使用ImageReader.OnImageAvailableListener回调来获取每个帧数据时,预览会停滞不前,这会导致糟糕的用户体验.以下是我的相关代码:
这是摄像头和ImageReader的设置,我设置的图像格式是YUV_420_888
public<T> Size setUpCameraOutputs(CameraManager cameraManager,Class<T> kClass, int width, int height) {
boolean flagSuccess = true;
try {
for (String cameraId : cameraManager.getCameraIdList()) {
CameraCharacteristics characteristics = cameraManager.getCameraCharacteristics(cameraId);
// choose the front or back camera
if (FLAG_CAMERA.BACK_CAMERA == mChosenCamera &&
CameraCharacteristics.LENS_FACING_BACK != characteristics.get(CameraCharacteristics.LENS_FACING)) {
continue;
}
if (FLAG_CAMERA.FRONT_CAMERA == mChosenCamera &&
CameraCharacteristics.LENS_FACING_FRONT != characteristics.get(CameraCharacteristics.LENS_FACING)) {
continue;
}
StreamConfigurationMap map = characteristics.get(
CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP);
Size largestSize = Collections.max(
Arrays.asList(map.getOutputSizes(ImageFormat.YUV_420_888)),
new CompareSizesByArea());
mImageReader = ImageReader.newInstance(largestSize.getWidth(), largestSize.getHeight(),
ImageFormat.YUV_420_888, 3); …Run Code Online (Sandbox Code Playgroud) 新的Camera 2 API与旧的相比非常不同.显示操纵的相机帧到管道的用户部分让我感到困惑.我知道使用Android L和Camera2 API对相机预览图像数据处理有很好的解释,但显示帧仍然不清楚.我的问题是,在一些处理过程中,在ImageReaders回调函数中显示帧的方式是什么,同时保持Camera2 api管道的效率和速度?
示例流程:
camera.add_target(imagereader.getsurface) - >关于imagereaders回调做一些处理 - >(在屏幕上显示已处理的图像?)
解决方法创意:每次处理新帧时,都会将位图发送到imageview.
我想使用 Camera2 API 从相机获取单个帧并使用 ImageView 显示它。我发现了一些密切的问题,例如
我还查看了 Camera2Basic 示例,但它太复杂并且不完全是我所需要的。
我编写了代码,它基于我在网上看到的一些示例,应该可以实现,但它不起作用,我不明白为什么。
应用程序不会崩溃,但只是不在 ImageView 上显示任何内容。我在任何函数调用中都使用了日志消息,以便尝试保持 logcat 清晰。
另外,该应用程序是 logcat 说“该应用程序可能在后台做了太多工作......”我不明白这怎么可能,因为我制作了一个captureRequest而不是一个repeatingCaptureRequest.
这是代码和 logcat: 代码:
public class CameraImageReaderActivity extends AppCompatActivity {
private final static String TAG = "CAMERA_IMAGE_READY: ";
private ImageReader imageReader;
private String cameraId;
private CameraDevice camera;
private HandlerThread handlerThread;
private Handler handler;
private Surface imageReaderSurface;
private ImageView imageView;
private CameraDevice.StateCallback cameraStateCallback = new CameraDevice.StateCallback() {
@Override
public void onOpened(CameraDevice cameraDevice) {
Log.d(TAG, "onOpend: CAMERA OPENED");
camera = …Run Code Online (Sandbox Code Playgroud)