- 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/
IO 设备如何知道属于它的内存中的值在memory mapped IO 中发生了变化? ? 例如,假设内存地址 0 专用于保存 VGA 设备的背景颜色。当我们更改 memory[0] 中的值时,VGA
我目前正在开发一个使用Facebook sdk登录(通过FBLoginView)的iOS应用。 一切正常,除了那些拥有较旧版本的facebook的人。 当他们按下“使用Facebook登录”按钮时,他
假设我有: this - is an - example - with some - dashesNSRange将使用`rangeOfString:@“-”拾取“-”的第一个实例,但是如果我只想要最后
Card.io SDK提供以下详细信息: 卡号,有效期,月份,年份,CVV和邮政编码。 如何从此SDK获取国家名称。 - (void)userDidProvideCreditCardInfo:(Car
iOS 应用程序如何从网络服务下载图片并在安装过程中将它们安装到用户的 iOS 设备上?可能吗? 最佳答案 您无法控制应用在用户设备上的安装,因此无法在安装过程中下载其他数据。 只需在安装后首次启动应
我曾经开发过一款企业版 iOS 产品,我们公司曾将其出售给大型企业,供他们的员工使用。 该应用程序通过 AppStore 提供,企业用户获得了公司特定的配置文件(包含应用程序配置文件)以启用他们有权使
我正在尝试将 Card.io SDK 集成到我的 iOS 应用程序中。我想为 CardIO ui 做一个简单的本地化,如更改取消按钮标题或“在此保留信用卡”提示文本。 我在 github 上找到了这个
我正在使用 CardIOView 和 CardIOViewDelegate 类,没有可以设置为 YES 的 BOOL 来扫描 collectCardholderName。我可以看到它在 CardIOP
我有一个集成了通话工具包的 voip 应用程序。每次我从我的 voip 应用程序调用时,都会在 native 电话应用程序中创建一个新的最近通话记录。我在 voip 应用程序中也有自定义联系人(电话应
iOS 应用程序如何知道应用程序打开时屏幕上是否已经有键盘?应用程序运行后,它可以接收键盘显示/隐藏通知。但是,如果应用程序在分屏模式下作为辅助应用程序打开,而主应用程序已经显示键盘,则辅助应用程序不
我在模拟器中收到以下错误: ImageIO: CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedIm
如 Apple 文档所示,可以通过 EAAccessory Framework 与经过认证的配件(由 Apple 认证)进行通信。但是我有点困惑,因为一些帖子告诉我它也可以通过 CoreBluetoo
尽管现在的调试器已经很不错了,但有时找出应用程序中正在发生的事情的最好方法仍然是古老的 NSLog。当您连接到计算机时,这样做很容易; Xcode 会帮助弹出日志查看器面板,然后就可以了。当您不在办公
在我的 iOS 应用程序中,我定义了一些兴趣点。其中一些有一个 Kontakt.io 信标的名称,它绑定(bind)到一个特定的 PoI(我的意思是通常贴在信标标签上的名称)。现在我想在附近发现信标,
我正在为警报提示创建一个 trigger.io 插件。尝试从警报提示返回数据。这是我的代码: // Prompt + (void)show_prompt:(ForgeTask*)task{
您好,我是 Apple iOS 的新手。我阅读并搜索了很多关于推送通知的文章,但我没有发现任何关于 APNS 从 io4 到 ios 6 的新更新的信息。任何人都可以向我提供 APNS 如何在 ios
UITabBar 的高度似乎在 iOS 7 和 8/9/10/11 之间发生了变化。我发布这个问题是为了让其他人轻松找到答案。 那么:在 iPhone 和 iPad 上的 iOS 8/9/10/11
我想我可以针对不同的 iOS 版本使用不同的 Storyboard。 由于 UI 的差异,我将创建下一个 Storyboard: Main_iPhone.storyboard Main_iPad.st
我正在写一些东西,我将使用设备的 iTunes 库中的一部分音轨来覆盖 2 个视频的组合,例如: AVMutableComposition* mixComposition = [[AVMutableC
我创建了一个简单的 iOS 程序,可以顺利编译并在 iPad 模拟器上运行良好。当我告诉 XCode 4 使用我连接的 iPad 设备时,无法编译相同的程序。问题似乎是当我尝试使用附加的 iPad 时
我是一名优秀的程序员,十分优秀!