AugmentedImageDatabase Arcore:添加多张图片
AugmentedImageDatabase Arcore: add multiple images
我有包含图像的文件夹,但我无法将它们添加到数据库中。他们有特定的名字。应用程序显示 "AR session failed" 这是我的代码:
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;
}
尝试将 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);
但是不要在应用的开头加载不需要的图片。因为您的应用程序将尝试检测所有图像,这会对性能产生重大影响。
我将缓冲区的大小从 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;
}
我有包含图像的文件夹,但我无法将它们添加到数据库中。他们有特定的名字。应用程序显示 "AR session failed" 这是我的代码:
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;
}
尝试将 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);
但是不要在应用的开头加载不需要的图片。因为您的应用程序将尝试检测所有图像,这会对性能产生重大影响。
我将缓冲区的大小从 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;
}