Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从二维图像查找墙的Z角位置_Python_Opencv_Image Processing - Fatal编程技术网

Python 从二维图像查找墙的Z角位置

Python 从二维图像查找墙的Z角位置,python,opencv,image-processing,Python,Opencv,Image Processing,我在现实生活中有一个3D矩形墙,可以转换成2D图像。考虑到我有他所有的4点坐标。我怎样才能找到他相对于相机的真实Z角位置 我试着用不同的角度来测量矩形的边与边之间的比率,通过这个,我可以找到常数,如果我将他乘以某些边的比率,它将给出当前的Z角。它不起作用,因为当旋转墙时,边之间的比率并不总是改变。 还有什么我能做的吗 图1: 预期输出:0度 图2: 预期输出:约20度 图3: 预期输出:大约45度基础数学 假设您有2个2D图像,并且希望找到它们之间的旋转。例如,第一个图像是正面平行0度。那么

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

我试着用不同的角度来测量矩形的边与边之间的比率,通过这个,我可以找到常数,如果我将他乘以某些边的比率,它将给出当前的Z角。它不起作用,因为当旋转墙时,边之间的比率并不总是改变。 还有什么我能做的吗

图1: 预期输出:0度

图2:

预期输出:约20度

图3:

预期输出:大约45度

基础数学

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

  Mat img_1_c = imread(filename1);
  Mat img_2_c = imread(filename2); //each file should not have any color drawing inside
请从这里复习一些基础知识

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

最小情况解决方案涉及五个二维到二维对应关系,如中所述

E.Kruppa,“我们的目标是在麻省理工学院工作。” “内部定位”是指“在Wissenschapten的基础上, 维恩,自然科学数学教授克拉斯,阿贝泰隆IIa, 第122卷,第1939-1948页,1913年

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

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

因为你可以在手柄之前校准相机,所以F可以直接用E代替

此外,您还必须阅读《多视图几何》一书中的极线几何,如上图所示

如果您的相机是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
R和t包含旋转和平移而非真实世界比例

Mat Euler_vec;
Rodrigues(R,Euler_vec);
cout<<Euler_vec<<endl;

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

first define Z-angle。是俯仰、侧倾还是偏航。你的身高是固定的吗,例如在汽车上?你能显示任何输入图像以及你在图纸中寻找的内容,以便其他人能帮助你理解吗?我添加了一些示例
  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);
Mat Euler_vec;
Rodrigues(R,Euler_vec);
cout<<Euler_vec<<endl;