图像校正

时间:2010-11-23 20:32:43

标签: image-processing opencv


我需要实现图像校正。问题是从四个视点(topL,topR,bottomL,bottomR)给出对象的图像我需要做成对纠正。我在OpenCV中尝试了一些代码但是还没能取得进展。有人告诉我一个很好的方法(源代码/教程)来执行整改?我需要使用C / C ++ / OpenCV。

  

http://portal.acm.org/citation.cfm?id=1833349.1778777

3 个答案:

答案 0 :(得分:25)

这是一个非常广泛的问题,这里是你可以做到的一种方式的概述......

  • 使用cvGoodFeaturesToTrack()

  • 在两张图片上找到强大的功能角落
  • 将您找到的功能传递到cvFindCornerSubPix(),以获得更强大的功能位置的精确浮点表示

  • 使用cvCalcOpticalFlowPyrLK或其他光流功能,使用上一步中的子像素特征计算两幅图像之间的光流。 (我喜欢cvCalcOpticalFlowPyrLK()

这是一个棘手的地方 ...为了纠正图像,它有助于了解内在的相机特性(视野,焦距),特别是如果你打算做的话某种三维重建或计算差异对应。由于您没有提及有关校准摄像机设置的任何信息,我将继续使用未校准的算法。

  • 您需要找到基本矩阵,它对用于计算整流矩阵的场景的所有方面进行编码。使用cvFindFundamentalMatrix()执行此操作。

  • 使用基本矩阵,您现在必须找到Homography Matrix,它将两个图像映射到同一平面。使用cvStereoRectifyUncalibrated()执行此操作。虽然名称表明它正在纠正你的图像,但它只是返回你可以用来纠正你的图像的单应矩阵。

  • 最后,使用上一步中的Homography矩阵,您可以通过调用cvInitUndistortRectifyMap()来获取重映射矩阵来纠正这两个图像,然后将其传递到cvRemap()以进行实际重映射。 / p>

我必须提醒您,许多参数会进入这些库调用的每个,并且您必须操作许多矩阵并且许多图像,更不用说没有固有的相机校准细节,您将不得不做出许多可能会严重影响您的结果的假设......这不是一件容易的事。


我建议购买和/或阅读Learning OpenCV如果你想了解更多,它远远超出了stackoverflow上的一个短段的范围,期望学习所有这些:)

答案 1 :(得分:1)

答案 2 :(得分:0)

很久以前,这个问题已经发表,但我认为现在答案可以更新。以下是一些提示。

根据image rectification的定义,MicMac是将两个或更多个图像转换为共同图像平面的转换过程。这可以简化在图像之间找到匹配点的问题。此外,它还提高了许多应用程序的性能,如深度图提取。

因此,要执行整改,您必须知道外在相机参数固有相机参数失真参数。首先表示相机之间的位置,其他人将像素帧坐标转换为相机帧坐标,最后负责消除径向失真。您可以在下面找到一些估算参数的工具:

  1. Matlab -stereo-camera-calibration
  2. OpenCV
  3. Kalibr
  4. stereoRectify
  5. 当你最终知道这些参数时,你可以分别在每个摄像机之间进行整改:

    1. openCV的整改过程,检查ROS stereo pipeline
    2. 已在Computer Vision System Toolbox实施的相同算法。
    3. Du Huynh Matlab和其他几个教程中:{{3}}