我想使用CameraSource
来检测一些可视代码(这不是任何类型的条形码)。我实现了Detector
及其detect(Frame frame)
方法。但是,当我在frame.getBitmap()
方法中调用detect
时,它始终返回null
。我知道Frame
有另一种方法getGrayscaleImageData()
,但检测代码需要颜色信息。似乎CameraSource
仅将灰度图像数据传递给其底层检测器。
那么,有没有办法通过CameraSource
检测此代码?或者我应该放弃CameraSource
并找到另一种方式?
答案 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;
}