我需要实现图像校正。问题是从四个视点(topL,topR,bottomL,bottomR)给出对象的图像我需要做成对纠正。我在OpenCV中尝试了一些代码但是还没能取得进展。有人告诉我一个很好的方法(源代码/教程)来执行整改?我需要使用C / C ++ / OpenCV。
答案 0 :(得分:25)
这是一个非常广泛的问题,这里是你可以做到的一种方式的概述......
使用cvGoodFeaturesToTrack()
将您找到的功能传递到cvFindCornerSubPix()
,以获得更强大的功能位置的精确浮点表示
使用cvCalcOpticalFlowPyrLK
或其他光流功能,使用上一步中的子像素特征计算两幅图像之间的光流。 (我喜欢cvCalcOpticalFlowPyrLK()
)
这是一个棘手的地方 ...为了纠正图像,它有助于了解内在的相机特性(视野,焦距),特别是如果你打算做的话某种三维重建或计算差异对应。由于您没有提及有关校准摄像机设置的任何信息,我将继续使用未校准的算法。
您需要找到基本矩阵,它对用于计算整流矩阵的场景的所有方面进行编码。使用cvFindFundamentalMatrix()
执行此操作。
使用基本矩阵,您现在必须找到Homography Matrix,它将两个图像映射到同一平面。使用cvStereoRectifyUncalibrated()
执行此操作。虽然名称表明它正在纠正你的图像,但它只是返回你可以用来纠正你的图像的单应矩阵。
最后,使用上一步中的Homography矩阵,您可以通过调用cvInitUndistortRectifyMap()
来获取重映射矩阵来纠正这两个图像,然后将其传递到cvRemap()
以进行实际重映射。 / p>
我必须提醒您,许多参数会进入这些库调用的每个,并且您必须操作许多矩阵并且许多图像,更不用说没有固有的相机校准细节,您将不得不做出许多可能会严重影响您的结果的假设......这不是一件容易的事。
我建议购买和/或阅读Learning OpenCV如果你想了解更多,它远远超出了stackoverflow上的一个短段的范围,期望学习所有这些:)
答案 1 :(得分:1)
答案 2 :(得分:0)
很久以前,这个问题已经发表,但我认为现在答案可以更新。以下是一些提示。
根据image rectification的定义,MicMac是将两个或更多个图像转换为共同图像平面的转换过程。这可以简化在图像之间找到匹配点的问题。此外,它还提高了许多应用程序的性能,如深度图提取。
因此,要执行整改,您必须知道外在相机参数,固有相机参数和失真参数。首先表示相机之间的位置,其他人将像素帧坐标转换为相机帧坐标,最后负责消除径向失真。您可以在下面找到一些估算参数的工具:
当你最终知道这些参数时,你可以分别在每个摄像机之间进行整改: