使用OpenCV解决/纠正图像

时间:2013-12-11 11:33:14

标签: opencv camera camera-calibration fisheye

我采用了代码示例来校准相机并从本书中取消失真图像:shop.oreilly.com/product/9780596516130.do

据我所知,OpenCV的常用相机校准方法适用于“普通”相机。 当谈到鱼眼镜头时,我们必须使用8个校准参数的矢量而不是5个,并且方法CV_CALIB_RATIONAL_MODEL中的标志cvCalibrateCamera2也是如此。 至少,这就是它在OpenCV documentary

中所说的内容

所以,当我在这样的图像数组Sample images from OCamCalib上使用它时,我会使用cvInitUndistortMap获得以下结果:abload.de/img/rastere4u2w.jpg

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

  3. TODO:如果使用8个distCoeff,你必须有20-40个棋盘图案图像。以不同的角度倾斜您的电路板,将它们放置在不同的距离并将它们展开,特别是在周边。请记住,校准的成功取决于采样以及从棋盘上清楚地看到vanishing points(因此lanting and tilting).