by Anonymous » 06 Jan 2025, 06:10
Ich erstelle eine App, die das Google ML Kit verwendet, um ein menschliches Gesicht auf einem Bild zu erkennen und ein Rechteck darum zu zeichnen. Die Kameravorschau wird von CameraX bereitgestellt (
)-Bibliothek. Diese Frage ließ mich inspirieren. Hier ist das problematische Fragment eines Codes:
Code: Select all
@OptIn(ExperimentalGetImage::class)
private fun startCamera(deviceSize: Pair) {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder().build().also {
it.surfaceProvider = PreviewView(this).surfaceProvider
}
val size = Size(deviceSize.first, deviceSize.second)
val strategy = ResolutionStrategy(deviceSize, 2)
val rs = ResolutionSelector.Builder().setResolutionStrategy(strategy)
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.setResolutionSelector(rs.build())
.build()
imageAnalysis.setAnalyzer(cameraExecutor) { imageProxy ->
val rotationDegrees = imageProxy.imageInfo.rotationDegrees
val mediaImage = imageProxy.image
if (mediaImage != null) {
val inputImage = InputImage.fromMediaImage(mediaImage, rotationDegrees)
detectFaces(inputImage) { faces ->
drawRectangles(faces)
imageProxy.close()
}
} else {
imageProxy.close()
}
}
val cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis)
} catch (e: Exception) {
e.printStackTrace()
}
}, ContextCompat.getMainExecutor(this))
}
Der einzige Fehler, der von der IDE (Android Studio Ladybug 2024.2.1 Patch 3) angezeigt wird, ist
"Zugriff auf 'constructor(): ResolutionStrategy' nicht möglich: Das ist der Fall privat in 'androidx/camera/core/resolutionselector/ResolutionStrategy'"
Das kommt mir sehr seltsam vor, da auf der Android-Entwickler-Website ein öffentlicher Konstruktor dokumentiert ist und ich das auch kann Navigieren Sie zum selben öffentlichen Konstruktor, indem Sie auf Gehe zu > Deklaration klicken. Wenn ich jedoch mit der Maus über den von strategy verwendeten Konstruktor fahre, zeigt die IDE den privaten Konstruktor an. Warum passiert es und wie kann man es beheben?
Bearbeiten: Ich habe AspectRatioStrategy herausgefunden, das ResolutionStrategy sehr ähnlich ist und auch an übergeben werden kann ResolutionSelector, kann in meinem Szenario verwendet werden:
Code: Select all
val asp = AspectRatioStrategy(AspectRatio.RATIO_DEFAULT, 1) // no error
Ich hatte auch nicht erwähnt, was es mit der Auflösungsänderung auf sich hat – die Rechtecke um die Begrenzungsrahmen der erkannten Gesichter werden angezeigt, aber nicht im richtigen Verhältnis (Druckabmessungen von mediaImage). ergibt 640x480).
Ich erstelle eine App, die das Google ML Kit verwendet, um ein menschliches Gesicht auf einem Bild zu erkennen und ein Rechteck darum zu zeichnen. Die Kameravorschau wird von CameraX bereitgestellt ([code]androidx.camera[/code])-Bibliothek. Diese Frage ließ mich inspirieren. Hier ist das problematische Fragment eines Codes:
[code]@OptIn(ExperimentalGetImage::class)
private fun startCamera(deviceSize: Pair) {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
val cameraProvider = cameraProviderFuture.get()
val preview = Preview.Builder().build().also {
it.surfaceProvider = PreviewView(this).surfaceProvider
}
val size = Size(deviceSize.first, deviceSize.second)
val strategy = ResolutionStrategy(deviceSize, 2)
val rs = ResolutionSelector.Builder().setResolutionStrategy(strategy)
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.setResolutionSelector(rs.build())
.build()
imageAnalysis.setAnalyzer(cameraExecutor) { imageProxy ->
val rotationDegrees = imageProxy.imageInfo.rotationDegrees
val mediaImage = imageProxy.image
if (mediaImage != null) {
val inputImage = InputImage.fromMediaImage(mediaImage, rotationDegrees)
detectFaces(inputImage) { faces ->
drawRectangles(faces)
imageProxy.close()
}
} else {
imageProxy.close()
}
}
val cameraSelector = CameraSelector.DEFAULT_FRONT_CAMERA
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageAnalysis)
} catch (e: Exception) {
e.printStackTrace()
}
}, ContextCompat.getMainExecutor(this))
}
[/code]
Der einzige Fehler, der von der IDE (Android Studio Ladybug 2024.2.1 Patch 3) angezeigt wird, ist
"Zugriff auf 'constructor(): ResolutionStrategy' nicht möglich: Das ist der Fall privat in 'androidx/camera/core/resolutionselector/ResolutionStrategy'"
Das kommt mir sehr seltsam vor, da auf der Android-Entwickler-Website ein öffentlicher Konstruktor dokumentiert ist und ich das auch kann Navigieren Sie zum selben öffentlichen Konstruktor, indem Sie auf Gehe zu > Deklaration klicken. Wenn ich jedoch mit der Maus über den von strategy verwendeten Konstruktor fahre, zeigt die IDE den privaten Konstruktor an. Warum passiert es und wie kann man es beheben?
Bearbeiten: Ich habe AspectRatioStrategy herausgefunden, das ResolutionStrategy sehr ähnlich ist und auch an übergeben werden kann ResolutionSelector, kann in meinem Szenario verwendet werden:
[code]val asp = AspectRatioStrategy(AspectRatio.RATIO_DEFAULT, 1) // no error
[/code]
Ich hatte auch nicht erwähnt, was es mit der Auflösungsänderung auf sich hat – die Rechtecke um die Begrenzungsrahmen der erkannten Gesichter werden angezeigt, aber nicht im richtigen Verhältnis (Druckabmessungen von mediaImage). ergibt 640x480).