OpenCV Fisheye Calibration дает большую ошибку в идентичных точках - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь исправить «рыбий глаз» на изображении с помощью OpenCV.

Я не могу заставить шаг калибровки работать.Я попробовал приведенный ниже код для калибровки, и даже с идентичными координатами x и y на входе и выходе возвращаемое среднеквадратичное значение составляет не менее 100.

std::vector<std::vector<cv::Point3d>> objpts;
std::vector<std::vector<cv::Point2d>> imgpts;
cv::Size img_size(1292,964); //dimension of input image in pixels
cv::Mat K, D;
std::vector<cv::Mat> rvecs, tvecs;

objpts.push_back(std::vector<cv::Point3d>());
imgpts.push_back(std::vector<cv::Point2d>());

//loading identical data into each
objpts[0].push_back(cv::Point3d(100, 100, 0));
objpts[0].push_back(cv::Point3d(0, 100, 0));
objpts[0].push_back(cv::Point3d(100, 0, 0));
objpts[0].push_back(cv::Point3d(0, 0, 0));
objpts[0].push_back(cv::Point3d(0, 50, 0));

imgpts[0].push_back(cv::Point2d(100, 100));
imgpts[0].push_back(cv::Point2d(0, 100));
imgpts[0].push_back(cv::Point2d(100, 0));
imgpts[0].push_back(cv::Point2d(0, 0));
imgpts[0].push_back(cv::Point2d(0, 50));

//ret changes depending on the points, but is always around 100-500
double ret = cv::fisheye::calibrate(objpts, imgpts, img_size, K, D, rvecs, tvecs);

//This produces the images seen below
cv::Mat im = cv::imread("env.jpg");
cv::Mat out;
cv::fisheye::undistortImage(im, out, K, D);
cv::imwrite("out_env.jpg", out);

Когда я пытаюсь использовать эти калиброванные K иМатрицы D для искажения изображения, я получаю результаты, которые выглядят так: out_image

Для справки, вот исходное изображение: in_image

У меня возникли похожие проблемы, когда я пытался использовать фактическийпиксельные координаты для изображений и физические размеры для объектов.

Использование opencv 3.4.5

Любая помощь приветствуется!Спасибо!

...