我正在尝试使用 google android vision API 来检测条形码。相机帧由外部 UVCCamera 生成,该 UVCCamerajava.nio.DirectByteBuffer
以帧的形式提供。我试图使用该方法通过将对象作为字节缓冲区public Frame.Builder setImageData (ByteBuffer data, int width, int height, int format)
传递来解析条形码。java.nio.ByteBufferArray
UVCCamera 帧的像素格式为 NV21 格式。但我没有得到任何结果,没有错误或异常。
配置:
SDK: 23
google pla service: 33
vision api: 'com.google.android.gms:play-services-vision:9.4.0+'
但是在示例中,传递给该方法的是一个java.nio.ByteArrayBuffer
(在使用包装字节数组之后ByteBuffer.wrap(byteArray)
)
以下是我使用的示例代码[注意它是代码的简化版本,实际上是在线程上运行]:
public void process(ByteBuffer mPendingFrameData)
{
byte[] arr = new byte[frame.remaining()];
frame.get(arr);
ByteBuffer buf = ByteBuffer.wrap( arr );
Frame outputFrame = null;
while (true)
{
try
{
mPendingFrameData.clear();
outputFrame = new Frame.Builder().setImageData( buf, 640, 480, ImageFormat.NV21).build();
if( detector.isOperational() )
{
SparseArray<Barcode> barcodes = detector.detect(outputFrame);
if(barcodes.size()!=0)
{
Barcode barcodeValue = barcodes.valueAt(0);
System.out.println(barcodeValue.rawValue);
}
}
}
catch( Exception e )
{
System.out.println(e.getMessage());
}
}
}
我创建另一个缓冲区的原因是创建一个 ByteBufferArray。
谁能让我知道我在这里缺少的部分是什么?