小编ale*_*nik的帖子

基于4个共面点计算具有单应矩阵的相机姿态

我在视频(或图像)中有4个共面点代表一个四边形(不一定是方形或矩形),我希望能够在它们顶部显示一个虚拟立方体,其中立方体的角正好位于角落视频四边形.

由于这些点是共面的,我可以计算单位平方的角(即[0,0] [0,1] [1,0] [1,1])和四边形的视频坐标之间的单应性.

根据这个单应性,我应该能够计算出正确的相机姿势,即[R | t],其中R是3x3旋转矩阵,t是3x1平移向量,因此虚拟立方体位于视频四边形上.

我已经阅读了很多解决方案(其中一些是关于SO的)并试图实现它们,但它们似乎仅在一些"简单"的情况下工作(例如当视频四边形是正方形时)但在大多数情况下不起作用.

以下是我尝试过的方法(大多数是基于相同的原理,只是翻译的计算略有不同).设K是摄像机的内在矩阵,H是单应性.我们计算:

A = K-1 * H
Run Code Online (Sandbox Code Playgroud)

设a1,a2,a3为A和r1,r2,r3的列向量,即旋转矩阵R的列向量.

r1 = a1 / ||a1||
r2 = a2 / ||a2||
r3 = r1 x r2
t = a3 / sqrt(||a1||*||a2||)
Run Code Online (Sandbox Code Playgroud)

问题是在大多数情况下这不起作用.为了检查我的结果,我将R和t与OpenCV的solvePnP方法获得的结果进行了比较(使用以下3D点[0,0,0] [0,1,0] [1,0,0] [1,1 ,0]).

由于我以相同的方式显示立方体,我注意到在每种情况下solvePnP都提供了正确的结果,而从单应性中获得的姿势大多是错误的.

理论上,因为我的点是共面的,所以可以从单应性计算姿势,但是我找不到从H计算姿势的正确方法.

我对错误的看法有何见解?

尝试@Jav_Rock的方法后编辑

嗨Jav_Rock,非常感谢你的答案,我尝试了你的方法(以及其他许多方法)似乎或多或少都可以.然而,在基于4个共面点计算姿势时,我仍然遇到一些问题.为了检查结果,我将与solvePnP的结果进行比较(由于迭代重投影误差最小化方法,这将更好).

这是一个例子:

立方体

  • 黄色立方体:解决PNP
  • Black Cube:Jav_Rock的技巧
  • 青色(和紫色)立方体:一些其他技术给出完全相同的结果

正如你所看到的,黑色立方体或多或少都可以,但看起来并不均匀,尽管矢量看似正交.

EDIT2:我在计算它之后对v3进行了规范化(为了强制执行正交性),它似乎也解决了一些问题.

opencv computer-vision homography augmented-reality

44
推荐指数
4
解决办法
3万
查看次数

从单应性或使用solvePnP()函数估计相机姿势

我正在尝试在照片上构建静态增强现实场景,在平面和图像上的共面点之间有4个定义的对应关系.

这是一步一步的流程:

  1. 用户使用设备的相机添加图像.我们假设它包含一个用透视图捕获的矩形.
  2. 用户定义矩形的物理尺寸,它位于水平平面(根据SceneKit的YOZ).让我们假设它的中心是世界的起源(0,0,0),所以我们可以很容易地找到每个角的(x,y,z).
  3. 用户在图像坐标系中为矩形的每个角定义uv坐标.
  4. SceneKit场景使用相同大小的矩形创建,并以相同的透视可见.
  5. 可以在场景中添加和移动其他节点.

流

我还测量了iphone相机相对于A4纸中心的位置.所以对于这个镜头,位置是(0,14,42.5),以cm为单位测量.我的iPhone也稍微倾斜到桌子上(5-10度)

使用这些数据我已设置SCNCamera为在第三张图像上获得蓝色平面的所需视角:

let camera = SCNCamera()
camera.xFov = 66
camera.zFar = 1000
camera.zNear = 0.01

