我能否从旋转/平移向量创建一个变换矩阵?

6

我想要对一张含有已知尺寸元素的图像进行去斜校正。给定这张图片:

Source image

我可以使用 aruco::estimatePoseBoard 函数来获取旋转和平移向量。是否有办法利用这些信息来去除与标记板处于同一平面上的所有物体的倾斜?(不幸的是我的线性代数水平很差。)

澄清

我知道如何去除标记板的倾斜。我想要做的是能够去除与标记板处于同一平面上的其他物体(在本例中是云形物体)的倾斜。我正在尝试确定是否可能并且如果可能,如何实现。我已经能够将四个标记放在我想要去斜校正的物体周围,并使用检测到的角点作为输入来调用 getPerspectiveTransform 函数,并提供它们之间的已知距离作为参数。但在我们的实际应用中,用户可能很难精确地放置标记。如果他们能够在画面中放置一个单独的标记板,并让软件去斜校正其他物体,那将会更加容易。


将左上角点与右上角点对齐,将左下角点与右下角点对齐。可能有效。 - Evan Carslake
2个回答

2
自从你标记了OpenCV: 从图像中可以看出,您已检测到所有黑盒子的角落。因此,以某种方式获取最边缘的点: enter image description here 然后就是这样:
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));

我需要对除了标记板以外的东西进行去斜校正。我在我的问题中添加了澄清。 - SSteve
我现在收到了你的问题.. 我不知道。它似乎是一个简单的问题,但同时我现在无法想到任何东西.. 如果没有人回答你,我稍后会回来。 - Humam Helfawi

1
我曾经认为,在调用getPerspectiveTransform时,目标点必须是输出图像的角落(就像Humam的建议中一样)。当我意识到目标点可以在输出图像内的任何位置时,问题迎刃而解。
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());

这样做可以修正板子和平面内的所有透视问题。(板子上的波浪状是由于原始照片中的纸张没有放平造成的。)

corrected perspective


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接