我可以从旋转/平移向量创建变换矩阵吗?

Posted

技术标签:

【中文标题】我可以从旋转/平移向量创建变换矩阵吗?【英文标题】:Can I create a transformation matrix from rotation/translation vectors? 【发布时间】:2016-01-29 03:01:07 【问题描述】:

我正在尝试校正具有已知大小元素的图像。鉴于此图像:

我可以使用返回旋转和平移向量的aruco:: estimatePoseBoard。有没有办法使用该信息来校正与标记板在同一平面上的所有内容? (不幸的是,我的线性代数充其量只是初级。)

澄清

我知道如何校正标记板。我想要做的是将其他东西(在这种情况下,云形物体)与标记板放在同一平面上。我正在尝试确定这是否可行,如果可以,该怎么做。我已经可以在我想歪斜的对象周围放置四个标记,并使用检测到的角作为getPerspectiveTransform 的输入以及它们之间的已知距离。但是对于我们的实际应用程序,用户可能很难准确地放置标记。如果他们可以在框架中放置一个标记板并让软件对其他对象进行纠偏,那就容易多了。

【问题讨论】:

将左上角与右上角对齐,将左下角与右下角对齐。可能会工作 【参考方案1】:

自从您标记了 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));

【讨论】:

我需要校正除记号板以外的东西。我在我的问题中添加了一个说明。 我现在收到你的问题了。我不知道。这似乎是一个简单的问题,但同时我现在什么都想不起来.. 如果没有人回答你,我稍后会回来【参考方案2】:

我坚持假设调用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());

这固定了棋盘的视角及其平面内的一切。 (纸板的波纹是由于原始照片中的纸张没有平放。)

【讨论】:

以上是关于我可以从旋转/平移向量创建变换矩阵吗?的主要内容,如果未能解决你的问题,请参考以下文章

闫令琪GAMES101笔记 变换

如何在emgu CV中进行相机校准后访问旋转和平移向量

变换列表的平均变换矩阵

对图像的仿射变换

图像处理之_仿射变换与透视变换

由正交矩阵构建的仿射变换矩阵求逆的快速算法