【问题标题】:create opencv camera matrix for iPhone 5 solvepnp为 iPhone 5 solvepnp 创建 opencv 相机矩阵
【发布时间】:2017-12-10 08:23:26
【问题描述】:

我正在使用 opencv 为 iPhone 开发一个应用程序。我必须使用方法solvePnPRansac:

http://opencv.willowgarage.com/documentation/cpp/camera_calibration_and_3d_reconstruction.html

对于这种方法,我需要提供一个相机矩阵:
__ __
| fx 0 cx |
| 0 年 |
|_0 0 1 _|

其中 cx 和 cy 代表图像的中心像素位置, fx 和 fy 代表焦距,但这就是文档所说的全部内容。我不确定为这些焦距提供什么。 iPhone 5 的焦距为 4.1 毫米,但我认为这个值不能按原样使用。

我查看了另一个网站:

http://docs.opencv.org/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

它显示了 opencv 如何创建相机矩阵。这里指出焦距是以像素为单位测量的。

我查看了另一个网站:

http://www.velocityreviews.com/forums/t500283-focal-length-in-pixels.html

(大约一半) 它说焦距可以使用以下公式从毫米单位转换为像素:fx = fy = focusMM * pixelDensity / 25.4;

我发现的另一个链接指出 fx = focusMM * width / (sensorSizeMM); fy = focusMM * length / (sensorSizeMM);

我不确定这些方程式以及如何正确创建此矩阵。

任何有关如何创建准确的相机矩阵(尤其是 iPhone 5)的帮助、建议或链接都​​将不胜感激,

艾萨克

附言我认为 (fx/fy) 或 (fy/fx) 可能等于相机的纵横比,但这可能是完全错误的。

更新:

Pixel coordinates to 3D line (opencv)

使用此链接,我可以弄清楚他们希望如何格式化 fx 和 fy,因为他们使用它来缩放相对于它们与中心的距离的角度。因此,fx 和 fy 可能以像素/(单位长度)为单位,但我仍然不确定这个单位长度需要是多少,只要 x 和 y 相互缩放就可以是任意的吗?

