我想知道是否可以将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);

10-01 23:45