web-dev-qa-db-fra.com

Conversion d'ImageProxy en bitmap

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?

13
MaartinAndroid

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
}
0
kostyabakay

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.

0
jasxir