【问题讨论】:

    标签: iphone opencv computer-vision augmented-reality camera-calibration


    【解决方案1】:

    您可以获得以像素为单位的焦距的初始(粗略)估计值,以毫米为单位的焦距除以相机传感器(CCD、CMOS 等)的像素宽度。

    您可以从相机手册中获得前者,或者从以全分辨率拍摄的图像的 EXIF 标题中读取它。找出后者有点复杂:如果您知道传感器的制造商和型号,您可以在互联网上查看传感器的规格表,或者您可以将其敏感区域的总宽度除以传感器上的像素数边。

    如果没有其他信息,通常可以安全地假设像素是方形的(即 fx == fy),并且传感器与镜头的焦轴正交(即第一行和第二列中的术语)相机矩阵为零)。此外,如果没有精心设计的校准装置和精心执行的校准程序,主点 (cx, cy) 的像素坐标通常很难准确估计(这是因为它们本质上与平行于图像的相机平移相混淆飞机)。因此最好将它们设置为等于图像的几何几何中心,除非您知道图像已被不对称裁剪。

    因此,您最简单的相机模型只有一个未知参数,焦距 f = fx = fy。

    忠告:在您的应用程序中通常更方便地携带水平(或垂直)视场角,而不是焦距(以像素为单位)。这是因为 FOV 对于图像缩放是不变的。

    【讨论】:

    • 感谢您的回复,我发现它内容丰富且非常有帮助。还有一个快速的问题。鉴于视野角度,我在网上查到 fy = fx = cx/(tan((horizo​​ntalAngle)/2)) 是不是你推荐的公式?
    • 另外,如果我以这种方式构建我的 fx,我还能以这种方式获得相对于我的相机的矢量吗:stackoverflow.com/questions/3107771/…
    • 赞成指出 FoV 作为参数是有利的,因为它与比例无关
    【解决方案2】:

    您在此处处理的“焦距”只是从世界中的物体到相机像素的比例因子,用于针孔相机模型 (Wikipedia link)。这就是为什么它的单位是像素/单位长度。对于给定 f,在距离(垂直于相机)z 处大小为 L 的对象将是 f*L/z 像素。

    因此,您可以通过将已知尺寸的物体放置在距离相机已知距离的位置并测量其在图像中的尺寸来估算焦距。您也可以假设中心点是图像的中心。您绝对不能忽略镜头畸变(solvePnPRansac 中的dist_coef 参数)。

    在实践中,获取相机矩阵和畸变系数的最佳方法是使用相机校准工具。您可以从this link 下载和使用MRPT camera_calib 软件,还有一个视频教程here。如果您使用 matlab,请转到 Camera Calibration Toolbox

    【讨论】:

    • 感谢您的回答,我想我会简单地用 iPhone 5 摄像头录制棋盘并使用您发送的第二个链接。你认为 iphone 5 可能有一个预制的相机矩阵和畸变系数?
    • @Isaac:我不知道任何用于 Iphone 5 的预制相机矩阵,但您可以发布您的校准结果 ;-)
    【解决方案3】:

    这里有一张表格,上面有 iPhone 4 和 5 的摄像头规格。 计算为:

    double f = 4.1;
    double resX = (double)(sourceImage.cols);
    double resY = (double)(sourceImage.rows);
    double sensorSizeX = 4.89;
    double sensorSizeY = 3.67;
    double fx = f * resX / sensorSizeX;
    double fy = f * resY / sensorSizeY;
    double cx = resX/2.;
    double cy = resY/2.;
    

    【讨论】:

      【解决方案4】:

      试试这个:

      func getCamMatrix()->(Float, Float, Float, Float)
      {
      
          let format:AVCaptureDeviceFormat? = deviceInput?.device.activeFormat
          let fDesc:CMFormatDescriptionRef = format!.formatDescription
      
          let dim:CGSize = CMVideoFormatDescriptionGetPresentationDimensions(fDesc, true, true)
      
          // dim = dimensioni immagine finale
          let cx:Float = Float(dim.width) / 2.0;
          let cy:Float = Float(dim.height) / 2.0;
      
          let HFOV : Float = format!.videoFieldOfView
          let VFOV : Float = ((HFOV)/cx)*cy
      
          let fx:Float = abs(Float(dim.width) / (2 * tan(HFOV / 180 * Float(M_PI) / 2)));
          let fy:Float = abs(Float(dim.height) / (2 * tan(VFOV / 180 * Float(M_PI) / 2)));
      
          return (fx, fy, cx, cy)
      }
      

      【讨论】:

        【解决方案5】:

        老线程,出现问题。

        正如 Milo 和 Isaac 在 Milo 的回答之后提到的,似乎没有可用于 iPhone 5 的“通用”参数。

        不管怎样,下面是使用 MRPT 校准工具运行的结果,使用一部不错的旧 iPhone 5:

        [CAMERA_PARAMS]
        resolution=[3264 2448]
        cx=1668.87585
        cy=1226.19712
        fx=3288.47697
        fy=3078.59787
        dist=[-7.416752e-02 1.562157e+00 1.236471e-03 1.237955e-03 -5.378571e+00]
        
        Average err. of reprojection: 1.06726 pixels (OpenCV error=1.06726)
        

        注意dist在这里表示失真。

        我正在使用这些参数对一个玩具项目进行实验——还不错。如果您确实在自己的项目中使用它们,请记住,它们可能不足以开始使用。最好的办法是使用您自己的数据遵循 Milo 的建议。 MRPT 工具非常易于使用,并带有它们提供的棋盘格。希望这有助于开始!

        【讨论】:

          猜你喜欢
          • 2015-10-17
          • 2015-03-16
          • 2012-03-28
          • 1970-01-01
          • 2013-12-26
          • 2013-11-05
          • 2015-05-01
          • 2018-10-19
          • 2013-09-15
          相关资源
          最近更新 更多