Преобразовать точку на наклонном изображении в не наклонную точку

У меня есть изображение изображения, где внутреннее изображение наклонено и имеет свою собственную таблицу координат (видимую по ее краям):

введите описание изображения здесь

Теперь мне нужно преобразовать точку фактического изображения в (x cm, y cm) указать на наклонное изображение. Скажи, я хочу знать, что (x cm, y cm) координирует нижний левый угол ((0, img.height())) фактического изображения имеет. То есть, если таблица координат внутреннего изображения должна быть экстраполирована.

Я уже знаю:

  • Угол a наклонного изображения
  • Две точки p1 а также p2 выбирается вручную из наклонного изображения
  • См координаты p1cm а также p2cm для этих двух точек

Я могу получить масштаб изображения, сравнивая две точки вместе и получая соотношение между их расстоянием в сантиметрах и фактическим расстоянием:

double dCmX = p1cm.x() - p2cm.x();
double dCmY = p1cm.y() - p2cm.y();
double dCm = sqrt(pow(dCmX, 2) + pow(dCmY, 2))

double dPointX = p1.x() - p2.x();
double dPointY = p1.y() - p2.y();
double dPoint = sqrt(pow(dPointX, 2) + pow(dPointY, 2))

double scale = dPoint / dCm;

Но я понятия не имею, как получить координаты левого нижнего угла в сантиметровых координатах.

2

Решение

Этот вид преобразования (используя только масштаб и угол наклона) называется аффинным преобразованием. Вы можете использовать OpenCV библиотеки для простоты. Тогда код очень прост:

double scale = dPoint / dCm;
Point center = Point( img.cols/2, img.rows/2);
Mat warpMat = getRotationMatrix2D( center, angle, scale );
Point2f src[1];
Point2f dst[1];
src[0] = Point2f(src_x, src_y);
transform(src, dst, warpMat);

Тогда вы будете иметь свой результат внутри dst, Вы, конечно, можете сделать src массив больше и дать transform метод больше очков одновременно.
Смотрите также этот для получения дополнительной информации об opencv и аффинном преобразовании.


Если вы не хотите использовать OpenCV вы все еще можете взглянуть на страницы документации getRotationMatrix2D а также warpAffine и реализовать это самостоятельно, это довольно просто:

введите описание изображения здесь

Построить матрицу (warpMat):

введите описание изображения здесь

И затем, для каждой точки (x,y) построить вектор [x,y,1] и сделать матричное умножение между warpMat а также [x,y,1]:

введите описание изображения здесь

2

Другие решения

Вы ищете аффинная трансформация который может быть выполнен путем умножения матрицы.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector