如何使用CameraSource检测需要颜色信息的自定义可视代码

时间:2016-03-24 12:57:06

标签: android android-vision

我想使用CameraSource来检测一些可视代码(这不是任何类型的条形码)。我实现了Detector及其detect(Frame frame)方法。但是,当我在frame.getBitmap()方法中调用detect时,它始终返回null。我知道Frame有另一种方法getGrayscaleImageData(),但检测代码需要颜色信息。似乎CameraSource仅将灰度图像数据传递给其底层检测器。

那么,有没有办法通过CameraSource检测此代码?或者我应该放弃CameraSource并找到另一种方式?

2 个答案:

答案 0 :(得分:1)

在当前版本中,CameraSource实际上确实从getGrayscaleImageData返回图像的完整颜色信息。返回的前导字节是图像的灰度层(Y通道),但超出该字节的字节具有颜色信息。格式详细信息取决于您在设置CameraSource时指定的图像格式(默认为NV21格式)。

答案 1 :(得分:0)

找到它:D 此代码如此快速地返回彩色位图,但如果它是前置摄像头,则可能需要根据设备进行翻转/旋转。

    public SparseArray detect(Frame frame) {
    byte[] bytes = frame.getGrayscaleImageData().array();
    YuvImage yuvImage = new YuvImage(frame.getGrayscaleImageData().array(), ImageFormat.NV21, frame.getMetadata().getWidth(), frame.getMetadata().getHeight(), null);
    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
    yuvImage.compressToJpeg(new Rect(0, 0, frame.getMetadata().getWidth(), frame.getMetadata().getHeight()), 100, byteArrayOutputStream);
    byte[] jpegArray = byteArrayOutputStream.toByteArray();
    Bitmap bitmap = BitmapFactory.decodeByteArray(jpegArray, 0, jpegArray.length);//this bitmap is colored.
    return null; 
}