Ошибка при отправке изображения для сопоставления лиц в AWS Rekognition на Android - PullRequest
1 голос
/ 28 мая 2019

Я получаю сообщение об ошибке при отправке изображения для распознавания в AWS Rekognition. Это код, который я использую:

        val byteBuffer = ByteBuffer.allocate(facePicture.byteCount)
        facePicture.copyPixelsToBuffer(byteBuffer)
        val image = Image().withBytes(byteBuffer)

        val searchFacesByImageResult = rekognitionClient.searchFacesByImage(
            SearchFacesByImageRequest()
                .withCollectionId(collectionId)
                .withImage(image)
                .withMaxFaces(1)
                .withFaceMatchThreshold(88F)
        )

И это ошибка:

com.amazonaws.AmazonServiceException: 1 validation error detected: Value 'java.nio.HeapByteBuffer[pos=0 lim=0 cap=0]' at 'image.bytes' failed to satisfy constraint: Member must have length greater than or equal to 1 (Service: AmazonRekognition; Status Code: 400; Error Code: ValidationException; Request ID: 70a3f05c-8166-11e9-a1cb-fbae8cf4359b)
        at com.amazonaws.http.AmazonHttpClient.handleErrorResponse(AmazonHttpClient.java:730)
        at com.amazonaws.http.AmazonHttpClient.executeHelper(AmazonHttpClient.java:405)
        at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:212)
        at com.amazonaws.services.rekognition.AmazonRekognitionClient.invoke(AmazonRekognitionClient.java:3006)
        at com.amazonaws.services.rekognition.AmazonRekognitionClient.searchFacesByImage(AmazonRekognitionClient.java:238

Исключение выглядит как ByteBuffer пусто, я отладил и проверил, что ByteBuffer допустим и не пуст

1 Ответ

1 голос
/ 28 мая 2019

Оказалось, проблема была в формате изображения, я использовал формат RAW BMP, формат, в котором Bitmap представлен в памяти.Но Amazon не поддерживает этот формат, это указано в документации здесь

Amazon Rekognition поддерживает форматы изображений PNG и JPEG.То есть изображения, которые вы предоставляете в качестве входных данных для различных операций API, таких как DetectLabels и IndexFaces, должны быть в одном из поддерживаемых форматов.

Чтобы исправить это, я изменил свой код на следующее:

     val stream = ByteArrayOutputStream()
     facePicture.compress(Bitmap.CompressFormat.PNG, 100, stream)
     val byteBuffer = ByteBuffer.wrap(stream.toByteArray())
     val image = Image().withBytes(byteBuffer)

...