我遇到了 CameraX 屏幕旋转支持的问题。
肖像:

风景:

转换代码:
private void updateTransform() {
Log.d(TAG, "updateTransform: ");
Matrix matrix = new Matrix();
float centerX = cameraViewTextureV.getWidth() / 2f;
float centerY = cameraViewTextureV.getHeight() / 2f;
switch (cameraViewTextureV.getDisplay().getRotation()) {
case Surface.ROTATION_0:
rotation = 0;
break;
case Surface.ROTATION_90:
rotation = 90;
break;
case Surface.ROTATION_180:
rotation = 180;
break;
case Surface.ROTATION_270:
rotation = 270;
break;
default:
break;
}
matrix.postRotate((float) -rotation, centerX, centerY);
cameraViewTextureV.setTransform(matrix);
}
Run Code Online (Sandbox Code Playgroud)
所以,正如你在图片中看到的,相机支持屏幕旋转不正确......我updateTransform在屏幕旋转时调用方法......从Android开发者网站的cameraX官方指南中获取此代码。
将非常感谢任何修复建议。祝你今天过得愉快!
好吧,我浏览了不同的帖子,发现根据移动制造商的不同,可能会出现捕获图像旋转等复杂情况,因此您必须意识到这一点。我所做的是:
fun rotateBitmap(bitmap: Bitmap): Bitmap? {
val matrix = Matrix()
when (getImageOrientation(bitmap)) {
ExifInterface.ORIENTATION_NORMAL -> return bitmap
ExifInterface.ORIENTATION_FLIP_HORIZONTAL -> matrix.setScale(-1f, 1f)
ExifInterface.ORIENTATION_ROTATE_270 -> matrix.setRotate(-90f)
ExifInterface.ORIENTATION_ROTATE_180 -> matrix.setRotate(180f)
ExifInterface.ORIENTATION_ROTATE_90 -> matrix.setRotate(90f)
ExifInterface.ORIENTATION_FLIP_VERTICAL -> {
matrix.setRotate(180f)
matrix.postScale(-1f, 1f)
}
ExifInterface.ORIENTATION_TRANSPOSE -> {
matrix.setRotate(90f)
matrix.postScale(-1f, 1f)
}
ExifInterface.ORIENTATION_TRANSVERSE -> {
matrix.setRotate(-90f)
matrix.postScale(-1f, 1f)
}
else -> return bitmap
}
Run Code Online (Sandbox Code Playgroud)
这有效。但后来我注意到一些非常奇怪的事情,这可能与我配置 Camera X 的方式有关。
使用相同的设备,我得到不同旋转的位图(好吧,这不应该发生。如果设备奇怪地旋转图像,它应该以两种模式旋转图像 - inImageAnalysesUseCase和ImageCaptureUseCase)。
那么,为什么会发生这种情况以及如何解决它?
代码实现:
将相机 X 绑定到生命周期:
CameraX.bindToLifecycle(
this,
buildPreviewUseCase(),
buildImageAnalysisUseCase(),
buildImageCaptureUseCase()
)
Run Code Online (Sandbox Code Playgroud)
预览用例:
private …Run Code Online (Sandbox Code Playgroud) 当我进入示例应用程序代码时,提到在创建项目时选择 Kotlin。
我以前使用过camera2 API。
I want to be able to get the exact image for analysis step as I get in preview. I have preview use case:
val metrics = DisplayMetrics().also { binding.codeScannerView.display.getRealMetrics(it) }
val screenAspectRatio = Rational(metrics.widthPixels, metrics.heightPixels)
val previewConfig = PreviewConfig.Builder().apply {
setTargetAspectRatio(screenAspectRatio)
}.build()
Run Code Online (Sandbox Code Playgroud)
And next to it I have analysis use case config:
val analyzerConfig = ImageAnalysisConfig.Builder().apply {
setTargetResolution(Size(metrics.heightPixels, metrics.widthPixels))
setTargetAspectRatio(screenAspectRatio)
val analyzerThread = HandlerThread(
"QrCodeReader").apply { start() }
setCallbackHandler(Handler(analyzerThread.looper))
setImageReaderMode(
ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
}.build()
Run Code Online (Sandbox Code Playgroud)
My preview is fullscreen so it's size is …
随着Android的CameraX分析仪 ImageProxy使用ImageReader一个默认的引擎盖下YUV_420_888的图像格式。
我想在 OpenCVMat中转换它以便在我的分析器中使用 OpenCV:
override fun analyze(imageProxy: ImageProxy, rotationDegrees: Int) {
try {
imageProxy.image?.let {
// ImageProxy uses an ImageReader under the hood:
// https://developer.android.com/reference/androidx/camera/core/ImageProxy.html
// That has a default format of YUV_420_888 if not changed that's the default
// Android camera format.
// https://developer.android.com/reference/android/graphics/ImageFormat.html#YUV_420_888
// https://developer.android.com/reference/android/media/ImageReader.html
// Sanity check
if (it.format == ImageFormat.YUV_420_888
&& it.planes.size == 3
) {
// TODO - convert ImageProxy.image to Mat
} else {
// …Run Code Online (Sandbox Code Playgroud) 我正在使用新的 Jetpack 库 CameraX 制作一个简单的相机应用程序。\n只要我通过添加依赖项来启动应用程序,它就会崩溃。
\n\n依赖项:
\n\nimplementation "androidx.camera:camera-core:1.0.0-alpha06"\nimplementation "androidx.camera:camera-camera2:1.0.0-alpha06"\nRun Code Online (Sandbox Code Playgroud)\n\n崩溃日志:
\n\n2019-11-28 16:16:45.828 26428-26428/? E/AndroidRuntime: FATAL EXCEPTION: main\nProcess: com.ananth.camerax, PID: 26428\njava.lang.RuntimeException: Unable to get provider androidx.camera.camera2.impl.Camera2Initializer: java.lang.ClassNotFoundException: Didn\'t find class "androidx.camera.camera2.impl.Camera2Initializer" on path: DexPathList[[zip file "/data/app/com.ananth.camerax-5fK5oVGKPPgZn_ITpYwEsA==/base.apk"],nativeLibraryDirectories=[/data/app/com.ananth.camerax-5fK5oVGKPPgZn_ITpYwEsA==/lib/arm64, /system/lib64, /system/vendor/lib64]]\n at android.app.ActivityThread.installProvider(ActivityThread.java:6444)\n at android.app.ActivityThread.installContentProviders(ActivityThread.java:5946)\n at android.app.ActivityThread.handleBindApplication(ActivityThread.java:5858)\n at android.app.ActivityThread.-wrap1(Unknown Source:0)\n at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1690)\n at android.os.Handler.dispatchMessage(Handler.java:105)\n at android.os.Looper.loop(Looper.java:173)\n at android.app.ActivityThread.main(ActivityThread.java:6698)\n at java.lang.reflect.Method.invoke(Native Method)\n at com.android.internal.os.Zygote$MethodAndArgsCaller.run(Zygote.java:240)\n at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:782)\n Caused by: java.lang.ClassNotFoundException: Didn\'t find class "androidx.camera.camera2.impl.Camera2Initializer" on path: DexPathList[[zip file "/data/app/com.ananth.camerax-5fK5oVGKPPgZn_ITpYwEsA==/base.apk"],nativeLibraryDirectories=[/data/app/com.ananth.camerax-5fK5oVGKPPgZn_ITpYwEsA==/lib/arm64, /system/lib64, /system/vendor/lib64]]\n at …Run Code Online (Sandbox Code Playgroud) 我是一名初级 Android 开发人员。\n我正在使用 CameraX 的最新版本 (alpha08)。
\n\n我正在尝试设置缩放功能,为此我需要 CameraControl。\n要获取 CameraControl,我需要根据https://developer.android.com/reference提供 Camera -> Camera.getCameraControl() 的实例/androidx/相机/核心/CameraControl
\n\n我似乎无法获取 Camera 的实例。如果我尝试实例化 Camera,它会要求我实现 getCameraControl() 和 getCameraInfo(),它们都返回 null。
\n\n有人可以向我解释一下该怎么做吗?
\n\n这是我的 ApplicationClass 文件
\n\npublic class ApplicationClass extends Application implements CameraXConfig.Provider {\n\n @NonNull\n @Override\n public CameraXConfig getCameraXConfig() {\n return Camera2Config.defaultConfig();\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我的 startCamera() 函数进入我的 CameraActivity
\n\nprivate void startCamera() {\n\n CameraSelector mCameraSelector = CameraSelector.DEFAULT_BACK_CAMERA;\n\n mFlashToggle.setVisibility(View.VISIBLE);\n mGalleryFAB.setVisibility(View.VISIBLE);\n mTakePhotoFAB.setVisibility(View.VISIBLE);\n\n Point mSize = new Point();\n Display mDisplay = getWindowManager().getDefaultDisplay();\n\n mDisplay.getSize(mSize);\n int mWidth = mSize.x;\n int …Run Code Online (Sandbox Code Playgroud) 我正在我的应用程序中使用CameraX并希望在构建视频稳定功能中使用,但我不知道该怎么做?
正如Camera.Parameters中记录的那样,我们可以使用 3 种方法来 实现实时视频稳定,但我没有找到在 CameraX 中使用这些函数的任何参考public void setVideoStabilization (boolean toggle)。如果不可能,那么我应该使用吗? public boolean isVideoStabilizationSupported ()public boolean getVideoStabilization ()CameraXCamera2
我的自定义 CameraX 流程如下:
问题是何时running all the process (in step 3)有 adelayed 2 seconds并且相机预览静止live(not freeze或lock)。怎么做camera preview freeze or lock when running the process?
这是我在 Camera X 中运行相机预览的代码:
class CameraFragment : Fragment() {
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
// Inflate the layout for this fragment
return inflater.inflate(R.layout.fragment_camera, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState) …Run Code Online (Sandbox Code Playgroud)