将google-视觉框一分为二

Divide google-vision frame into two

在我的自定义检测器中,我想将帧中的图像分成两半,分别处理它们。 这是我到目前为止在我的习惯中得到的 Detector:

val imageArray = frame?.grayscaleImageData?.array()
    val upperImageBuffer = ByteBuffer
                               .allocate(imageArray?.size ?: 0)
                               .put(imageArray, 0, imageArray?.size?.div(2) ?: 0)
val upperFrame = Frame.Builder().
            setImageData(upperImageBuffer, 
                frame?.metadata?.width ?: 0, 
                frame?.metadata?.height?.div(2) ?: 0, 
                frame?.metadata?.format ?: 16).
            setRotation(frame?.metadata?.rotation ?: 0).
            build()

val lowerFrame... etc

val upperDetections = delegateDetector.detect(upperFrame)
upperDetections.forEach { key, barcode -> 
   if (barcode is Barcode) results.append(key, barcode) 
}

val lowerDetections = delegateDetector.detect(lowerFrame) etc.

到目前为止,我在两者上都使用了相同的检测器(这实际上是为了检查我是否会识别出比整个帧更多的结果——听起来很愚蠢,但我把问题留了下来,因为也许将来有人需要将图像的一部分由一个检测器处理,另一部分由另一个检测器处理)。

仍然,问题是:我得到的两半结果相同,实际上与原始帧相同。我做错了什么?

来自 CameraSource 的 grayscaleImageData 也包括颜色,但以灰度通道为前缀。也就是说,它被格式化为 YUV 而不仅仅是 Y 通道(灰度)。

所以不要使用 imageArray.size,而是使用 frame.width * frame.height 作为大小。