# 影像辨識
產生圖像資料庫
``` private boolean setupAugmentedImageDatabase(Config config) {
AugmentedImageDatabase augmentedImageDatabase;
// There are two ways to configure an AugmentedImageDatabase: 兩種方法配置:AugmentedImageDatabase
// 1. Add Bitmap to DB directly 直接將圖添加到數據庫
// 2. Load a pre-built AugmentedImageDatabase 加載預建的 AugmentedImageDatabase
// Option 2) has
// * shorter setup time 設置時間更短
// * doesn't require images to be packaged in apk. 不需要將圖像打包為apk
if (useSingleImage) {
Bitmap augmentedImageBitmap = loadAugmentedImageBitmap();
if (augmentedImageBitmap == null) {
return false;
}
augmentedImageDatabase = new AugmentedImageDatabase(session);
augmentedImageDatabase.addImage("70", augmentedImageBitmap); //新增圖像
// augmentedImageDatabase.addImage("default", augmentedImageBitmap);
// If the physical size of the image is known, you can instead use:
// augmentedImageDatabase.addImage("image_name", augmentedImageBitmap, widthInMeters);
// This will improve the initial detection speed. ARCore will still actively estimate the
// physical size of the image as it is viewed from multiple viewpoints.
} else {
// This is an alternative way to initialize an AugmentedImageDatabase instance, //初始化AugmentedImageDatabase
// load a pre-existing augmented image database. //加載預建的 AugmentedImageDatabase
try (InputStream is = getAssets().open("floor.imgdb")) {
augmentedImageDatabase = AugmentedImageDatabase.deserialize(session, is);
} catch (IOException e) {
Log.e("database", "IO exception loading augmented image database.", e);
return false;
}
}
config.setAugmentedImageDatabase(augmentedImageDatabase);
return true;
}
```
執行的動作
``` private void drawAugmentedImages(
Frame frame, float[] projmtx, float[] viewmtx, float[] colorCorrectionRgba) {
Collection<AugmentedImage> updatedAugmentedImages =
frame.getUpdatedTrackables(AugmentedImage.class);
// Iterate to update augmentedImageMap, remove elements we cannot draw.
for (AugmentedImage augmentedImage : updatedAugmentedImages) {
switch (augmentedImage.getTrackingState()) {
case PAUSED://靜止圖片 但人在動
// When an image is in PAUSED state, but the camera is not PAUSED, it has been detected,
// but not yet tracked.
if(augmentedImage.getIndex() == 1) {
Log.e("pausedR:", "pausedRok");
bug = "1" ;
check="1";
blocation = new LatLng(24.98970994546, 121.54632728635);
NaviDo();
break;
}
if(augmentedImage.getIndex() == 0){
Log.e("pausedS:", "pausedSok");
bug = "1" ;
check="1";
blocation = new LatLng(24.98992479329, 121.54658377259);
NaviDo();
break;
}
String text = String.format("Detected Image %d", augmentedImage.getIndex());
messageSnackbarHelper.showMessage(this, text);
break;
case TRACKING://追蹤
// Have to switch to UI Thread to update View.
// Create a new anchor for newly found images.
break;
case STOPPED://停止
augmentedImageMap.remove(augmentedImage.getIndex());
break;
}
}
}
```
偵錯
```
private void configureSession() {
Config config = new Config(session);
// config.setFocusMode(Config.FocusMode.AUTO);
if (!setupAugmentedImageDatabase(config)) {
messageSnackbarHelper.showError(this, "Could not setup augmented image database");
}
session.configure(config);
}
```
從AugmentedImageDatabase找到圖片
```
private Bitmap loadAugmentedImageBitmap() {
try (
InputStream is = getAssets().open("70.jpg")) {
return BitmapFactory.decodeStream(is);
} catch (IOException e) {
Log.e("ImageBit", "IO exception loading augmented image bitmap.", e);
}
return null;
}
```