我想知道是否可以将ARToolkit用于Android包装中的单个图像检测?例如:从图库中选择图像或使用相机捕获图像,然后将字节发送到ARToolkit进行标记识别?
最佳答案
是的,这很有可能,我已经做过了,但是方式有所不同。
我已将ARToolkit库集成到ARCore的github repo的示例ARCore应用程序(hello_ar_java)中,我使用artoolkitx进行图像检测,因为它的检测速度非常快。
在hello_ar_java应用程序中,有一个openGL函数onDrawFrame()会在每次更改帧时调用,这里我从ARCore会话更新接收到的帧将转换为image(jpeg)文件并写入磁盘。
ARToolkit Java包装器在ARX_jni.java中具有方法arwStartRunning()
,该方法接受视频配置和摄像机参数作为方法参数。
您的任务是,在Java包装器中有一个ARController.java
类,在该类中编写一个方法来调用arwStartRunning()
的ARX_jni.java
例如。
public boolean startRunning(String cfg) {
if (!ARX_jni.arwStartRunning(cfg, null)) {
Log.e(TAG, "StartRunning command failed.");
return false;
}
Log.e(TAG, "StartRunning command passed.");
return true;
}
现在重建ARToolkit库,并将新的
arxj-release.aar
文件添加到您的应用程序中。从您的android应用代码中,通过将配置传递为来调用startRunning()方法
String cfg = "-module=Image -width=" + imageWidth + " -height=" + imageHeight + " -image=" + imageAbsolutePath;
boolean runStatus = ARController.getInstance().startRunning(cfg);
if (runStatus) {
if (!ARController.getInstance().captureAndUpdate()) {
Log.e(TAG, "ARController update call failed, skip going further.");
return;
} else Log.d(TAG, "vaib: ARController update call passed");
for (int trackableUID : trackableUIDs) {
float[] modelViewMatrix = new float[16];
if (ARController.getInstance().queryTrackableVisibilityAndTransformation(trackableUID, modelViewMatrix)) {
float[] projectionMatrix = ARController.getInstance().getProjectionMatrix(10.0f, 10000.0f);
Log.e(TAG, "Trackable "+trackableUID +" is visible.");
runOnUiThread(() -> showToast("Trackable "+trackableUID +" is visible."));
} else Log.e(TAG, "Trackable "+trackableUID +" is not visible");
}
} else Log.e(TAG, "Failed to start ARToolkit, config used : " + cfg);