Donc, je voulais explorer la nouvelle API Camera de Google - CameraX
. Ce que je veux faire, c'est prendre une image du flux de la caméra chaque seconde, puis la passer dans une fonction qui accepte le bitmap à des fins d'apprentissage automatique.
J'ai lu la documentation sur Camera X
Analyseur d'images:
Le cas d'utilisation de l'analyse d'image fournit à votre application une image accessible au processeur pour effectuer le traitement d'image, la vision par ordinateur ou l'inférence d'apprentissage automatique. L'application implémente une méthode Analyzer qui s'exécute sur chaque trame.
..qui est essentiellement ce dont j'ai besoin. J'ai donc implémenté cet analyseur d'images comme ceci:
imageAnalysis.setAnalyzer { image: ImageProxy, _: Int ->
viewModel.onAnalyzeImage(image)
}
Ce que je reçois est image: ImageProxy
. Comment puis-je transférer ce ImageProxy
vers Bitmap
?
J'ai essayé de le résoudre comme ceci:
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)
}
Mais il renvoie null
- car decodeByteArray
ne reçoit pas d'octets bitmap valides (?). Des idées?
Il existe une solution plus simple. Vous pouvez simplement obtenir Bitmap
à partir de TextureView
sans aucune conversion. Plus d'informations dans documentation .
imageAnalysis.setAnalyzer { image: ImageProxy, _: Int ->
val bitmap = textureView.bitmap
}
Inspiré de la réponse de @ mike-a
private fun ImageProxy.toMat(): Mat {
val graySourceMatrix = Mat(height, width, CvType.CV_8UC1)
val yBuffer = planes[0].buffer
val ySize = yBuffer.remaining()
val yPlane = ByteArray(ySize)
yBuffer[yPlane, 0, ySize]
graySourceMatrix.put(0, 0, yPlane)
return graySourceMatrix
}
Cela vous amènera directement au terrain à matrice grise, si vous avez l'intention d'utiliser OpenCV, et les couleurs ne comptent plus pour vous.
Pour les performances, vous pouvez déplacer l'initialisation de Mat
à l'extérieur si vous le faites sur chaque image.