- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在尝试获取空间中几个点的 3D 坐标,但我从 undistortPoints()
和 triangulatePoints()
都得到了奇怪的结果。
由于两个相机的分辨率不同,我分别校准,得到0,34
和0,43
的RMS误差,然后使用stereoCalibrate( )
得到更多的矩阵,得到 0,708
的 RMS,然后使用 stereoRectify()
得到剩余的矩阵。有了这个,我开始着手收集坐标,但结果很奇怪。
例如输入为:(935, 262)
,undistortPoints()
输出为(1228.709125, 342.79841)
为一点,而另一个是 (934, 176)
和 (1227.9016, 292.4686)
。这很奇怪,因为这两个点都非常靠近帧的中间,那里的失真最小。我没想到它会将它们移动 300 像素。
当传递给 traingulatePoints()
时,结果变得更奇怪了——我已经测量了现实生活中三个点之间的距离(用尺子),并计算了每张图片上像素之间的距离.因为这一次点在一个相当平坦的平面上,所以这两个长度(像素和实数)匹配,如 |AB|/|BC|在这两种情况下都是大约 4/9。然而,triangulatePoints()
给了我偏离轨道的结果,|AB|/|BC|为 3/2 或 4/2。
这是我的代码:
double pointsBok[2] = { bokList[j].toFloat()+xBok/2, bokList[j+1].toFloat()+yBok/2 };
cv::Mat imgPointsBokProper = cv::Mat(1,1, CV_64FC2, pointsBok);
double pointsTyl[2] = { tylList[j].toFloat()+xTyl/2, tylList[j+1].toFloat()+yTyl/2 };
//cv::Mat imgPointsTyl = cv::Mat(2,1, CV_64FC1, pointsTyl);
cv::Mat imgPointsTylProper = cv::Mat(1,1, CV_64FC2, pointsTyl);
cv::undistortPoints(imgPointsBokProper, imgPointsBokProper,
intrinsicOne, distCoeffsOne, R1, P1);
cv::undistortPoints(imgPointsTylProper, imgPointsTylProper,
intrinsicTwo, distCoeffsTwo, R2, P2);
cv::triangulatePoints(P1, P2, imgWutBok, imgWutTyl, point4D);
double wResult = point4D.at<double>(3,0);
double realX = point4D.at<double>(0,0)/wResult;
double realY = point4D.at<double>(1,0)/wResult;
double realZ = point4D.at<double>(2,0)/wResult;
点之间的角度有点好,但通常不是:
`7,16816 168,389 4,44275` vs `5,85232 170,422 3,72561` (degrees)
`8,44743 166,835 4,71715` vs `12,4064 158,132 9,46158`
`9,34182 165,388 5,26994` vs `19,0785 150,883 10,0389`
我尝试在整个帧上使用 undistort()
,但得到的结果同样奇怪。 B 点和 C 点之间的距离应该在任何时候都几乎没有变化,但这就是我得到的:
7502,42
4876,46
3230,13
2740,67
2239,95
逐帧。
角度:
最佳答案
函数 cv::undistort 一次性完成去失真和重投影。它执行以下操作列表:
如果你通过矩阵 R1,P1 分别。 R2, P2 来自 cv::stereoCalibrate(),输入点将不失真和校正。校正意味着图像以某种方式转换,使得对应点具有相同的 y 坐标。图像校正没有唯一的解决方案,因为您可以对两个图像应用任何平移或缩放,而无需更改对应点的对齐方式。话虽如此, cv::stereoCalibrate() 可以使投影中心偏移很多(例如 300 像素)。如果你想要纯粹的不失真,你可以传递一个身份矩阵(而不是 R1)和原始相机矩阵 K(而不是 P1)。这应该会导致像素坐标与原始坐标相似。
关于c++ - OpenCV undistortPoints 和 triangulatePoint 给出奇怪的结果(立体声),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32227595/
我有一个 (x,y) 点、一个 3x3 相机矩阵和 4 个失真系数,我想得到未失真的点。我的代码看起来像这样...... double distorted_point_x = 10; double_d
我使用 openCV 函数 projectPoints() 来旋转、平移和投影一组 3D 点,并使用 solvePnp() 来找到这个旋转和平移。当镜头畸变系数全部为零时,这很有效,否则就会失败。完全
我正在使用 OpenCV 的失真模型进行一些测试。基本上我所做的是,实现失真方程并查看 cv::undistortPoints 函数是否给出这些方程的反函数。我意识到 cv::undistortPoi
我试图理解 OpenCV 的 cv::undisortPoints() 迭代逼近算法背后的逻辑。 实现可在以下位置获得: https://github.com/Itseez/opencv/blob/m
我正在编写我的相机校准算法,遇到以下困难。 给定针孔相机模型,则通过以下公式对径向变形进行建模 其中x,y是理想的标准化图像坐标,x_head是变形后x的坐标。 问题是如何为逆失真函数找到k1,k2,
我正在尝试使用 OpenCV Python 中的结构光对来自投影仪和相机的点进行三角测量。在这个过程中,我有一个在相机和投影仪之间一对一匹配的元组列表。我将其传递给 cv2.undistortedPo
我试图通过使用带有两个摄像头的 OpenCV 2.3.1 来确定两个对象之间的距离,但无法计算对象的对象点(OCV 2.3.1、MSVC++、Windows 7)。我认为这是因为在计算视差之前没有对图
我正在尝试使用 OpenCV 的“取消扭曲点”方法取消扭曲图像的某些点,但没有成功。 这些将是我的无失真系数 optic_camera_matrix: [[710.52285, 0.0,
我正在尝试找到捕获同一场景的两个摄像机(或者实际上是一个移动摄像机)之间的欧氏变换,其中校准数据 K(内部参数)和 d(失真系数)是已知的。我通过提取特征点、匹配它们并使用最佳匹配作为对应来做到这一点
为了更广泛的受众,我在这里重新发布了我在 answers.opencv.org 上提出的问题 TL;DR:传递给 undistortPoints、findEssentialMat 和 recoverP
我一直在使用 opencv,但我似乎无法让 undistortPoints 工作。它返回的矩阵只有 NaN 值。 //newKeyPoints is std::vector, and it's
为了测试,我生成了一个网格图像作为矩阵,并再次将网格点作为点数组: 这表示“扭曲”的相机图像以及一些特征点。当我现在取消扭曲图像和网格点时,我得到以下结果: (请注意,“失真”图像是直的而“未失真”图
根据我的理解,undistortPoints 在扭曲图像上获取一组点,并计算它们的坐标在同一图像的未扭曲版本上的位置。同样,projectPoints 将一组对象坐标映射到它们对应的图像坐标。 但是,
我正在尝试获取空间中几个点的 3D 坐标,但我从 undistortPoints() 和 triangulatePoints() 都得到了奇怪的结果。 由于两个相机的分辨率不同,我分别校准,得到0,3
我尝试纠正图像和图像上的一些点。纠正图像效果很好(这部分代码不是我的): (mapx, mapy) = cv2.initUndistortRectifyMap(camera_matrix,dist_c
我在格式化要传递给 undistortPoints (opencv 2.4.1) 的 x,y 点列表时遇到问题。 错误消息是特定于 C++ 的,并提示点数组不是 CV_32FC2 类型。难道我不能传入
我是一名优秀的程序员,十分优秀!