因此,我想探索新的Google的Camera API- CameraX。我想做的是每秒从相机提要中获取一张图像,然后将其传递到接受位图的功能中,以进行机器学习。
我阅读了有关Camera XImage Analyzer 的文档:
图像分析用例为您的应用提供了CPU可访问的图像,以执行图像处理,计算机视觉或机器学习推断。该应用程序实现在每个框架上运行的Analyzer方法。
..这基本上是我需要的。因此,我实现了这个图像分析器,如下所示:
imageAnalysis.setAnalyzer { image: ImageProxy, _: Int ->
viewModel.onAnalyzeImage(image)
}
Run Code Online (Sandbox Code Playgroud)
我得到的是image: ImageProxy。我该如何将其转移ImageProxy到Bitmap?
我试图这样解决:
fun decodeBitmap(image: ImageProxy): Bitmap? {
val buffer = image.planes[0].buffer
val bytes = ByteArray(buffer.capacity()).also { buffer.get(it) }
return BitmapFactory.decodeByteArray(bytes, 0, bytes.size)
}
Run Code Online (Sandbox Code Playgroud)
但是它返回null-因为decodeByteArray没有收到有效的(?)位图字节。有任何想法吗?
我已经阅读了 camerax 教程(https://developer.android.com/training/camerax),以及一些文档(https://developer.android.com/reference/androidx/camera/core/ImageCapture)。但是我没有找到负责拍摄连拍图像的部分,也没有保存到 DNG 文件(RAW 格式)。我在 github ( https://github.com/android/camera/issues )上的问题中遇到过类似但没有回答的问题。所以我在这里重新发布问题。
拜托,有人可以提供在 GLSurfaceView 中使用 CameraX 库的好例子,找不到任何信息。
我正在使用 CameraX 在我的 android 应用程序中拍照,保存它们,然后从它们的路径中显示它们。在之前的 alpha-09 版本中,我可以使用 onImageSaved(File file) 来做到这一点。但是,对于 alpha-10,我必须使用 onImageSaved(OutputFileResults outputFileResults),然后从 outputFileResults 检索的 uri 中获取路径。但是我得到的 Uri 总是错误的。例如,当我的图像保存在:“/external/images/media/1581680878237.jpg”时,我得到 uri 的路径:“/external/images/media/113758”。
这是我的代码:
ContentValues contentValues = new ContentValues();
contentValues.put(MediaStore.MediaColumns.DISPLAY_NAME, "NEW_IMAGE");
contentValues.put(MediaStore.MediaColumns.MIME_TYPE, "image/jpg");
ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(
activity.getContentResolver(),
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
contentValues).build();
imageCapture.takePicture(outputFileOptions, Runnable::run, new ImageCapture.OnImageSavedCallback() {
@Override
public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) {
Uri uri = outputFileResults.getSavedUri();
if(uri != null){
System.out.println("URI PATH" + uri.getPath());
System.out.println("URI PATH" + uri.toString());
activity.runOnUiThread(cameraProvider::unbindAll);
galleryAddPic(uri);
Bundle params = new Bundle();
params.putString("FILE_PATH", uri.getPath());
Navigation.findNavController(root).navigate(R.id.navigation_edit_image, params);
}
}
@Override …Run Code Online (Sandbox Code Playgroud) 我不知道如何在预览视图中使用 camerax。
我已经实现了我自己的子类ImageAnalysis.Analyzer并且它按预期工作。现在我想ImageAnalysis动态地“附加/分离”这个分析器到类(基于一些用户操作)。从ImageAnalysisAPI来看好像是可以的,有setAnalyzer方法,也有clearAnalyzer方法。但是,这仅在第一次setAnalyzer调用时才能正常工作。如果我一次clearAnalyzer又一次地调用setAnalyzer,analyze则不会调用方法。
在方法的文档中clearAnalyzer是
Removes a previously set analyzer.
This will stop data from streaming to the ImageAnalysis.
Run Code Online (Sandbox Code Playgroud)
所以看起来它的工作可能如预期的那样正确?它将停止数据流向ImageAnalysis. 但是可以按照我想要的方式清除/设置分析仪吗?我不想enabled向我的分析器添加一些布尔标志,存在线程问题、图像队列问题,并且使用 set/clear 的解决方案将是我认为最干净的解决方案。
我正在尝试为我的屏幕录像机应用程序制作浮动相机视图。
FloatingViewService.java
public class FloatingViewService extends LifecycleService implements CameraXConfig.Provider, LifecycleOwner {
private View mFloatingView;
private WindowManager mWindowManager;
PreviewView previewView;
private ListenableFuture<ProcessCameraProvider> cameraProviderFuture;
public FloatingViewService() {
}
@Nullable
@Override
public IBinder onBind(Intent intent) {
super.onBind(intent);
return null;
}
@Override
public void onCreate() {
super.onCreate();
mFloatingView = LayoutInflater.from(this).inflate(R.layout.layout_floating_widget, null);
final WindowManager.LayoutParams params;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
} else {
params = new WindowManager.LayoutParams(
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.WRAP_CONTENT,
WindowManager.LayoutParams.TYPE_PHONE,
WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
PixelFormat.TRANSLUCENT);
}
params.width = 400; …Run Code Online (Sandbox Code Playgroud) java android android-lifecycle android-camerax lifecycleowner
我正在尝试编译示例cameraxbasic,但出现此错误:未解析的参考:WindowManager 我检查了 gradle 文件,并且存在该依赖项。
你好,我是android开发新手,谁能帮我根据PreviewView上的矩形裁剪CameraX捕获的图像?
这是activity_main.xml:
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:id="@+id/frameRoot"
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.camera.view.PreviewView
android:id="@+id/viewFinder"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<View
android:id="@+id/viewOverlay_center"
android:background="@drawable/card_rectangle"
android:layout_width="270dp"
android:layout_height="400dp"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintBottom_toTopOf="@id/ll_bottom"/>
<LinearLayout
android:id="@+id/ll_bottom"
android:layout_width="0dp"
android:layout_height="wrap_content"
android:background="@color/black"
android:gravity="center"
android:orientation="horizontal"
android:padding="16dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent">
<ImageView
android:id="@+id/image_capture_button"
android:layout_width="60dp"
android:layout_height="60dp"
android:background="?android:selectableItemBackground"
android:src="@drawable/shutter_camera" />
</LinearLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</FrameLayout>
Run Code Online (Sandbox Code Playgroud)
这是我的MainActivity.java:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
viewBinding = ActivityMainBinding.inflate(getLayoutInflater());
setContentView(viewBinding.getRoot());
viewBinding.imageCaptureButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
capturePhoto();
}
});
}
private void capturePhoto(){
if (imageCapture == null) …Run Code Online (Sandbox Code Playgroud) 我有一个带有半透明背景的对话框片段。我想以圆形或方形的形式在此对话框片段上放置相机预览。
设置比例类型为 时PreviewView.ScaleType.FIT_CENTER,预览如下:
而如果我将比例类型设置为PreviewView.ScaleType.FILL_CENTER,则预览如下:
以下代码是我用于相机预览可组合项的代码:
@Composable
private fun CameraPreview(
modifier: Modifier = Modifier,
scaleType: PreviewView.ScaleType = PreviewView.ScaleType.FILL_CENTER,
onUseCase: (UseCase) -> Unit
) {
AndroidView(
modifier = modifier,
factory = { context ->
val previewView = PreviewView(context).apply {
this.scaleType = scaleType
layoutParams = ViewGroup.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT
)
}
onUseCase(
Preview.Builder()
.build()
.also {
it.setSurfaceProvider(previewView.surfaceProvider)
}
)
previewView
}
)
}
Run Code Online (Sandbox Code Playgroud)
我尝试为布局参数设置整数值,但这似乎没有帮助。我怎样才能设置相机预览,使其适合边界,并且不会超出边界或在边界周围留下黑色边框?
这是供参考的图像,它显示了我想要实现的目标: