gpt4 book ai didi

c++ - 如何在opencv中获取getPerspectiveTransform的比例因子?

转载 作者:搜寻专家 更新时间:2023-10-31 01:37:16 25 4
gpt4 key购买 nike

我有图像A,我想获得图像A的鸟瞰图。所以我使用getPerspectiveTransform方法来获取变换矩阵。输出结果为 3x3 矩阵。看我的代码。就我而言,我想知道 3x3 矩阵的比例因子。我看过 opencv 文档,但找不到变换矩阵的详细信息,也不知道如何获取比例。我也读过一些论文,论文说我们可以从 a11、a12、a21、a22 获得缩放、剪切和旋转。看图片。那么我怎样才能得到比例因子。你能给我一些建议吗?你能解释一下 getPerspectiveTransform 输出矩阵吗?谢谢!

Points[0] = Point2f(..., ...);
Points[1] = Point2f(..., ...);
Points[2] = Point2f(..., ...);
Points[3] = Point2f(..., ...);

dst[0] = Point2f(..., ...);
dst[1] = Point2f(..., ...);
dst[2] = Point2f(..., ...);
dst[3] = Point2f(..., ...);
Mat trans = getPerspectiveTransform(gpsPoints, dst);//I want to know the scale of trans
warpPerspective(A, B, trans, img.size());

enter image description here

enter image description here

当我改变相机位置时,梯形的大小和位置也会改变。现在我们把它设置成一个矩形,矩形的宽度/高度是已知的。但我认为相机在不同高度的矩形尺寸应该已经改变。因为如果我们设置成相同尺寸的矩形,矩形可能有不同的细节。这就是为什么我想知道 3x3 变换矩阵的比例。例如,trapezium1 和 trapezium2 具有 transfrom scale s1 和 s2。所以我们可以设置 rectangle1(width,height) = s2/s1 * rectangle2(width,height)。

最佳答案

好的,给你:

H is the homography
H = T*R*S*L with
T = [1,0,tx; 0,1,ty; 0,0,1]
R = [cos(a),sin(a),0; -sin(a),cos(a),0; 0,0,1]
S = [sx,shear,0; 0,sy,0; 0,0,1]
L = [1,0,0; 0,1,0; lx,ly,1]

where tx/ty is translation; a is rotation angle; sx/sy is scale; shear is shearing factor; lx/ly are perspective foreshortening parameters.

如果我没理解错的话,你想计算 sx 和 sy。现在如果 lx 和 ly 都为 0,那么计算 sx 和 sy 就很容易了。这将是通过 QR 分解产生 Q*R 来分解 H 的左上部分,其中 Q 是正交矩阵(= 旋转矩阵),R 是上三角矩阵([sx, shear; 0,sy] )。

h1 h2 h3
h4 h5 h6
0 0 1

=> Q*R = [h1,h2; h4,h5]

但 lx 和 ly 摧毁最简单的方法。所以你必须找出矩阵的左上部分在没有 lx 和 ly 的影响下会是什么样子。

如果你的整个单应性是:

h1 h2 h3
h4 h5 h6
h7 h8 1

那么你将拥有:

Q*R = 
h1-(h7*h3) h2-(h8*h3)
h4-(h7*h6) h5-(h8*h6)

因此,如果您从该矩阵计算 Q 和 R,则可以轻松计算旋转、缩放和剪切。

我用一个小的 C++ 程序对此进行了测试:

double scaleX = (rand()%200) / 100.0;
double scaleY = (rand()%200) / 100.0;
double shear = (rand()%100) / 100.0;
double rotation = CV_PI*(rand()%360)/180.0;
double transX = rand()%100 - 50;
double transY = rand()%100 - 50;

double perspectiveX = (rand()%100) / 1000.0;
double perspectiveY = (rand()%100) / 1000.0;

std::cout << "scale: " << "(" << scaleX << "," << scaleY << ")" << "\n";
std::cout << "shear: " << shear << "\n";
std::cout << "rotation: " << rotation*180/CV_PI << " degrees" << "\n";
std::cout << "translation: " << "(" << transX << "," << transY << ")" << std::endl;

cv::Mat ScaleShearMat = (cv::Mat_<double>(3,3) << scaleX, shear, 0, 0, scaleY, 0, 0, 0, 1);
cv::Mat RotationMat = (cv::Mat_<double>(3,3) << cos(rotation), sin(rotation), 0, -sin(rotation), cos(rotation), 0, 0, 0, 1);
cv::Mat TranslationMat = (cv::Mat_<double>(3,3) << 1, 0, transX, 0, 1, transY, 0, 0, 1);

cv::Mat PerspectiveMat = (cv::Mat_<double>(3,3) << 1, 0, 0, 0, 1, 0, perspectiveX, perspectiveY, 1);

cv::Mat HomographyMatWithoutPerspective = TranslationMat * RotationMat * ScaleShearMat;

cv::Mat HomographyMat = HomographyMatWithoutPerspective * PerspectiveMat;


std::cout << "Homography:\n" << HomographyMat << std::endl;

cv::Mat DecomposedRotaScaleShear(2,2,CV_64FC1);
DecomposedRotaScaleShear.at<double>(0,0) = HomographyMat.at<double>(0,0) - (HomographyMat.at<double>(2,0)*HomographyMat.at<double>(0,2));
DecomposedRotaScaleShear.at<double>(0,1) = HomographyMat.at<double>(0,1) - (HomographyMat.at<double>(2,1)*HomographyMat.at<double>(0,2));
DecomposedRotaScaleShear.at<double>(1,0) = HomographyMat.at<double>(1,0) - (HomographyMat.at<double>(2,0)*HomographyMat.at<double>(1,2));
DecomposedRotaScaleShear.at<double>(1,1) = HomographyMat.at<double>(1,1) - (HomographyMat.at<double>(2,1)*HomographyMat.at<double>(1,2));

std::cout << "Decomposed submat: \n" << DecomposedRotaScaleShear << std::endl;

现在您可以使用http://www.bluebit.gr/matrix-calculator/ 的QR 矩阵分解来测试结果。

首先,您可以尝试将 perspectiveX 和 perspectiveY 设置为零。您会看到可以使用矩阵的左上部分分解为旋转角度、剪切和比例的输入值。但如果你不设置 perspectiveX 和 perspectiveX 为零,你可以使用“DecomposedRotaScaleShear”并将其分解为 QR。

你会得到一个结果页面

Q:

a a
-a a

在这里你可以计算acos(a)来得到角度

R:

sx shear
0 sy

这里可以直接读取sx和sy。

希望这对您有所帮助,我希望没有错误;)

关于c++ - 如何在opencv中获取getPerspectiveTransform的比例因子?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34389125/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com