Вот метод, который будет искажать изображение, если у вас нет рисунка шахматной доски, но вы знаете коэффициенты искажения.
Поскольку я не знаю, какие коэффициенты ваши параметры дисторсия соответствуют (возможно, взглянуть на http://docs.opencv.org/doc/tutorials/calib3d/camera_calibration/camera_calibration.html и http://docs.opencv.org/modules/imgproc/doc/geometric_transformations.html#initundistortrectifymap вам придется попробовать его или, может быть, кто-то может помочь здесь.
Другое дело, что я м не уверен, будет ли OpenCV обрабатывать как, плавать и в два раза автоматически Если это не так, что может быть ошибка в этом коде (я не знаю, предполагается ли двойной или одинарной точности):.
cv::Mat distCoeff;
distCoeff = cv::Mat::zeros(8,1,CV_64FC1);
// indices: k1, k2, p1, p2, k3, k4, k5, k6
// TODO: add your coefficients here!
double k1 = 0;
double k2 = 0;
double p1 = 0;
double p2 = 0;
double k3 = 0;
double k4 = 0;
double k5 = 0;
double k6 = 0;
distCoeff.at<double>(0,0) = k1;
distCoeff.at<double>(1,0) = k2;
distCoeff.at<double>(2,0) = p1;
distCoeff.at<double>(3,0) = p2;
distCoeff.at<double>(4,0) = k3;
distCoeff.at<double>(5,0) = k4;
distCoeff.at<double>(6,0) = k5;
distCoeff.at<double>(7,0) = k6;
// assume unit matrix for camera, so no movement
cv::Mat cam1,cam2;
cam1 = cv::Mat::eye(3,3,CV_32FC1);
cam2 = cv::Mat::eye(3,3,CV_32FC1);
//cam2.at<float>(0,2) = 100; // for testing a translation
// here the undistortion will be computed
cv::Mat map1, map2;
cv::initUndistortRectifyMap(cam1, distCoeff, cv::Mat(), cam2, input.size(), CV_32FC1, map1, map2);
cv::Mat distCorrected;
cv::remap(input, distCorrected, map1, map2, cv::INTER_LINEAR);
В образцах с использованием шахматной доски, они должны вычислять параметры искажения в любом месте. Просто пропустите вычисление и укажите эти параметры явно. Если эта часть инкапсулирована, вы можете посмотреть исходный код oprnCV и использовать внутренне используемые функции. – Micka
Я попытался сам определить углы шахматной доски (например, 4x4 точек), но не понял, какова должна быть структура массива углов. У кого-нибудь есть идея? –
Хорошо, я думаю, что наименьший возможный массив должен быть сконфигурирован следующим образом: corners = np.zeros ((4 * 4,1,2), dtype = "float32"). С 3x3, похоже, не работает. Тем не менее я бы предпочел что-то вроде convert -distort Barrel вместо определения теперь искаженных точек. –