在无法访问相机的情况下消除鱼眼效果

Posted

技术标签:

【中文标题】在无法访问相机的情况下消除鱼眼效果【英文标题】:Removing Fish eye effect with no access to the camera 【发布时间】:2017-07-20 16:47:10 【问题描述】:

有些照片是我无法再访问的鱼眼相机拍摄的。我正在尝试使用opencv消除这些照片上的鱼眼效应,我所见过的所有解决方案都需要拍摄已知大小的物体(即棋盘)然后调用 cv2.calibrate() 然后它将返回校准要在 cv2.undistorted() 中使用的参数,但这不适用。但是这些属性是附加在相机上的关于鱼眼效果参数的。

<intrinsic>
        <fisheyeAmt1 format="float" value="308.8805"/>
        <fisheyeAmt2 format="float" value="-14.2861"/>
        <fisheyeAmt3 format="float" value="51.4445"/>
        <fisheyeAmt4 format="float" value="-10.362"/>
        <opt_axis_x_rot_deg format="float" value="0"/>
        <opt_axis_z1_rot_deg format="float" value="0"/>
        <opt_axis_z2_rot_deg format="float" value="0"/>
        <image_flip_x_bool format="bool" value="false"/>
        <image_flip_y_bool format="bool" value="false"/>
        <cam_aspect format="float" value="0.9999"/>
        <source_image_x_res format="float" value="1280.0"/>
        <source_image_y_res format="float" value="806.0"/>
        <cxoffs_pix format="float" value="5.35"/>
        <cyoffs_pix format="float" value="6.477"/>
      </intrinsic>
<extrinsic>
        <rot__x_deg format="float" value="68.46"/>
        <rot_z1_deg format="float" value="-89.34"/>
        <rot_z2_deg format="float" value="0.75"/>
        <pointx_mm format="float" value="4133.0"/>
        <pointy_mm format="float" value="-97.0"/>
        <pointz_mm format="float" value="919.31"/>
      </extrinsic>

我的问题是,这些属性中有什么我可以用来替代 cv2.calibrate() 返回的值吗?

还有另一个问题here 解决了类似的问题。 但我不确定我拥有的值是否可以用作另一个问题中使用的 fx、fy、cx、cy、k1、k2、p1、p2。

【问题讨论】:

correcting fisheye distortion programmatically的可能重复 @TomWyllie 这是一个非常相似的问题,但这里的问题是我不知道这些值中的哪一个代表 fx、fy、cx、cy、k1、k2、p1、p2。 【参考方案1】:

如果您有包含已知纹理平面表面的图像,则可以执行另一次校准。

这些属性从何而来?他们的一些名字不是标准的。 你有关于提到焦点的图像的 EXIF 信息吗?

cxoffs_pix: cx - 1280/2 cyoffs_pix: cy - 806/2 source_image_x_res: 应该接近 2*cx source_image_y_res:应该接近 2*cy cam_aspect:fx/fy image_flip_x_bool:应该指明是否对fx进行否定 image_flip_y_bool:应该表示是否对fy取反

您能给出与名称相关的值吗?这可能有助于猜测。

如果你有关于视野的信息,它可以帮助 fx,fy

【讨论】:

不幸的是,这些是我得到的唯一信息。但是,我将对其进行更新以使其具有值。 我还有一张在路上被相机拍到的长直线。鉴于它在现实世界中必须是一条直线,我认为这可能会有所帮助。 @Vincent Vidal 因此,根据值 cx = cxoffs_pix + 1280/2 和 cy = cyoffs_pix + 806/2(我编辑了我的帖子)。如果你很幸运,308.8805 可能是 px 单位(fx 和 fy)的焦点,而 fisheyeAmt2、fisheyeAmt3 和 fisheyeAmt4 将是 k1、k2、k3,但我无法确定。矩形可以完成校准工作而不会失真(估计/检查 fx、fy、cx、cy)。要获取失真参数,我不知道最小模式。【参考方案2】:

如果有人仍然需要解决这个问题,不要感到茫然,这可以通过我能想到的两种方式来完成,一种是使用 GUI 手动调整相机校准参数!另一种自动化解决方案是在图像中查找应该是直线但由于鱼眼而弯曲的边缘或线条。绘制这些线并保存点。然后将相机参数作为优化问题求解,是的,它可以工作。这是相同的示例代码,Fisheye_gui

【讨论】:

虽然此链接可能会回答问题,但最好在此处包含答案的基本部分并提供链接以供参考。如果链接页面发生更改,仅链接答案可能会失效。 - From Review

以上是关于在无法访问相机的情况下消除鱼眼效果的主要内容,如果未能解决你的问题,请参考以下文章

相机里的内存卡无法访问?可能是这些原因导致的

iOS:控制访问相机胶卷新出现

无法在 ios 9 中为 AVCaptureDevice 访问相机。

Cordova 相机 - 无法访问库

360°全景效果图

为啥我无法在 Android Instant App 中访问相机?