gpt4 book ai didi

python - 从 2D 图像中查找墙壁的 Z 角位置

转载 作者:行者123 更新时间:2023-12-02 17:29:56 24 4
gpt4 key购买 nike

我在现实生活中有一面 3D 矩形墙,它可以转换为 2D 图像。考虑到我有他所有的 4 点坐标。我怎样才能找到他相对于相机的真实 Z 角位置?

我试图以不同的角度测量矩形的边缘与边缘之间的比率,我可以找到并保持不变,如果我将他乘以某些边缘的比率,它将给我当前的 Z 角。它不起作用,因为当旋转墙壁时,边缘之间的比率并不总是改变。
还有什么我可以做的吗?

图片1:
image 1
预期输出:0度

图 2:
image 2

预期输出:20度左右

图 3:
image 3

预期输出:45度左右

最佳答案

基础数学

假设您有 2 个 2D 图像并且您希望找到它们之间的旋转。例如,第一张图片是正面平行 0 度。然后第二个是您希望找到的角度。

请从这里了解一些基础知识 https://www.ifi.uzh.ch/dam/jcr:5759a719-55db-4930-8051-4cc534f812b1/VO_Part_I_Scaramuzza.pdf

enter image description here

它是从图像特征对应中捕获 2D 到 2D 运动。涉及的数学太多了。我不会去的。本质上,您正在寻找一个等级为 2 且包含所有旋转和平移向量的基本矩阵

enter image description here

enter image description here

最小案例解决方案涉及五个 2-D-to-2-D 对应关系,如

E. Kruppa,“Zur ermittlung eines objektes aus zwei perspektiven mit
内在的东方,” Sitzungsberichte der Akademie der Wissenschaften,
维也纳,Mathematisch-Naturwissenschaftlichen Klasse,Abteilung IIa,
卷。 122,第 1939-1948、1913 页。

更流行的方法是 Longuet-Higgins 的八点算法。超过8个对应的匹配点。

只需列出匹配点,如下所示

enter image description here

由于您可以在 handle 之前校准相机,因此可以直接将F替换为E。

此外,如上图所示,您还必须通过 Multiview 几何书中的对极几何

如果您的相机是RGBD相机,那么您只需要3个点进行匹配,在第一个链接中称为3D到3D运动估计。

编码

假设你知道所有的背景数学。相应地安装opencv

假设您使用的图像在 img1 和 img2 中。 img 1 是正面平行线。图像 2 是您想要找到的旋转角度。

  Mat img_1_c = imread(filename1);
Mat img_2_c = imread(filename2); //each file should not have any color drawing inside

您可以手动编辑匹配点,例如带有中心点的 4 个角
vector<Point2f> points1, points2;  //each topic have at least 5 point inside

最简单的方法是在 OpenCV 中使用特征检测路由(可选)
  cvtColor(img_1_c, img_1, COLOR_BGR2GRAY);
cvtColor(img_2_c, img_2, COLOR_BGR2GRAY);
featureDetection(img_1, points1); //detect features in img_1
vector<uchar> status;
featureTracking(img_1,img_2,points1,points2, status); //track those features to img_2

如果基线移动太大,您可以使用检测器描述符匹配器方式。 (选修的)
SurfFeatureDetector detector(400);
vector<KeyPoint> keypoints1, keypoints2;
detector.detect(img_1, keypoints1);
detector.detect(img_2, keypoints2);

// computing descriptors
SurfDescriptorExtractor extractor;
Mat descriptors1, descriptors2;
extractor.compute(img_1, keypoints1, descriptors1);
extractor.compute(img_2, keypoints2, descriptors2);

// matching descriptors
BFMatcher matcher(NORM_L2);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);

// drawing the results
namedWindow("matches", 1);
Mat img_matches;
drawMatches(img_1, keypoints1, img_2, keypoints2, matches, img_matches);
imshow("matches", img_matches);

输入您的相机焦点和主点来自相机内在校准 https://docs.opencv.org/2.4/doc/tutorials/calib3d/camera_calibration/camera_calibration.html
  double focal = XXXX;
cv::Point2d pp(XXXXX, XXxxx); // this should be around the center of image if it is too far away, check you calibration process

Mat E, R, t, mask;
E = findEssentialMat(points2, points1, focal, pp, RANSAC, 0.999, 1.0, mask);
recoverPose(E, points2, points1, R, t, focal, pp, mask);

R 和 t 包含旋转和平移(不是真实世界的比例)。
Mat Euler_vec;
Rodrigues(R,Euler_vec);
cout<<Euler_vec<<endl;

然后 Euler_vec 应该包含您想要的角度。您要查找的值应位于第一列或最后一列

关于python - 从 2D 图像中查找墙壁的 Z 角位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56495725/

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