英文:
Why are rvecs and tvecs different for every view in OpenCV's calibratecamera?
问题
我很难理解cv2.calibrateCamera
输出中revecs
和tvecs
的真正含义。据我理解,它们共同定义了相机的姿态,即相机的位置和方向。
然而,如果我将从同一相机拍摄的多个视图传递给cv2.calibrateCamera
,我会得到每个视图的rvecs
和tvecs
。如果相机没有移动,它们不应该是相同的吗?
我的第一张图像的单应矩阵定义如下:
K = mtx
R = cv2.Rodrigues(rvecs[0])[0]
T = tvecs[0]
RT = np.concatenate((R,T),axis=1)
H = np.dot(K, RT)
我可以看到它投影得很正确。按照我理解的单应性,如果相机没有移动,它应该对每个图像保持不变。但是如果R和T在变化,H也会变化。
看起来我可能漏掉了关于OpenCV中rvecs
和tvecs
定义方式的一些非常重要的东西。
英文:
I'm struggling to understand the real meaning of revecs
and tvecs
in the output of cv2.calibrateCamera
. As I understand them, together they define the pose of the camera, meaning position and orientation of the camera.
However, if I pass multiple views shot from the same camera to cv2.calibrateCamera
I get rvecs
and tvecs
for every view. Shouldn't they be the same if the camera didn't move?
My homography matrix for the first image is defined by
K = mtx
R = cv2.Rodrigues(rvecs[0])[0]
T = tvecs[0]
RT = np.concatenate((R,T),axis=1)
H = np.dot(K, RT)
And I can see that it projects correctly. The way I understand homography it should stay the same for every image as the camera is not moving. However if R, T are changing H will change too.
It seems like I'm missing something very important about the way rvecs
and tvecs
are defined in OpenCV.
答案1
得分: 1
在校准中,没有世界坐标系。
对于每张图片,只有图案(物体)的框架和相机的框架,它们之间由一个变换关系(每张图片一个)相关联。
您可以决定是否有一个共同的相机框架(图案移动)或一个共同的图案框架(相机移动)。这对于校准没有影响。
文档中说:
> 从物体坐标空间到相机坐标空间执行基底变换
(物体 = 图案)
相应的变换矩阵可以写成
因为这就是矩阵和向量的组合方式。您可以像多米诺骨牌一样排列它们,其中框架匹配。如果您想要将一个点从物体局部坐标变换到相机局部坐标,这是计算方法:
它可以通过应用 cv.Rodrigues()
来获得一个3x3旋转矩阵,然后将其与平移向量组合成一个4x4矩阵。
2: https://latex.codecogs.com/png.image?%5Cdpi%7B150%7D%5Cbg%7Bwhite%7D%5E%5Ctext%7BC%7D%5Cboldsymbol%7BT%7D_%5Ctext%7B物体%7D=%5Cbegin%7Bpmatrix%7D R&t%5C%5C0&1%5Cend%7Bpmatrix%7D
该变换意味着,如果您围绕模型原点旋转图案,则 tvec 不应该改变,而 tvec 具有 +X 将对应于图案位于相机前面空间的右半部分(+Y 在底半部分)。
如果您想要从相机局部坐标变换到物体局部坐标,您需要反转变换。
英文:
In calibration, there is no world coordinate system.
For each picture, there is only the frame of the pattern (object) and the frame of the camera, related by one transformation (per picture).
You decide if you have a common camera frame (pattern moving) or a common pattern frame (camera moving). This does not matter for the calibration.
Docs say:
> performs a change of basis from object coordinate space to camera coordinate space
(object = pattern)
The corresponding transformation matrix would be written as
because that is how matrices and vectors compose. You can line them up like dominos, where the frames match. If you wanted to transform a point from object-local to camera-local, this is the calculation:
And it can be built from applying cv.Rodrigues()
to obtain a 3x3 rotation matrix, then combining that with the translation vector, into a 4x4 matrix.
That transformation implies that if you rotate the pattern around its model origin, the tvec should not change, and that a tvec having +X would correspond to the pattern being in the right half of the space in front of the camera (and +Y in the bottom half).
If you want to transform from camera-local coordinates into object-local coordinates, you need to invert the transformation.
答案2
得分: 0
rvec
和tvec
允许将世界坐标系中的点映射到相机坐标系中。如果您更改您的世界坐标系的原点或方向(如果您的世界坐标系与棋盘对齐,并且棋盘在每个帧中改变方向/位置,这可能是情况),那么rvec
和tvec
也会改变,即使相机没有实际改变位置。
英文:
rvec
and tvec
allows to map points in WORLD coordinate system to CAMERA coordinate system. If you change your world coordinate system origin or orientation (which is probably the case if your world coordinate system is aligned with a chessboard and the chessboard is changing orientation/position in each frame), then it will change rvec
and tvec
too even if the camera did not physically change position.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论