Opencv: исказить обратноC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Opencv: исказить обратно

Сообщение Anonymous »


У меня есть 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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Cv2.error: OpenCV(4.8.1) D:\a\opencv-python\opencv-python\opencv\modules\src\.cpp:660: ошибка: (-215: утверждение не вып
    Anonymous » » в форуме Python
    0 Ответы
    131 Просмотры
    Последнее сообщение Anonymous
  • Как я могу исказить определенные значения оси Y на линейном графике в ECharts?
    Anonymous » » в форуме Javascript
    0 Ответы
    11 Просмотры
    Последнее сообщение Anonymous
  • С OpenGL, как я могу исказить только один угол вида [закрыто]
    Anonymous » » в форуме C++
    0 Ответы
    4 Просмотры
    Последнее сообщение Anonymous
  • Как я могу эффективно исказить и неискренние точки изображения?
    Anonymous » » в форуме Python
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous
  • Как исказить изображение в любой четырехугольник?
    Anonymous » » в форуме Android
    0 Ответы
    2 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C++»