ArToolkit、Android和2D标记

ArToolkit、Android和2D标记,android,android-studio,java-native-interface,artoolkit,Android,Android Studio,Java Native Interface,Artoolkit,我在使用带有二维条形码的ArCode时遇到了一些问题。 我正在使用Android和ArToolkit 我识别“Hiro”标记或“kanji”没有问题。 有时,artoolkit会将“0”条形码与“hiro”混淆,但这不是问题所在,问题在于我无法以我尝试过的任何方式识别二维条形码 这是我的代码: if (!ARToolKit.getInstance().initialiseNative(this.getCacheDir().getAbsolutePath()) || !ARTool

我在使用带有二维条形码的ArCode时遇到了一些问题。 我正在使用Android和ArToolkit

我识别“Hiro”标记或“kanji”没有问题。 有时,artoolkit会将“0”条形码与“hiro”混淆,但这不是问题所在,问题在于我无法以我尝试过的任何方式识别二维条形码

这是我的代码:

if (!ARToolKit.getInstance().initialiseNative(this.getCacheDir().getAbsolutePath()) ||
        !ARToolKit.getInstance().initialiseAR(640, 480, "Data/camera_para.dat", 0, false)) {
    Log.e("MainActivity", "errore di inizializzazione");
    return;
}
_markerID = ARToolKit.getInstance().addMarker("single_barcode;0;40");
如果我使用:

单色条形码;0;10 ... 单色条形码;0;八十

显然,与之相反:

   _markerID = ARToolKit.getInstance().addMarker("single;Data/patt.hiro;10");
它起作用了

我尝试过aldo创建一个类似于hiro(patt.hiro)和kanji(patt.kanji)的文件。 所以,我创建了一个code.dat

1

00
40.0
1.0000  0.0000  0.0000    0.0000
0.0000  1.0000  0.0000    0.0000
0.0000  0.0000  1.0000    0.0000
对于“0”条形码

_markerID = ARToolKit.getInstance().addMarker("single;Data/code.dat;40");
同样,如果我使用:

单一的;数据/代码.dat;10 .. 单一的;数据/代码.dat;八十

但还是什么都没有

我在android中找不到任何有效的例子,也找不到任何有说服力的手册


我错在哪里

正如我在另一个问题中提到的,资产文件夹中的所有内容都由ARToolkit缓存,当您添加新标记时,您需要增加应用程序的版本号或卸载它

您不需要重新编译NDK来添加新标记

此外,字符串格式非常重要:

默认值为:

_markerID = ARToolKit.getInstance().addMarker("single;Data/patt.hiro;10");
对于您正在使用的标记:

_markerID = ARToolKit.getInstance().addMarker("single_barcode;0;40");
定义标记的字符串应为: “单个;数据/单个条形码;40”

其中(如本页所述)参数指:

  • single表示它是一个标记
  • Data/single_barcode是资产文件夹中文件的路径(假设您将其与hiro和kanji文件放在同一目录中)
  • 40是现实世界中标记的大小,单位为毫米

我同意ARToolkit的文档需要改进。

正如我在另一个问题中提到的,资产文件夹中的所有内容都由ARToolkit缓存,当您添加新标记时,您需要增加应用程序的版本号或卸载它

您不需要重新编译NDK来添加新标记

此外,字符串格式非常重要:

默认值为:

_markerID = ARToolKit.getInstance().addMarker("single;Data/patt.hiro;10");
对于您正在使用的标记:

_markerID = ARToolKit.getInstance().addMarker("single_barcode;0;40");
定义标记的字符串应为: “单个;数据/单个条形码;40”

其中(如本页所述)参数指:

  • single表示它是一个标记
  • Data/single_barcode是资产文件夹中文件的路径(假设您将其与hiro和kanji文件放在同一目录中)
  • 40是现实世界中标记的大小,单位为毫米

我同意ARToolkit的文档需要改进。

谢谢Shalafi,我已经尝试过了,但没有任何效果。 我发现了一个日文页面,他们说你必须改变一个参数并重新编译C++中的整个ArToolkit,以便让它识别2D代码。 但是像hiro这样的ora 2d代码或Arcode

有人有更详细的说明吗

日文版如下:
(我已经用谷歌翻译工具翻译过了)

谢谢沙拉菲,我已经试过了,但什么也没发生。 我发现了一个日文页面,他们说你必须改变一个参数并重新编译C++中的整个ArToolkit,以便让它识别2D代码。 但是像hiro这样的ora 2d代码或Arcode

有人有更详细的说明吗

日文版如下:
(我已经用google translator翻译过了)

Android中ARToolkit的2D条形码在任何公共文档中都不可用。但是,如果您直接参考ARWrapper源代码。我发现它可以通过NativeInterface和ARToolkit获得

下面是我在Android应用程序中使用的一个工作示例

首先,在检测初始化中执行类似的操作

NativeInterface.arwSetPatternDetectionMode(NativeInterface.AR_MATRIX_CODE_DETECTION);
NativeInterface.arwSetMatrixCodeType(NativeInterface.AR_MATRIX_CODE_3x3_PARITY65);
markerID = ARToolKit.getInstance().addMarker("single_barcode;0;80");
对于二维条码(矩阵代码)检测,必须将模式检测模式设置为
AR\u Matrix\u code\u detection
。有关不同矩阵代码类型的详细信息,请参阅官方文档。我使用的是github存储库中/artoolkit5/doc/patterns下提供的默认值

单个条形码检测的配置字符串使用以下格式,
“single_barcode;;”

其余部分应与使用模式标记相同。为了澄清起见,在调用从ARActivity继承的活动中的
ARToolKit.getInstance().convertAndDetect(frame)
之后,您可以像往常一样使用
ARToolKit.getInstance().queryMarkerVisible(markerID)
查询它的可见性

参考资料


在任何公共文档中都没有关于Android中ARToolkit的2D条形码用法的信息。但是,如果您直接参考ARWrapper源代码。我发现它可以通过NativeInterface和ARToolkit获得

下面是我在Android应用程序中使用的一个工作示例

首先,在检测初始化中执行类似的操作

NativeInterface.arwSetPatternDetectionMode(NativeInterface.AR_MATRIX_CODE_DETECTION);
NativeInterface.arwSetMatrixCodeType(NativeInterface.AR_MATRIX_CODE_3x3_PARITY65);
markerID = ARToolKit.getInstance().addMarker("single_barcode;0;80");
对于二维条码(矩阵代码)检测,必须将模式检测模式设置为
AR\u Matrix\u code\u detection
。有关不同矩阵代码类型的详细信息,请参阅官方文档。我使用的是github存储库中/artoolkit5/doc/patterns下提供的默认值

单个条形码检测的配置字符串使用以下格式,
“single_barcode;;”

其余部分应与使用模式标记相同。为了澄清起见,在调用从ARActivity继承的活动中的
ARToolKit.getInstance().convertAndDetect(frame)
之后,您可以像往常一样使用
ARToolKit.getInstance().queryMarkerVisible(markerID)
查询它的可见性

参考资料


我个人赞成让NDK单独行动。我已经成功地将jPCT AE链接到ARToolkit,但在编写deta之前,我仍然需要解决一些偏移问题