- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在尝试估计我的设备在空间中与二维码相关的位置。我正在使用 iOS11 中引入的 ARKit 和 Vision 框架,但这个问题的答案可能不取决于它们。
借助 Vision 框架,我能够在相机框架中获取限定 QR 码的矩形。我想将此矩形与从标准位置转换 QR 码所需的设备平移和旋转相匹配。
例如,如果我观察框架:
* *
B
C
A
D
* *
如果我距离 QR 码 1 米,以它为中心,假设 QR 码有 10 厘米的边,我会看到:
* *
A0 B0
D0 C0
* *
这两个框架之间我的设备转换是什么?我知道可能无法获得准确的结果,因为观察到的 QR 码可能略微不是平面的,而我们正试图在不完美的事物上估计仿射变换。
我想 sceneView.pointOfView?.camera?.projectionTransform
比 sceneView.pointOfView?.camera?.projectionTransform?.camera.projectionMatrix
更有帮助,因为后来已经考虑了从 ARKit 推断出的转换,我对此问题不感兴趣。
我要怎么填写
func get transform(
qrCodeRectangle: VNBarcodeObservation,
cameraTransform: SCNMatrix4) {
// qrCodeRectangle.topLeft etc is the position in [0, 1] * [0, 1] of A0
// expected real world position of the QR code in a referential coordinate system
let a0 = SCNVector3(x: -0.05, y: 0.05, z: 1)
let b0 = SCNVector3(x: 0.05, y: 0.05, z: 1)
let c0 = SCNVector3(x: 0.05, y: -0.05, z: 1)
let d0 = SCNVector3(x: -0.05, y: -0.05, z: 1)
let A0, B0, C0, D0 = ?? // CGPoints representing position in
// camera frame for camera in 0, 0, 0 facing Z+
// then get transform from 0, 0, 0 to current position/rotation that sees
// a0, b0, c0, d0 through the camera as qrCodeRectangle
}
====编辑====
在尝试了很多东西之后,我最终使用 openCV 投影和透视求解器进行相机姿势估计,solvePnP
这给了我一个旋转和平移,应该代表 QR 码引用中的相机姿势.然而,当使用这些值并放置对应于逆变换的对象时,QR 码应该在相机空间中,我得到不准确的移位值,并且我无法使旋转工作:
// some flavor of pseudo code below
func renderer(_ sender: SCNSceneRenderer, updateAtTime time: TimeInterval) {
guard let currentFrame = sceneView.session.currentFrame, let pov = sceneView.pointOfView else { return }
let intrisics = currentFrame.camera.intrinsics
let QRCornerCoordinatesInQRRef = [(-0.05, -0.05, 0), (0.05, -0.05, 0), (-0.05, 0.05, 0), (0.05, 0.05, 0)]
// uses VNDetectBarcodesRequest to find a QR code and returns a bounding rectangle
guard let qr = findQRCode(in: currentFrame) else { return }
let imageSize = CGSize(
width: CVPixelBufferGetWidth(currentFrame.capturedImage),
height: CVPixelBufferGetHeight(currentFrame.capturedImage)
)
let observations = [
qr.bottomLeft,
qr.bottomRight,
qr.topLeft,
qr.topRight,
].map({ (imageSize.height * (1 - $0.y), imageSize.width * $0.x) })
// image and SceneKit coordinated are not the same
// replacing this by:
// (imageSize.height * (1.35 - $0.y), imageSize.width * ($0.x - 0.2))
// weirdly fixes an issue, see below
let rotation, translation = openCV.solvePnP(QRCornerCoordinatesInQRRef, observations, intrisics)
// calls openCV solvePnP and get the results
let positionInCameraRef = -rotation.inverted * translation
let node = SCNNode(geometry: someGeometry)
pov.addChildNode(node)
node.position = translation
node.orientation = rotation.asQuaternion
}
这是输出:
其中 A、B、C、D 是按传递给程序的顺序排列的 QR 码角。
当手机旋转时,预测的原点保持不变,但它偏离了应有的位置。令人惊讶的是,如果我改变观察值,我能够更正这个:
// (imageSize.height * (1 - $0.y), imageSize.width * $0.x)
// replaced by:
(imageSize.height * (1.35 - $0.y), imageSize.width * ($0.x - 0.2))
现在预测的起源稳固地保持在原位。但是我不明白移位值从何而来。
最后,我尝试相对于 QR 码引用固定方向:
var n = SCNNode(geometry: redGeometry)
node.addChildNode(n)
n.position = SCNVector3(0.1, 0, 0)
n = SCNNode(geometry: blueGeometry)
node.addChildNode(n)
n.position = SCNVector3(0, 0.1, 0)
n = SCNNode(geometry: greenGeometry)
node.addChildNode(n)
n.position = SCNVector3(0, 0, 0.1)
当我直视 QR 码时,方向很好,但随后它发生了一些似乎与手机旋转有关的变化:
我有 Unresolved 问题是:
如果这有帮助,这里有一些数值:
Intrisics matrix
Mat 3x3
1090.318, 0.000, 618.661
0.000, 1090.318, 359.616
0.000, 0.000, 1.000
imageSize
1280.0, 720.0
screenSize
414.0, 736.0
==== 编辑2 ====
我注意到当手机与 QR 码保持水平平行时旋转效果很好(即旋转矩阵为 [[a, 0, b], [0, 1, 0], [c, 0, d]]),不管二维码的实际方向是什么:
其他旋转不起作用。
最佳答案
考虑到 Vision
/CoreML
坐标系与 ARKit
/SceneKit
坐标系不对应.详情看this post .
我想问题不在矩阵中。它位于顶点位置。要跟踪 2D 图像,您需要逆时针放置 ABCD 顶点(起点是位于假想原点 x:0, y:0
的 A 顶点)。我认为关于 VNRectangleObservation 的 Apple 文档类(关于图像分析请求检测到的投影矩形区域的信息)是模糊的。您放置顶点的顺序与官方文档中的顺序相同:
var bottomLeft: CGPoint
var bottomRight: CGPoint
var topLeft: CGPoint
var topRight: CGPoint
但它们的放置方式与笛卡尔坐标系中出现的正旋转方向(关于 Z
轴)相同:
ARKit(以及 SceneKit 和 Vision)中的世界坐标空间始终遵循 右手惯例
(正 Y
轴指向上方,正 Z
轴指向观察者,正向 X
轴指向观察者的右侧),但方向取决于 session 的配置。相机在局部坐标空间中工作。
绕任何轴的旋转方向为正(逆时针)和负(顺时针)。对于 ARKit 和 Vision 中的跟踪,这一点至关重要。
旋转的顺序也是有道理的。 ARKit 和 SceneKit 以组件的相反顺序应用相对于节点的 pivot 属性的旋转:首先是 roll
(关于 Z
轴),然后是 yaw
(关于 Y
轴),然后是 pitch
(关于 X
轴)。所以旋转顺序是ZYX
。
关于augmented-reality - iOS 还原相机投影,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44579839/
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 8年前关闭。 Improve thi
Closed. This question needs to be more focused。它当前不接受答案。 想要改善这个问题吗?更新问题,使它仅关注editing this post的一个问题。
我正在构建在水上呈现内容的移动应用程序。 我想使用 AR - 3D 内容和位置标记来呈现内容。 在那种情况下,表面检测是不可能的——告诉我我错了。 另一方面,水的重力确保了表面的平整度。 有没有办法手
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 3 年前。 Improve this qu
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 11 年前
我对 AR 完全陌生,我在互联网上搜索了基于标记和无标记的 AR,但我对基于标记和无标记的 AR 感到困惑。 让我们假设一个 AR 应用程序在扫描特定图像时触发 AR Action ..所以是基于标记
默认情况下,对象混合处于开启状态,您必须点击按钮才能关闭。 大多数使用我的 AR 的人都是第一次使用,不知道如何关闭它。 有没有办法默认关闭它?我在文档中没有看到解决方案。
我需要在 OS X 上使用 C/C++、python 或 MATLAB 检测单个图像中的增强现实标记(或者至少是保存在磁盘上的视频,而不是实时捕获的视频)。 我试过 ARToolKit,但从磁盘读取视
是否可以使用普通网络摄像头实时进行“无标记运动捕捉”?有没有可用的开源框架? 我需要构建一个 3d 模型,该模型将使用捕获的数据进行动画处理。 最佳答案 您可以从 The Artvertiser 开始
我正在阅读 JavaScript:The Good Parts 并找到以下示例。我试图更改给定的示例,但出现错误。这有效: Function.prototype.method = function(n
当一个真实世界的物体位于它前面时,我正在尝试隐藏虚拟物体,但没有任何运气,我一直在玩统一的遮挡设置,但虚拟物体不会变成隐藏? 最佳答案 您可以通过在启用实验性网格划分的情况下构建增强现实场景来解决此问
我的目标是将 Material /纹理叠加在我将拥有相同 3d 模型的物理对象(它将是建筑模型)上。该模型将是静态的(如果有帮助,则在 table 上),但我显然想从任何一侧查看对象。我的物理模型的占
ARCore 在兼容手机中使用哪些传感器:单摄像头、双摄像头、IMU 等? 此外,如果传感器无法通过切换到其自身精度较低的版本而无法使用,ARCore 的动态是否足以继续工作? 最佳答案 更新日期:2
我正在关注ARCORE AUGMENTED FACES iOS SDK。内置的fox_face.scn对我来说很好。 现在,我们在Blender中创建了一些3d模型,并以.dae或.obj格式导出它们
关于如何为 Augmented Faces 创建自定义 3D 模型,我正在尝试遵循以下指南但出于某种原因,我的模型确实超出了我的理解范围。 我的模型也在 0 x、y 和 z 轴上。对于我使用的代码 t
所以,我需要一个单例。它确实是一个相当大的“做某事”对象。处理信息等..它可以扩展,并且某些方法可以甚至可能被继承,但总的来说,不需要存在多个方法。所以,我在这里读了一些我喜欢这个概念的内容:http
有时您会发现自己编写了一些头代码,这些代码实际上可以很好地适合 C++ 标准库。举个例子:disable_if 模板,与 std::enable_if 相反. 我不想把它放在全局命名空间中。但是惯例是
我正在尝试估计我的设备在空间中与二维码相关的位置。我正在使用 iOS11 中引入的 ARKit 和 Vision 框架,但这个问题的答案可能不取决于它们。 借助 Vision 框架,我能够在相机框架中
我正在使用 ARCore 构建一个应用程序,我想在其中显示来自服务器的图像。我不想使用 obj、.smf、imgdb 文件和 3D 图像。我已经提到了很多链接,但没有一个链接显示如何使用 Arcore
新的现实套件相机变换似乎具有误导性。当我将实体的变换设置为相机的变换时,它不会跟随屏幕的前方,而是始终靠近世界原点。 scnview中曾经有pointOfView。我应该怎么做才能产生相同的效果 最佳
我是一名优秀的程序员,十分优秀!