cameraNode.camera = camera
cameraAngle = -7 * CGFloat.pi / 180
cameraNode.rotation = SCNVector4(x: 1, y: 0, z: 0, w: Float(cameraAngle))
cameraNode.position = SCNVector3(x: 0, y: 14, z: 42.5)
Run Code Online (Sandbox Code Playgroud)

这将为我提供比较我的结果的参考.

为了使用SceneKit构建AR,我需要:

  1. 调整SCNCamera的fov,使其与真实相机的fov相匹配.
  2. 使用世界点(x,0,z)和图像点(u,v)之间的4个相关误差计算相机节点的位置和旋转

方程

H - 单应性; K - 内在矩阵; [R | t] - 外在矩阵

我尝试了两种方法来找到相机的变换矩阵:使用OpenCV中的solvePnP和基于4个共面点的单应性手动计算.

手动方式:

1.找出单应性

单应

此步骤已成功完成,因为世界原点的UV坐标似乎是正确的.

2.内在矩阵

为了获得iPhone 6的内在矩阵,我使用了这个应用程序,它给出了100个640*480分辨率图像中的以下结果:

固有

假设输入图像具有4:3的宽高比,我可以根据分辨率缩放上述矩阵

Intrinsic2

我不确定,但感觉这是一个潜在的问题.我用cv :: calibrationMatrixValues来检查fovx的计算内在矩阵,结果是~50°,而它应该接近60°. …

opencv homography augmented-reality ios scenekit

12
推荐指数
1
解决办法
3122
查看次数

Swift 3:如何将struct转换为Parameters

我有struct如下

struct UserInfo
{
    var userId : Int
    var firstName : String
    var lastName : String
}
Run Code Online (Sandbox Code Playgroud)

如何序列化UserInfo要键入的实例Parameters

var user = UserInfo(userId: 1, firstName: "John", lastName: "Skew")

// Convert user to Parameters for Alamofire
Alamofire.request("https://httpbin.org/post", parameters: parameters)
Run Code Online (Sandbox Code Playgroud)

serialization ios swift

11
推荐指数
2
解决办法
5911
查看次数

带有阴影和圆角边缘的 ContainerView

我想创建带有阴影和圆角边缘的自定义 ContainerView。这个 ContainerView 是放置在另一个 UIView 顶部的小矩形形式。在这种特殊情况下,附加层或使用 CoreGraphics 绘制阴影都无济于事。

在此处输入图片说明

uiview dropshadow ios uicontainerview swift

5
推荐指数
1
解决办法
2557
查看次数

CGPointZero和CGContextDrawImage不可用

我无法转换CGContextDrawImage为swift 3,我尝试了context.draw,但它不起作用.那里有人可以给我一个反馈

错误截图

码:

import UIKit

public struct Pixel {
public var value: UInt32

public var red: UInt8 {
    get {
        return UInt8(value & 0xFF)
    }
    set {
        value = UInt32(newValue) | (value & 0xFFFFFF00)
    }
}

public var green: UInt8 {
    get {
        return UInt8((value >> 8) & 0xFF)
    }
    set {
        value = (UInt32(newValue) << 8) | (value & 0xFFFF00FF)
    }
}

public var blue: UInt8 {
    get {
        return UInt8((value >> 16) & 0xFF)
    }
    set { …
Run Code Online (Sandbox Code Playgroud)

ios cgcontextdrawimage swift3

4
推荐指数
1
解决办法
2560
查看次数

触摸位置在UIButton行动

我正在尝试获取按钮被点击的位置(x,y).我找到了答案,但它们不适用于Swift 2.3.有什么建议?这就是我尝试过的:

 @IBAction func buttonTapped(sender: AnyObject, forEvent event: UIEvent) {    
    let buttonView = sender as! UIView;    

    // get any touch on the buttonView
    if let touch = event.touchesForView(buttonView) as? UITouch{
        // print the touch location on the button
        print(touch.locationInView(buttonView))
    }
}
Run Code Online (Sandbox Code Playgroud)

uibutton uitouch ibaction ios swift

2
推荐指数
1
解决办法
1588
查看次数