繁体   English   中英

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

[英]Can I create a transformation matrix from rotation/translation vectors?

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

来源图片

我可以使用aruco:: estimatePoseBoard返回旋转和平移向量。 有没有办法利用这些信息去除与标记板在同一平面上的所有东西? (不幸的是,我的线性代数充其量是最基本的。)

澄清

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

因为你标记了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));

我坚持认为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());

这固定了电路板的视角和平面内的一切。 (电路板的波纹是由于纸张没有平放在原始照片中。)

纠正的观点

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM