Могу ли я создать матрицу преобразования из векторов вращения / перемещения?
Я пытаюсь вычеркнуть изображение, которое имеет элемент известного размера. Учитывая это изображение:
я могу использовать aruco:: estimatePoseBoard
который возвращает векторы вращения и перемещения. Есть ли способ использовать эту информацию для выравнивания всего, что находится в той же плоскости, что и маркерная доска? (К сожалению, моя линейная алгебра в лучшем случае рудиментарна.)
осветление
Я знаю, как выровнять маркерную доску. То, что я хочу сделать, это выровнять другие вещи (в данном случае, объект в форме облака) в той же плоскости, что и маркерная доска. Я пытаюсь определить, возможно ли это, и если да, то как это сделать. Я уже могу поместить четыре маркера вокруг объекта, который я хочу выровнять, и использовать обнаруженные углы в качестве входных данных для getPerspectiveTransform
наряду с известным расстоянием между ними. Но для нашего реального приложения пользователю может быть трудно точно разместить маркеры. Было бы намного проще, если бы они могли поместить одну маркерную доску в раму и установить программное обеспечение на другие объекты.
2 ответа
Я застрял в предположении, что пункт назначения указывает на вызов 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());
Это фиксировало перспективу доски и всего в ее плоскости. (Волнистость доски связана с тем, что на оригинальной фотографии бумага не лежала ровно.)
Поскольку вы пометили 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));