2

我举了本书中校准相机和不失真图像的代码示例:shop.oreilly.com/product/9780596516130.do

据我了解,OpenCV 的常用相机校准方法非常适用于“普通”相机。当涉及到鱼眼镜头时,虽然我们必须使用 8 个校准参数而不是 5 个向量以及CV_CALIB_RATIONAL_MODEL方法中的标志cvCalibrateCamera2。至少,这就是它在OpenCV 纪录片中所说的

因此,当我在这样的图像数组上使用它时(来自 OCamCalib 的示例图像),我使用以下结果得到以下结果cvInitUndistortMapabload.de/img/rastere4u2w.jpg

由于生成的图像是从整个未失真的图像中剪切出来的,所以我继续使用cvInitUndistortRectifyMap(就像这里描述的那样stackoverflow.com/questions/8837478/opencv-cvremap-cropping-image)。所以我得到了以下结果:abload.de/img/rasterxisps.jpg

现在我的问题是:为什么整个图像没有失真?在我后来结果的一些照片中,您可以识别出例如笔记本电脑仍然完全失真。如何使用标准 OpenCV 方法获得更好的结果?

我是 stackoverflow 的新手,我也是 OpenCV 的新手,所以在表达我的问题时,请原谅我的任何缺点。

4

1 回答 1

2
  1. 所有棋盘角都应该是可见的。该算法需要一定大小的棋盘,例如 4x3 或 7x6(例如)。棋盘周围的白色边框也应该可见,否则可能无法精确定义深色方块。

  2. 在 undistort() 之后,您在图像外围仍然有很高的失真,因为失真是径向的(即它们随着半径的增加而增加)并且您找到的系数是错误的。后者是错误的,因为校准过程使像素坐标中的平方误差之和最小化,并且您没有用足够的样本表示外围。

TODO:如果使用 8 个 distCoeff,则必须有 20-40 个棋盘图案图像。以不同的角度倾斜你的木板,把它们放在不同的距离,然后把它们散开,尤其是在外围。请记住,校准的成功取决于采样以及从棋盘上清楚地看到消失点(因此是倾斜和倾斜)。

于 2014-04-17T07:05:33.527 回答