Могу ли я создать матрицу преобразования из векторов вращения / перемещения?

Я пытаюсь вычеркнуть изображение, которое имеет элемент известного размера. Учитывая это изображение:

Исходное изображение

я могу использовать aruco:: estimatePoseBoard который возвращает векторы вращения и перемещения. Есть ли способ использовать эту информацию для выравнивания всего, что находится в той же плоскости, что и маркерная доска? (К сожалению, моя линейная алгебра в лучшем случае рудиментарна.)

осветление

Я знаю, как выровнять маркерную доску. То, что я хочу сделать, это выровнять другие вещи (в данном случае, объект в форме облака) в той же плоскости, что и маркерная доска. Я пытаюсь определить, возможно ли это, и если да, то как это сделать. Я уже могу поместить четыре маркера вокруг объекта, который я хочу выровнять, и использовать обнаруженные углы в качестве входных данных для getPerspectiveTransform наряду с известным расстоянием между ними. Но для нашего реального приложения пользователю может быть трудно точно разместить маркеры. Было бы намного проще, если бы они могли поместить одну маркерную доску в раму и установить программное обеспечение на другие объекты.

6

Решение

Поскольку вы пометили OpenCV:
По изображению видно, что вы обнаружили углы всего черного ящика. Так что просто получите максимальную границу для баллов тем или иным способом:
введите описание изображения здесь

Тогда это так:

std::vector<cv::Point2f> src_points={/*Fill your 4 corners here*/};
std::vector<cv::Point2f> dst_points={cv:Point2f(0,0), cv::Point2f(width,0), cv::Point2f(width,height),cv::Point2f(0,height)};
auto H=v::getPerspectiveTransform(src_points,dst_points);
cv::Mat copped_image;
cv::warpPerspective(full_image,copped_image,H,cv::Size(width,height));
1

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

Я застрял в предположении, что пункт назначения указывает на вызов getPerspectiveTransform должны быть углами выходного изображения (как они есть в предложении Хумама). Однажды до меня дошло, что точки назначения могут быть где-то в пределах выходного изображения, и я получил ответ.

float boardX = 1240;
float boardY = 1570;
float boardWidth = 1730;
float boardHeight = 1400;

vector<Point2f> destinationCorners;
destinationCorners(Point2f(boardX+boardWidth, boardY));
destinationCorners(Point2f(boardX+boardWidth, boardY+boardHeight));
destinationCorners(Point2f(boardX, boardY+boardHeight));
destinationCorners(Point2f(boardX, boardY));

Mat h = getPerspectiveTransform(detectedCorners, destinationCorners);

Mat bigImage(image.size() * 3, image.type(), Scalar(0, 50, 50));

warpPerspective(image, bigImage, h, bigImage.size());

Это фиксировало перспективу доски и всего в ее плоскости. (Волнистость доски связана с тем, что на исходной фотографии бумага не лежала ровно.)

исправленная перспектива

1

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