open camera calibration accuracy

丶灬走出姿态 提交于 2019-12-24 00:37:28

问题


I am calibrating my camera and I get quite bad results. As of now, I blame that my camera is bad or I am doing something wrong. The main functions I use are: findChessboardCorners, cornerSubPix, findCirclesGrid, calibrateCamera and solvePnP (as very well described in the opencv documentation for camera calibration)

So I started to evaluate how the algorithm for camera calibration works if I add 'perfect' data. I used 3D CAD modelling software (Rhinoceros3D) and modelled my grids with absolute accuracy, i.e. square sizes and the distances between are exactly 10 mm . My calibration pattern lies on OXY plane. Because 3D cad software has perspective view, I can easily render the results on the screen as it is in the reality. So I generated images as I would capture them in the real world. This scenario is the perfect case - the pattern is absolutely precise, there is no distortion and there is no camera in the world to produce such good results.

Chessboard 8x10 https://www.dropbox.com/sh/9zbzk6bqekih8il/AADUZvxwd5PdmGXauCJSHFMwa?dl=0

and

Asymmetric grid 4 x 11 https://www.dropbox.com/sh/9abr79py4z9hf3x/AABj0ez5_bxL4rsFLjxKwjsma?dl=0

My next step is to calibrate camera. I passed the images and from calibrateCamera function I get error of 0.115208 px for chessboard and 0.030177 px for asymmetric grid.

Then what I need to do is to evaluate how good the calibration is. For the same set of images I use solvePnP ( used solvePnPRansac with the same results) to locate where the camera is. I made clear solve - no initial guess for the camera position (as this is a new position in the space of the camera). Using rot and trans of the results, I construct a cartesian coordinate system, pass a ray from camera origin, through the UNDISTORTED points and intersect with plane OXY. Ideally I would expect these lines will intersect the plane very accurately ( in points (0, 0), (0, 10), (10, 0) etc.).

The problem is that I get significant offset of around 0.15 mm, which means that locating my camera in 3D is wrong. I want to use this as base to do 'camera - projector calibration', but if I get such a big error in the 'perfect' scenario, this will never get good results with real camera/projector.

Another test which I did was: 1. For every image after we have calibrationMatrix and deviation coefficients, locate the camera position using solvePnP. 2. Intersect only first point of the detected corners in the pattern. ( It should intersect 0XY in (0, 0) ) 3. Evaluate standard deviation of the distances for all of these points to the origin (0, 0) - LOCATION accuracy 4. Evaluate standard deviation of the distances for all these points to their average point - SYSTEMATIC accuracy

The problem is that for LOCATION accuracy I get error 0.165423 mm and for SYSTEMATIC accuracy I get error 0.035441 mm.

These errors are two high . I would expect for both LOCATION and SYSTEMATIC accuracy to get something like 0.0001 mm for the data set provided.

My question is - Can someone test the images from the links in their implementation and let me know what are the results? May be I miss something in my implementation, but I truly believe that we should get 'perfect' results when we provide 'perfect' data.

I will be really grateful for the help.

P.S. - I am using opencv 2.4.10. Has anything been improved in 3.0 in these algorithms?

Thanks a lot

来源:https://stackoverflow.com/questions/33722879/open-camera-calibration-accuracy

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!