0

我正在尝试使用 google android vision API 来检测条形码。相机帧由外部 UVCCamera 生成,该 UVCCamerajava.nio.DirectByteBuffer以帧的形式提供。我试图使用该方法通过将对象作为字节缓冲区public Frame.Builder setImageData (ByteBuffer data, int width, int height, int format)传递来解析条形码。java.nio.ByteBufferArrayUVCCamera 帧的像素格式为 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。

谁能让我知道我在这里缺少的部分是什么?

4

0 回答 0