我如何使用 ARCORE 从 ARScene 相机扫描二维码
How can i scan a qr code from ARScene Camera usin ARCORE
这里我需要一些建议或想要一种方法
场景:我想在 ar 场景中扫描二维码,当我扫描二维码时,二维码中有什么内容我将放在 ar 场景中,我不想使用 google vision 而不是我想使用下面的包但是下面的包打开相机而不是我想在它自己的AR场景中使用它
我用这个包进行二维码扫描https://github.com/zxing/zxing
下面是我的 ar 代码
public class MainActivity extends AppCompatActivity {
private ArFragment arFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.arFragment);
arFragment.setOnTapArPlaneListener((hitResult, plane, motionEvent) -> {
Anchor anchor = hitResult.createAnchor();
ModelRenderable.builder()
.setSource(this, Uri.parse("anchor.sfb"))
.build()
.thenAccept(modelRenderable -> addModelToScene(anchor,modelRenderable))
.exceptionally(throwable -> {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(throwable.getMessage()).show();
return null;
});
});
}
private void addModelToScene(Anchor anchor,ModelRenderable modelRenderable){
AnchorNode anchorNode = new AnchorNode(anchor);
TransformableNode transformableNode = new TransformableNode(arFragment.getTransformationSystem());
transformableNode.setParent(anchorNode);
transformableNode.setRenderable(modelRenderable);
arFragment.getArSceneView().getScene().addChild(anchorNode);
transformableNode.select();
}
}
我建议尝试现有的 Augmented Images feature in ARCore
你以为是二维码,AR软件看成是fiducial marker。这些标记需要事先知道。例如在 ARCore 页面上的视频中,这幅画是一个基准标记,它允许叠加 3D 图像。
我链接到的 ARCore 功能支持每个标记数据库最多 1000 个参考 images/markers,您可以创建和使用新的预定义标记数据库。
只要知道哪些二维码会产生3D效果,就可以在标记库中准备好。
如果您 want/need 想要使用 ARCore 生成动态 QR 码,我建议尝试为 QR 码创建基准 around/next 以便您可以扫描然后交给 AR Core 生成3d 图像,但可能无法工作,因为 QR 码可能与基准混合在一起都需要白色 space 才能工作。
如果你不能使用 ARCore,那么你就在 OpenCV 和各种场景引擎(3D 渲染器)如 Ogre 的世界里,或者你可以在 OpenGL ES 中绘制 AR 场景。
ARCore 为您提供框架或使用像 sceneform 这样的包装器。在 sceneform 中,您可以从 ARFragment 获取帧。
- 首先获取你的片段:
var arFragment = (supportFragmentManager.findFragmentById(R.id.your_ar_fragment) as ArFragment?)
arFragment.arSceneView?.scene?.addOnUpdateListener {
onUpdateFrame()
}
- 分析您的框架,例如阅读二维码
fun onUpdateFrame() = runBlocking {
launch {
analyze()
}
}
private fun analyze() {
frame = arFragment.arSceneView.arFrame
//Do fancy stuff with your frame, e.g. reading QR Codes
readingQRCodes(image)
}
private fun readingQRCodes() {
val mediaImage = InputImage.fromMediaImage(image, 0)
val scanner = BarcodeScanning.getClient()
scanner.process(mediaImage)
.addOnSuccessListener { qrCodes ->
//...
}
.addOnFailureListener {
//...
}
.addOnCompleteListener {
image.close()
}
}
当然你也可以使用ARCore库来获取相机帧。
这里我需要一些建议或想要一种方法
场景:我想在 ar 场景中扫描二维码,当我扫描二维码时,二维码中有什么内容我将放在 ar 场景中,我不想使用 google vision 而不是我想使用下面的包但是下面的包打开相机而不是我想在它自己的AR场景中使用它
我用这个包进行二维码扫描https://github.com/zxing/zxing
下面是我的 ar 代码
public class MainActivity extends AppCompatActivity {
private ArFragment arFragment;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.arFragment);
arFragment.setOnTapArPlaneListener((hitResult, plane, motionEvent) -> {
Anchor anchor = hitResult.createAnchor();
ModelRenderable.builder()
.setSource(this, Uri.parse("anchor.sfb"))
.build()
.thenAccept(modelRenderable -> addModelToScene(anchor,modelRenderable))
.exceptionally(throwable -> {
AlertDialog.Builder builder = new AlertDialog.Builder(this);
builder.setMessage(throwable.getMessage()).show();
return null;
});
});
}
private void addModelToScene(Anchor anchor,ModelRenderable modelRenderable){
AnchorNode anchorNode = new AnchorNode(anchor);
TransformableNode transformableNode = new TransformableNode(arFragment.getTransformationSystem());
transformableNode.setParent(anchorNode);
transformableNode.setRenderable(modelRenderable);
arFragment.getArSceneView().getScene().addChild(anchorNode);
transformableNode.select();
}
}
我建议尝试现有的 Augmented Images feature in ARCore
你以为是二维码,AR软件看成是fiducial marker。这些标记需要事先知道。例如在 ARCore 页面上的视频中,这幅画是一个基准标记,它允许叠加 3D 图像。
我链接到的 ARCore 功能支持每个标记数据库最多 1000 个参考 images/markers,您可以创建和使用新的预定义标记数据库。
只要知道哪些二维码会产生3D效果,就可以在标记库中准备好。
如果您 want/need 想要使用 ARCore 生成动态 QR 码,我建议尝试为 QR 码创建基准 around/next 以便您可以扫描然后交给 AR Core 生成3d 图像,但可能无法工作,因为 QR 码可能与基准混合在一起都需要白色 space 才能工作。
如果你不能使用 ARCore,那么你就在 OpenCV 和各种场景引擎(3D 渲染器)如 Ogre 的世界里,或者你可以在 OpenGL ES 中绘制 AR 场景。
ARCore 为您提供框架或使用像 sceneform 这样的包装器。在 sceneform 中,您可以从 ARFragment 获取帧。
- 首先获取你的片段:
var arFragment = (supportFragmentManager.findFragmentById(R.id.your_ar_fragment) as ArFragment?)
arFragment.arSceneView?.scene?.addOnUpdateListener {
onUpdateFrame()
}
- 分析您的框架,例如阅读二维码
fun onUpdateFrame() = runBlocking {
launch {
analyze()
}
}
private fun analyze() {
frame = arFragment.arSceneView.arFrame
//Do fancy stuff with your frame, e.g. reading QR Codes
readingQRCodes(image)
}
private fun readingQRCodes() {
val mediaImage = InputImage.fromMediaImage(image, 0)
val scanner = BarcodeScanning.getClient()
scanner.process(mediaImage)
.addOnSuccessListener { qrCodes ->
//...
}
.addOnFailureListener {
//...
}
.addOnCompleteListener {
image.close()
}
}
当然你也可以使用ARCore库来获取相机帧。