由于从位图到字节缓冲区的转换,应用程序正在崩溃.tflite模型或位图到字节缓冲区的转换有问题吗



我想用手机摄像头实时检测手语。我也在kaggle开发了tflite模型,但在android工作室面临这个问题,有人能帮我吗??

安卓工作室中的错误

Process: com.example.signtf, PID: 19729
java.nio.BufferOverflowException
at java.nio.Buffer.nextPutIndex(Buffer.java:514)
at java.nio.DirectByteBuffer.putFloat(DirectByteBuffer.java:789)
at com.example.signtf.ClassifierFloatMobileNet.addPixelValue(ClassifierFloatMobileNet.java:60)
at com.example.signtf.Classifier.convertBitmapToByteBuffer(Classifier.java:222)
at com.example.signtf.Classifier.recognizeImage(Classifier.java:235)
at com.example.signtf.ClassifierActivity$1.run(ClassifierActivity.java:99)
at android.os.Handler.handleCallback(Handler.java:789)
at android.os.Handler.dispatchMessage(Handler.java:98)
at android.os.Looper.loop(Looper.java:164)
at android.os.HandlerThread.run(HandlerThread.java:65)

ClassifierActivity.java

protected void addPixelValue(int pixelValue) {
imgData.putFloat((((pixelValue >> 16) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
imgData.putFloat((((pixelValue >> 8) & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
imgData.putFloat(((pixelValue & 0xFF) - IMAGE_MEAN) / IMAGE_STD);
}

分类程序.java

/** Writes Image data into a {@code ByteBuffer}. */
private void convertBitmapToByteBuffer(Bitmap bitmap) {
if (imgData == null) {
return;
}
imgData.rewind();
bitmap.getPixels(intValues, 0, bitmap.getWidth(), 0, 0, bitmap.getWidth(), bitmap.getHeight());
// Convert the image to floating point.
int pixel = 0;
long startTime = SystemClock.uptimeMillis();
for (int i = 0; i < getImageSizeX(); ++i) {
for (int j = 0; j < getImageSizeY(); ++j) {
final int val = intValues[pixel++];
addPixelValue(val);
}
}
long endTime = SystemClock.uptimeMillis();
LOGGER.v("Timecost to put values into ByteBuffer: " + (endTime - startTime));
}

能否附上创建imgData的代码?由于这是一个BufferOverflowException问题,我猜imgData对于您试图传入的图像来说不够大

或者,您可以试用TFLite支持库,它可以自动处理从位图到字节缓冲区的转换。请参阅图像分类器的示例。

最新更新