AugmentedImageDatabase Arcore: добавить несколько изображений - PullRequest
0 голосов
/ 21 марта 2019

У меня есть папка с изображениями, но я не могу добавить их в базу данных.У них есть конкретные имена.Приложение говорит "AR сессия не удалась" Это мой код:

  public void setupDatabase(Config config, Session session)
    {
        String filepath = getIntent().getStringExtra("filepath");
        Log.d ("AID", "Veriable:" + filepath);
        File dir = new File (filepath);
        File[] files = dir.listFiles();

        AugmentedImageDatabase aid = new AugmentedImageDatabase(session);

        for (int i = 0; i < files.length; i++)
        {
            if (files[i].getName().startsWith("arimage"))
            {
                String filename = files[i].getName ();
                Log.d ("AID", "FileName:" + files[i].getName ());
                Bitmap arcontentBitmap =loadAugmentedImage(files[i]);
                Log.d ("AID", "Files:" + files[i].getPath ());
                String imagename = filename.substring(0, filename.length() - 4);
                Log.d ("AID", "NameImage:" + imagename);

                aid.addImage(imagename, arcontentBitmap);

            }

        }
        config.setAugmentedImageDatabase(aid);
    }

Метод loadAugmentedImage

private Bitmap loadAugmentedImage(File file)
    {
        try (InputStream is = new FileInputStream (file))
        {
            return BitmapFactory.decodeStream(is);
        }
        catch (IOException e)
        {
            Log.e("ImageLoad", "IO Exception", e);
        }
        return null;
    }

Ответы [ 2 ]

0 голосов
/ 26 марта 2019

Я изменил размер буфера с 1024 до 4096 загруженного файла и распаковал метод. Я добавил полный путь к изображениям в свой метод loadAugmentedImage.

public void setupDatabase(Config config, Session session) 
{
        AugmentedImageDatabase aid = new AugmentedImageDatabase(session);
        Intent intent = getIntent ();
        String filepath = intent.getStringExtra ("filepath");
        Log.d ("AID", "Veriable:" + filepath);
        File directory = new File (filepath);
        File[] files = directory.listFiles ();
        Log.d ("AID", "Size: " + files.length);
        for (int i = 0; i < files.length; i++)
        {

            if (files[i].getName().startsWith("arimage"))
            {
                String filename = files[i].getName ();
                Log.d ("AID", "FileName:" + filename);
                Bitmap arcontentBitmap = loadAugmentedImage(files[i].getPath ());
                Log.d ("AID", "FilePath:" + files[i].getPath ());
                Log.d ("AID", "Files:" + files[i].getAbsolutePath ());
                String imagename = filename.substring(0, filename.length() - 4);
                Log.d ("AID", "NameImage:" + imagename);
                aid.addImage(imagename, arcontentBitmap);
            }
        }
        config.setAugmentedImageDatabase(aid);
}

Метод loadAugmentedImage

private Bitmap loadAugmentedImage(String file)
    {
        try (InputStream is = new FileInputStream (file))
        {
            return BitmapFactory.decodeStream(is);
        }
        catch (IOException e)
        {
            Log.e("loadAugmentedImage", "IO Exception", e);
        }
        return null;
    }
0 голосов
/ 23 марта 2019

Попробуйте заменить InputStream is = new FileInputStream (file) на InputStream is = getAssets().open(file)

Я вижу, что вы создаете новую базу данных изображений и затем загружаете все изображения.Это не очень хорошая практика, потому что загрузка одного изображения занимает около 30 мс.Поэтому, если вам нужны все эти изображения с самого начала, вам следует загрузить базу данных изображений во время компиляции.Вы должны использовать arcoreimg для создания базы данных, эта опция также имеет возможность установить размер изображения в реальном мире, что помогает при обнаружении.Чем загружать базу данных только с:

AugmentedImageDatabase augmentedImageDatabase = new AugmentedImageDatabase(session);
    try(InputStream inputStream = getAssets().open("imgdatabase.imgdb")){
        augmentedImageDatabase = AugmentedImageDatabase.deserialize(session, inputStream);
    } catch (IOException e) {
        Log.e(TAG, "IO exception loading augmented image database.", e);
        e.printStackTrace();
    }
    config.setAugmentedImageDatabase(augmentedImageDatabase);

Но не загружайте изображения, которые вам не нужны, в начале приложения.Потому что ваше приложение будет пытаться обнаружить все изображения, и это может сильно повлиять на производительность.

...