因此,我从使用旧版相机 api 迁移到了 CameraX,尽管设置起来非常简单,但我注意到了一个问题。现在,如果不是比以前更长的时间开始显示预览,相机似乎需要几乎两倍的时间。我正在 Galaxy s7 上进行测试。我的代码如下所示:
val previewConfig = PreviewConfig.Builder().apply {
setTargetAspectRatio(Rational(1, 1))
setTargetResolution(Size(binding.codeScannerView.width, binding.codeScannerView.height))
}.build()
val preview = Preview(previewConfig)
preview.setOnPreviewOutputUpdateListener { preview ->
val parent = binding.codeScannerView.parent as ViewGroup
parent.removeView(binding.codeScannerView)
parent.addView(binding.codeScannerView, 0)
binding.codeScannerView.surfaceTexture = preview.surfaceTexture
}
val analyzerConfig = ImageAnalysisConfig.Builder().apply {
val analyzerThread = HandlerThread(
"QrCodeReader").apply { start() }
setCallbackHandler(Handler(analyzerThread.looper))
setImageReaderMode(
ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
}.build()
val analyzerUseCase = ImageAnalysis(analyzerConfig).apply {
analyzer = QrCodeAnalyzer(requireContext(), Handler(), { qrCode ->
if (activity == null) {
return@QrCodeAnalyzer
}
presenter.disableCameraPreview()
presenter.updateTable(qrCode.toLowerCase().parseTableId(), isFromOrder, Screens.MENU_SCREEN)
})
} …Run Code Online (Sandbox Code Playgroud) 我正在尝试将 camerax api 用于相机应用程序,但我遇到了问题。类 PreviewConfig 无法解析。这是我的 build.gradle(app) 文件
apply plugin: 'com.android.application'
android {
compileSdkVersion 29
buildToolsVersion "29.0.2"
defaultConfig {
applicationId "com.example.cameraapi"
minSdkVersion 21
targetSdkVersion 29
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
minifyEnabled false
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
compileOptions {
targetCompatibility = 1.8
}
}
dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
// CameraX core library
def camerax_version = "1.0.0-alpha09"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
// …Run Code Online (Sandbox Code Playgroud) 我遵循了这些教程: https://developer.android.com/training/camerax/preview,https : //proandroiddev.com/update-android-camerax-4a44c3e4cdcc 第一次运行应用程序时预览工作正常,但是在旋转屏幕后全部坏了。我重新安装了应用程序,但预览不再起作用
public class ScanActivity extends AppCompatActivity {
private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
private PreviewView cameraView;
private Preview imagePreview;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_scan);
cameraView = findViewById(R.id.cameraView);
cameraProviderFuture = ProcessCameraProvider.getInstance(this);
if(isPermissionsGranted()){
cameraView.post(new Runnable() {
@Override
public void run() {
startCamera();
}
});
}
else{
ActivityCompat.requestPermissions(ScanActivity.this,
new String[]{Manifest.permission.CAMERA},PERMISSION_REQUEST_CODE);
}
}
private void startCamera(){
imagePreview = new Preview.Builder()
.setTargetRotation(cameraView.getDisplay().getRotation())
.build();
imagePreview.setSurfaceProvider(cameraView.getPreviewSurfaceProvider());
final CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
cameraProviderFuture.addListener(() -> {
try {
ProcessCameraProvider cameraProvider = cameraProviderFuture.get(); …Run Code Online (Sandbox Code Playgroud) 据我从许多实现中了解到,例如:
https://github.com/android/camera-samples/tree/master/CameraXBasic
https://proandroiddev.com/android-camerax-preview-analyze-capture-1b3f403a9395
在 CameraX 实现中的每个用例之后,都需要调用cameraProvide.bindToLifecycle()方法。
例如,如果我需要将相机的 FLASH_MODE 从默认的关闭模式切换为打开,则需要再次调用 bindToLifecycle() 方法。
这种方法的缺点是,预览会在一两秒钟内被删除并重新附加,这对于应用程序来说感觉不是一个平滑的过渡。
是否有更好的做法,或者这是限制?
我在下面附上了示例代码:
private void bindCameraUseCase() {
int screenAspectRatio = getAspectRatio(previewView.getWidth(), previewView.getHeight());
int rotation = previewView.getDisplay().getRotation();
preview = new Preview.Builder()
.setTargetAspectRatio(screenAspectRatio)
.setTargetRotation(rotation)
.build();
cameraSelector = new CameraSelector.Builder()
.requireLensFacing(lensFacing)
.build();
imageCapture = new ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.setTargetAspectRatio(screenAspectRatio)
.setTargetRotation(rotation)
.setFlashMode(flashMode)
.build();
// Must unbind the use-cases before rebinding them
cameraProvider.unbindAll();
preview.setSurfaceProvider(previewView.createSurfaceProvider());
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture);
}
Run Code Online (Sandbox Code Playgroud)
并切换手电筒:
private void toggleFlash(){
Log.d(TAG, "toggleFlash: "+flashMode);
switch (flashMode){
case …Run Code Online (Sandbox Code Playgroud) 我想使用 Google ML Kit 和 CameraX API 制作实时图像分类器。我正在使用 CameraX API 的预览和分析。它给出的错误为
2020-07-27 01:17:18.145 11009-11009/com.example.camerax_automl W/System.err: Caused by: java.lang.IllegalStateException: Image is already closed
2020-07-27 01:17:18.145 11009-11009/com.example.camerax_automl W/System.err: at android.media.Image.throwISEIfImageIsInvalid(Image.java:68)
2020-07-27 01:17:18.145 11009-11009/com.example.camerax_automl W/System.err: at android.media.ImageReader$SurfaceImage$SurfacePlane.getBuffer(ImageReader.java:832)
2020-07-27 01:17:18.145 11009-11009/com.example.camerax_automl W/System.err: at com.google.mlkit.vision.common.internal.ImageConvertUtils.zza(com.google.mlkit:vision-common@@16.0.0:139)
2020-07-27 01:17:18.145 11009-11009/com.example.camerax_automl W/System.err: at com.google.mlkit.vision.common.internal.ImageConvertUtils.convertToUpRightBitmap(com.google.mlkit:vision-common@@16.0.0:89)
2020-07-27 01:17:18.145 11009-11009/com.example.camerax_automl W/System.err: at com.google.mlkit.vision.common.internal.ImageConvertUtils.getUpRightBitmap(com.google.mlkit:vision-common@@16.0.0:10)
2020-07-27 01:17:18.145 11009-11009/com.example.camerax_automl W/System.err: at com.google.mlkit.vision.label.automl.internal.zzo.zza(com.google.mlkit:image-labeling-automl@@16.0.0:16)
2020-07-27 01:17:18.145 11009-11009/com.example.camerax_automl W/System.err: at com.google.mlkit.vision.label.automl.internal.zzo.run(com.google.mlkit:image-labeling-automl@@16.0.0:60)
2020-07-27 01:17:18.145 11009-11009/com.example.camerax_automl W/System.err: at com.google.mlkit.vision.common.internal.MobileVisionBase.zza(com.google.mlkit:vision-common@@16.0.0:23)
2020-07-27 01:17:18.146 11009-11009/com.example.camerax_automl W/System.err: at com.google.mlkit.vision.common.internal.zzb.call(com.google.mlkit:vision-common@@16.0.0)
2020-07-27 01:17:18.146 11009-11009/com.example.camerax_automl W/System.err: …Run Code Online (Sandbox Code Playgroud) 我在我的项目中使用 CameraX。我已经创建了预览用例并捕获用例。
final CameraSelector cameraSelector = new CameraSelector.Builder().requireLensFacing(lensFacing).build();
previewBuilder = new Preview.Builder()
.setTargetResolution(targetOutputSize)
.setTargetRotation(rotation);
preview = previewBuilder.build();
final ImageCapture.Builder imageCaptureBuilder = new ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MINIMIZE_LATENCY)
.setTargetResolution(targetOutputSize)
.setTargetRotation(rotation);
imageCapture = imageCaptureBuilder.build();
Run Code Online (Sandbox Code Playgroud)
一切正常。现在,我需要添加功能来手动更改曝光补偿,但我在官方文档或其他任何地方找不到如何执行此操作的任何参考。是否可以使用 CameraX,或者我需要切换到 Camera2 API?
请,欢迎任何帮助。
我正在尝试使用 Firebase 的 MLKit 通过 Camerax 进行人脸检测。我很难让图像分析的图像代理大小与 PreviewView 的大小相匹配。对于图像分析和 PreviewView,我已将 setTargetResolution() 设置为 PreviewView 的宽度和高度。但是,当我在分析器中检查 Imageproxy 的大小时,它的宽度为 1920,高度为 1080。我的 PreviewView 宽度为 1080,高度为 2042。当我在 setTargetResolution() 中交换宽度和高度以进行图像分析时,imageproxy 中的宽度和高度都为 1088。我的预览视图也被锁定为纵向模式。
最终,我需要将原始图像代理数据和人脸点数据输入到 AR 代码中。因此,仅放大绘制面部点的图形叠加对我来说不起作用。
问:如果无法在 camerax 库中解决此问题,如何缩放从分析器返回的图像代理以匹配预览视图?
我正在使用 Java 和最新的 Camerax 库:
def camerax_version = "1.0.0-beta08"
我有一个PreviewView占据整个屏幕但工具栏除外。相机的预览效果很好,但是当我拍摄图像时,纵横比完全不同。
我想在成功捕获后向用户显示图像,因此它的大小与 相同,PreviewView因此我不必裁剪或拉伸它。
是否可以在每个设备上更改纵横比,它是它的大小PreviewView还是我必须将其设置为固定值?
有人可以澄清一下,我应该何时使用androidx.camera.view.CameraController以及何时使用androidx.camera.lifecycle.ProcessCameraProvider?两者似乎都能够使用生命周期事件启动/停止相机,处理不同的用例(预览、拍照、图像分析)。两者都可以与androidx.camera.lifecycle.PreviewView.
我正在开发一个项目,该项目使用 CameraX 在TextureView. 代码来自这个codelab。我已经使用该setOnPreviewOutputUpdateListener()方法更新TextureView.
private fun startCamera() {
val previewConfig = PreviewConfig.Builder().apply {
setTargetAspectRatio( Rational( 1 , 1 ) )
setTargetResolution( Size( 640 , 640 ) )
}.build()
val preview = Preview( previewConfig )
preview.setOnPreviewOutputUpdateListener {
val parent = cameraTextureView?.parent as ViewGroup
parent.removeView( cameraTextureView )
cameraTextureView?.surfaceTexture = it.surfaceTexture
parent.addView( cameraTextureView , 0)
updateTransform()
}
preview.removePreviewOutputListener()
CameraX.bindToLifecycle( this , preview )
}
Run Code Online (Sandbox Code Playgroud)
我的问题是如何byte[]使用 CameraX 从预览帧中获取原始对象。我期待类似于onPreviewFrame(byte[] data, Camera camera)方法的东西。
基本上,我想要使用 …
android-camerax ×10
android ×9
java ×2
analysis ×1
androidx ×1
google-mlkit ×1
image ×1
kotlin ×1