如何使用 CameraSource 检测需要颜色信息的自定义视觉代码
How to use CameraSource to detect custom visual code which need color information
我想使用 CameraSource
来检测一些视觉代码(不是任何一种条形码)。我实现了 Detector
及其 detect(Frame frame)
方法。但是,当我在 detect
方法中调用 frame.getBitmap()
时,它总是 returns null
。我知道Frame
有另一种方法,getGrayscaleImageData()
,但是检测代码需要颜色信息。似乎CameraSource
只将灰度图像数据传递给它的底层检测器。
那么,有没有办法通过 CameraSource
来检测此代码?还是放弃CameraSource
另辟蹊径?
在当前版本中,CameraSource 实际上 return 从 getGrayscaleImageData 获取图像的完整颜色信息。 returned 的前导字节是图像的灰度层(Y 通道),但之后的字节具有颜色信息。格式详细信息取决于您在设置 CameraSource 时指定的图像格式(默认为 NV21 格式)。
找到了:D
此代码 return 彩色位图如此之快,但如果它是前置摄像头,您可能必须 flip/rotate 根据设备。
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;
}
我想使用 CameraSource
来检测一些视觉代码(不是任何一种条形码)。我实现了 Detector
及其 detect(Frame frame)
方法。但是,当我在 detect
方法中调用 frame.getBitmap()
时,它总是 returns null
。我知道Frame
有另一种方法,getGrayscaleImageData()
,但是检测代码需要颜色信息。似乎CameraSource
只将灰度图像数据传递给它的底层检测器。
那么,有没有办法通过 CameraSource
来检测此代码?还是放弃CameraSource
另辟蹊径?
在当前版本中,CameraSource 实际上 return 从 getGrayscaleImageData 获取图像的完整颜色信息。 returned 的前导字节是图像的灰度层(Y 通道),但之后的字节具有颜色信息。格式详细信息取决于您在设置 CameraSource 时指定的图像格式(默认为 NV21 格式)。
找到了:D 此代码 return 彩色位图如此之快,但如果它是前置摄像头,您可能必须 flip/rotate 根据设备。
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;
}