- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个面向相当于棋盘的相机。我知道点的世界 3d 位置以及相机图像上相应投影点的 2d 位置。所有的世界点都属于同一个平面。我使用 solvePnP:
Matx33d camMat;
Matx41d distCoeffs;
Matx31d rvec;
Matx31d tvec;
std::vector<Point3f> objPoints;
std::vector<Point2f> imgPoints;
solvePnP(objPoints, imgPoints, camMat, distCoeffs, rvec, tvec);
然后我可以使用 projectPoints 从 3d 世界点转到 2d 图像点:
std::vector<Point2f> projPoints;
projectPoints(objPoints, rvec, tvec, camMat, distCoeffs, projPoints);
projPoints 非常接近 imgPoints。
如何使用与属于同一平面的 3d 世界点相对应的屏幕点进行反向操作。我知道从单一 View 来看,不可能重建 3d 位置,但我在同一平面上,所以这确实是一个 2d 问题。我可以计算反向旋转矩阵以及反向平移向量,但我该如何继续?
Matx33d rot;
Rodrigues(rvec, rot);
Matx33d camera_rotation_vector;
Rodrigues(rot.t(), camera_rotation_vector);
Matx31d camera_translation_vector = -rot.t() * tvec;
最佳答案
假设您通过 objpoints-imgpoints 对校准相机。注意第一个是校准板上特征点的真实世界三维坐标,第二个是每个图像中特征点的二维像素位置。所以它们都应该是包含校准板图像元素数量的列表。在执行以下 Python 代码行之后,您将获得校准矩阵 mtx、每个校准板的旋转 rvecs 及其平移 tvecs。
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, np.zeros(5,'float32'),flags=cv2.CALIB_USE_INTRINSIC_GUESS )
现在我们可以在假设下找到任何像素的 3D 坐标。该假设是我们需要定义一些引用点。假设我们的引用是第 0 个(第一个)校准板,其枢轴点位于 0,0,其中校准板的长轴为 x,短轴为 y 轴,校准板的表面也显示 Z= 0 平面。以下是我们如何创建投影矩阵。
# projection matrix
Lcam=mtx.dot(np.hstack((cv2.Rodrigues(rvecs[0])[0],tvecs[0])))
现在我们可以定义任何像素位置和所需的 Z 值。请注意,因为我想在引用校准板上投影 (100,100) 像素位置,所以我设置 Z=0。
px=100
py=100
Z=0
X=np.linalg.inv(np.hstack((Lcam[:,0:2],np.array([[-1*px],[-1*py],[-1]])))).dot((-Z*Lcam[:,2]-Lcam[:,3]))
现在我们有 (px,py) 像素的 X 和 Y 坐标,它是 X[0], X[1] 。X 的最后一个元素是 lambda 因子。结果我们可以说,像素在 (px,py) 位置落在第 0 个校准板表面的 X[0],X[1] 坐标上。
关于opencv - OpenCV projectPoints 的逆向,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34140150/
这是错误: imgpts, jac = cv2.projectPoints(axis, rvecs, tvecs, mtx, dist) cv2.error: OpenCV(4.2.0) C:\pro
我不断收到 断言失败(0 Generate3DPoints() { std::vector points; float x,y,z; x=.5;y=.5;z=.5; points.p
为什么我的代码片段给我的投影点结果很奇怪? //Generate the one 3D Point which i want to project onto 2D plane vector point
我正在使用 cv::projectPoints 获取 3D 点 vector 的相应像素。 这些点都离得很近。 问题是,对于某些点,我得到了正确的像素坐标,但对于其他点,我得到了奇怪的负值,例如 -2
我正在尝试编写自己的 cv2.projectPoints 实现只是为了练习,我的实现没有达到预期的效果。 我假设针孔相机没有失真,所以我所做的就是将以下等式应用于我所有的平面物点。 假设在某个世界空间
我有一个面向相当于棋盘的相机。我知道点的世界 3d 位置以及相机图像上相应投影点的 2d 位置。所有的世界点都属于同一个平面。我使用 solvePnP: Matx33d camMat; Matx41d
当我使用下面的java代码和最简单的输入运行projectPoints函数时,我得到了我认为不正确的答案。我错过了什么吗? 我得到了这个答案 (x,y,z)= [{0.0, 1.0, 1.0}, {0
我正在尝试使用 OpenCV 量化相机校准的准确性。在我的程序中,我正在读取棋盘图案的图像并调用 calibrateCamera 函数来初步猜测我的相机内部和外部。我知道仅使用一张图像不会产生完美的校
我正在使用 OpenCV 的 calibrateCamera 并试图了解它如何计算重投影误差以及该误差代表什么。它似乎是投影点和测量图像点之间的(欧几里得)距离的 RMS——对吗?然而,最终的重投影误
我有一个 3D 世界,我正尝试使用 cv2.projectPoints 将其映射到 2D View ,但它并不像我预期的那样运行。我对 opencv、numpy 和矩阵操作的掌握很薄弱,所以我一定是在
我正在尝试在场景的父 View 上的球体上绘制一个框架,但由于某种原因,由 SCNScene.projectPoint 方法转换的点被置换了。 为简单起见,我在场景中心创建了一个半径为 2 的球体。球
我已按照 https://docs.opencv.org/master/d7/d53/tutorial_py_pose.html 上的教程进行操作基于在 https://docs.opencv.org
我想校准我的相机并绘制 xyz 轴。 (如此链接所示:http://docs.opencv.org/3.1.0/d7/d53/tutorial_py_pose.html) 不幸的是,我的校准有些奇怪,
根据我的理解,undistortPoints 在扭曲图像上获取一组点,并计算它们的坐标在同一图像的未扭曲版本上的位置。同样,projectPoints 将一组对象坐标映射到它们对应的图像坐标。 但是,
在相机校准中,我使用 calibrateCamera() 从校准图案的多个 View 中查找相机参数。它恰恰做了两件事: 1) 假设镜头畸变为零,估计封闭形式的初始相机参数。 2) 运行全局 Leve
我想从 SCNNode 检索屏幕坐标,这样我就可以在 SpriteKit 叠加层中使用这些坐标。该节点是一个子节点。当我旋转父节点的枢轴 projectPoint 时返回乱码结果。 场景: class
SceneKit 的 renderer(_:updateAtTime:) 在后台线程上运行。 Apple 已表示不要在 NSView 和主线程外的子类上调用任何方法。 projectPoint(_:)
我正在展示一个由 SceneKit 中的多个 SNNode 组成的 3d 模型。 我在 sceneview-overlay View 上显示一个 2D SpriteKit 节点。 2D 节点位置应始终
我是一名优秀的程序员,十分优秀!