Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 运行时在ARCore数据库中添加图像时出错_Java_Android Studio_Augmented Reality_Arcore - Fatal编程技术网

Java 运行时在ARCore数据库中添加图像时出错

Java 运行时在ARCore数据库中添加图像时出错,java,android-studio,augmented-reality,arcore,Java,Android Studio,Augmented Reality,Arcore,我想在运行时在ARCore数据库中添加映像。因此,在我的MainActivity.java中,我有一个注册了按钮的图像,点击后,它在ARCore数据库中添加了该图像 MainActivity.java: public class MainActivity extends AppCompatActivity { private CustomArFragment arFragment; private TextView textView; private AugmentedImageDatabas

我想在运行时在ARCore数据库中添加映像。因此,在我的MainActivity.java中,我有一个注册了按钮的图像,点击后,它在ARCore数据库中添加了该图像

MainActivity.java:

public class MainActivity extends AppCompatActivity {

private CustomArFragment arFragment;
private TextView textView;
private AugmentedImageDatabase aid;
private Frame frame;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    arFragment = (CustomArFragment) getSupportFragmentManager().findFragmentById(R.id.arFragment);
    textView = findViewById(R.id.textView);

    arFragment.getArSceneView().getScene().addOnUpdateListener(this::onUpdate);

    findViewById(R.id.registeredBtn).setOnClickListener(v -> {
        if(ActivityCompat.checkSelfPermission(this,
                Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED){
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},1);
            return;
        }
        registeredImage();
    });
}

private static byte[] NV21toJPEG(byte[] nv21, int width, int height) {
    ByteArrayOutputStream out = new ByteArrayOutputStream();
    YuvImage yuv = new YuvImage(nv21, ImageFormat.NV21, width, height, null);
    yuv.compressToJpeg(new Rect(0, 0, width, height), 100, out);
    return out.toByteArray();
}

private static byte[] YUV_420_888toNV21(Image image) {
    byte[] nv21;
    ByteBuffer yBuffer = image.getPlanes()[0].getBuffer();
    ByteBuffer uBuffer = image.getPlanes()[1].getBuffer();
    ByteBuffer vBuffer = image.getPlanes()[2].getBuffer();

    int ySize = yBuffer.remaining();
    int uSize = uBuffer.remaining();
    int vSize = vBuffer.remaining();

    nv21 = new byte[ySize + uSize + vSize];

    //U and V are swapped
    yBuffer.get(nv21, 0, ySize);
    vBuffer.get(nv21, ySize, vSize);
    uBuffer.get(nv21, ySize + vSize, uSize);

    return nv21;
}

// This function triggered when Registered image button clicked
private void registeredImage() {

    File file = new File(getExternalFilesDir(null) + "/db.imgdb");
    Frame CurrFrame = frame;
    Image currentImage;
    int idx = -1;

    try {
        currentImage = CurrFrame.acquireCameraImage();

        byte[] data = null;
        data = NV21toJPEG(YUV_420_888toNV21(currentImage),
                currentImage.getWidth(), currentImage.getHeight());

       
        FileOutputStream outputStream = new FileOutputStream(file);
        Bitmap bitmap = BitmapFactory.decodeByteArray(data,0,data.length);
        idx = aid.addImage("earth",bitmap);
        aid.serialize(outputStream);
        outputStream.close();
        Toast.makeText(this, "image Registered", Toast.LENGTH_SHORT).show();


    } catch (NotYetAvailableException | IOException e) {
        e.printStackTrace();
    }

}
private void onUpdate(FrameTime frameTime) {
        frame = arFragment.getArSceneView().getArFrame();
        Collection<AugmentedImage> images = frame.getUpdatedTrackables(AugmentedImage.class);
        for(AugmentedImage image : images){
            if(image.getTrackingMethod() == AugmentedImage.TrackingMethod.FULL_TRACKING){
                if(image.getName().equals("test")){
                    textView.setText("Test is visible");

                }
                else if(image.getName().equals("earth")){
                    textView.setText("earth is visible");
                }
            }
        }
}

}
请帮我找出问题所在


谢谢:)

您试图添加到数据库的图像没有足够的功能

检查 有关错误的完整说明


如果您希望用户上传图像,我建议使用try-catch块,让用户知道错误,而不是让应用程序崩溃。

Hi@Meiswjn,谢谢您的回答。我在我的catch块中添加了ImageInsufficientQualityException,现在应用程序没有崩溃。我还有一个疑问,添加此异常后,我添加图像的步骤是否正确??或者有更好的方法可以做到这一点??我会尝试用一张更具特色的图片。。在这里你可以阅读更多:还有一个问题。每当在添加图像时在try块中发生错误(错误是因为图像没有足够的功能),数据库中以前存储的所有图像都会自动删除。我正在将数据库保存在设备本地内存中。是否有任何方法,在将图像添加到数据库之前,我可以计算图像的质量分数(0-100)??因为若图像质量分数不够,那个么我就不会在数据库中添加那个图像。
2020-10-05 14:11:39.738 31013-31013/com.example.artag E/native: error_policy_util.cc:261 
################ ARCore Native Error ##################
BUILD_CHANGELIST:331869482
BUILD_BASELINE_CHANGELIST:331085015
################### Stack Trace Begin ################
ARCoreError: third_party/arcore/ar/planar_targets/augmented_image_database_utils.cc:58  https://cs.corp.google.com/piper///depot/google3/third_party/arcore/ar/planar_targets/augmented_image_database_utils.cc?g=0&l=58
ARCoreError: third_party/arcore/ar/core/c_api/augmented_image_database_c_api.cc:133 https://cs.corp.google.com/piper///depot/google3/third_party/arcore/ar/core/c_api/augmented_image_database_c_api.cc?g=0&l=133
################### Stack Trace End #################
2020-10-05 14:11:39.739 31013-31013/com.example.artag D/AndroidRuntime: Shutting down VM
2020-10-05 14:11:39.742 31013-31013/com.example.artag E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.example.artag, PID: 31013
com.google.ar.core.exceptions.ImageInsufficientQualityException
    at java.lang.reflect.Constructor.newInstance0(Native Method)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:343)
    at com.google.ar.core.Session.throwExceptionFromArStatus(Session.java:101)
    at com.google.ar.core.AugmentedImageDatabase.nativeAddImage(Native Method)
    at com.google.ar.core.AugmentedImageDatabase.addImage(AugmentedImageDatabase.java:5)
    at com.example.artag.MainActivity.registeredImage(MainActivity.java:130)
    at com.example.artag.MainActivity.lambda$onCreate$0$MainActivity(MainActivity.java:72)
    at com.example.artag.-$$Lambda$MainActivity$5zEkixen6UibjSKLs5AkDUICWdM.onClick(Unknown Source:2)
    at android.view.View.performClick(View.java:7333)
    at android.widget.TextView.performClick(TextView.java:14160)
    at android.view.View.performClickInternal(View.java:7299)
    at android.view.View.access$3200(View.java:846)
    at android.view.View$PerformClick.run(View.java:27773)
    at android.os.Handler.handleCallback(Handler.java:873)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:214)
    at android.app.ActivityThread.main(ActivityThread.java:6990)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1445)