У меня есть изображение изображения, где внутреннее изображение наклонено и имеет свою собственную таблицу координат (видимую по ее краям):
Теперь мне нужно преобразовать точку фактического изображения в (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;
Но я понятия не имею, как получить координаты левого нижнего угла в сантиметровых координатах.
Этот вид преобразования (используя только масштаб и угол наклона) называется аффинным преобразованием. Вы можете использовать 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]
:
Вы ищете аффинная трансформация который может быть выполнен путем умножения матрицы.