Opencv: исказить обратно ⇐ C++
Opencv: исказить обратно
У меня есть cameraMatrix и distCoeff, необходимые для неискажения изображения или вектора точек. Теперь я хотел бы исказить их обратно.
Возможно ли это с Opencv? Помню, я что-то читал об этом в stackoverflow, но сейчас не могу найти.
РЕДАКТИРОВАТЬ: я нашел способ сделать это в этом ответе. Он также находится в зоне разработчиков opencv (в этом выпуске)
Но мои результаты не совсем верны. Есть некоторая погрешность в 2-4 пикселя больше или меньше. Вероятно, что-то не так в моем коде, потому что в ответе, который я связал, в модульном тесте все выглядит хорошо. Возможно, введите приведение типа float к double или что-то еще, чего я не вижу.
вот мой тестовый пример:
#include #include #include использование пространства имен cv; использование пространства имен std; void ignorePoints(const std::vector & src, std::vector & dst, const cv::Mat & cameraMatrix, const cv::Mat & distorsionMatrix) { дст.очистить(); double fx = cameraMatrix.at(0,0); double fy = cameraMatrix.at(1,1); double ux = cameraMatrix.at(0,2); double uy = cameraMatrix.at(1,2); double k1 = distorsionMatrix.at(0, 0); double k2 = distorsionMatrix.at(0, 1); double p1 = distorsionMatrix.at(0, 2); double p2 = distorsionMatrix.at(0, 3); double k3 = distorsionMatrix.at(0, 4); for (unsigned int i = 0; i < src.size(); i++) { const cv::Point2d & p = src; двойной х = п.х; двойной у = p.y; двойной xCorrected, yCorrected; //Шаг 1: исправить искажение { двойной r2 = x*x + y*y; //радиальная дисторсия xCorrected = x * (1. + k1 * r2 + k2 * r2 * r2 + k3 * r2 * r2); yCorrected = y * (1. + k1 * r2 + k2 * r2 * r2 + k3 * r2 * r2); //тангенциальное искажение //Книга «Изучение OpenCV» здесь неправильная !!! //Ложные уравнения из книги «Изучение OpenCv» ниже: //xCorrected = xCorrected + (2. *p1 * y + p2 * (r2 + 2. * x * x)); //yCorrected = yCorrected + (p1 * (r2 + 2. * y * y) + 2. * p2 * x); //Правильные формулы можно найти по адресу: http://www.vision.caltech.edu/bouguetj/ ... eters.html. xCorrected = xCorrected + (2. *p1 * x * y + p2 * (r2 + 2. * x * x)); yCorrected = yCorrected + (p1 * (r2 + 2. * y * y) + 2. *р2*х*у); } //Шаг 2: идеальные координаты => фактические координаты { xCorrected = xCorrected * fx + ux; yCorrected = yCorrected * fy + uy; } dst.push_back(cv::Point2d(xCorrected, yCorrected)); } } int main(int /*argc*/, char** /*argv*/) { cout
У меня есть cameraMatrix и distCoeff, необходимые для неискажения изображения или вектора точек. Теперь я хотел бы исказить их обратно.
Возможно ли это с Opencv? Помню, я что-то читал об этом в stackoverflow, но сейчас не могу найти.
РЕДАКТИРОВАТЬ: я нашел способ сделать это в этом ответе. Он также находится в зоне разработчиков opencv (в этом выпуске)
Но мои результаты не совсем верны. Есть некоторая погрешность в 2-4 пикселя больше или меньше. Вероятно, что-то не так в моем коде, потому что в ответе, который я связал, в модульном тесте все выглядит хорошо. Возможно, введите приведение типа float к double или что-то еще, чего я не вижу.
вот мой тестовый пример:
#include #include #include использование пространства имен cv; использование пространства имен std; void ignorePoints(const std::vector & src, std::vector & dst, const cv::Mat & cameraMatrix, const cv::Mat & distorsionMatrix) { дст.очистить(); double fx = cameraMatrix.at(0,0); double fy = cameraMatrix.at(1,1); double ux = cameraMatrix.at(0,2); double uy = cameraMatrix.at(1,2); double k1 = distorsionMatrix.at(0, 0); double k2 = distorsionMatrix.at(0, 1); double p1 = distorsionMatrix.at(0, 2); double p2 = distorsionMatrix.at(0, 3); double k3 = distorsionMatrix.at(0, 4); for (unsigned int i = 0; i < src.size(); i++) { const cv::Point2d & p = src; двойной х = п.х; двойной у = p.y; двойной xCorrected, yCorrected; //Шаг 1: исправить искажение { двойной r2 = x*x + y*y; //радиальная дисторсия xCorrected = x * (1. + k1 * r2 + k2 * r2 * r2 + k3 * r2 * r2); yCorrected = y * (1. + k1 * r2 + k2 * r2 * r2 + k3 * r2 * r2); //тангенциальное искажение //Книга «Изучение OpenCV» здесь неправильная !!! //Ложные уравнения из книги «Изучение OpenCv» ниже: //xCorrected = xCorrected + (2. *p1 * y + p2 * (r2 + 2. * x * x)); //yCorrected = yCorrected + (p1 * (r2 + 2. * y * y) + 2. * p2 * x); //Правильные формулы можно найти по адресу: http://www.vision.caltech.edu/bouguetj/ ... eters.html. xCorrected = xCorrected + (2. *p1 * x * y + p2 * (r2 + 2. * x * x)); yCorrected = yCorrected + (p1 * (r2 + 2. * y * y) + 2. *р2*х*у); } //Шаг 2: идеальные координаты => фактические координаты { xCorrected = xCorrected * fx + ux; yCorrected = yCorrected * fy + uy; } dst.push_back(cv::Point2d(xCorrected, yCorrected)); } } int main(int /*argc*/, char** /*argv*/) { cout
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Как я могу исказить определенные значения оси Y на линейном графике в ECharts?
Anonymous » » в форуме Javascript - 0 Ответы
- 11 Просмотры
-
Последнее сообщение Anonymous
-