首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >动态摄像机校准OpenCV python3

动态摄像机校准OpenCV python3
EN

Stack Overflow用户
提问于 2018-07-29 23:19:23
回答 1查看 112关注 0票数 1

我打算做一只机械臂。我在手臂上装了个摄像头。我正在使用带有python3的Opencv来做IP。

我想让手臂探测到地面上的点,并让伺服系统相应地移动。我已经完成了检测和计算世界坐标的部分。此外,还需要反向运动学。

这里的问题是,我已经校准了相机的某个高度(20厘米)。因此,仅在20厘米的高度接收到正确的世界坐标。我希望相机每隔2秒就向地面(向下)移动一次,不断修正读数。

有没有一种方法可以动态地进行校准,并为我的手臂提供动态坐标?我不知道这是不是正确的方法。如果有其他方法可以做到这一点,请帮助。

EN

回答 1

Stack Overflow用户

发布于 2018-07-29 23:45:33

我假设您使用undistort函数首先使图像不失真,然后使用旋转向量(rcvt)和平移向量(tvct)以及distortCoeffs来获得世界坐标。由于rvcttvct将根据用于校准的(棋盘的)正方形大小而变化,因此只能在该特定高度获得正确的坐标。

克服这个问题的一个聪明的方法是很容易地消除旋转向量和平移向量。

由于摄像机校准常数在任何高度/旋转下都保持不变,因此可以在此使用。此外,不是每2秒校准一次(这会消耗太多CPU),而是直接使用下面的方法获取值!

假设(img_x, img_y)是您需要转换为世界坐标(world_x, world_y)的图像坐标,cameraMatrix是您的相机矩阵。对于此方法,您需要知道distance_cam,即对象与摄影机的垂直距离。

使用python和opencv,使用以下代码:

代码语言:javascript
运行
复制
import numpy as np
from numpy.linalg import inv

img_x, img_y = 20, 30 # your image coordinates go here
world_coord = np.array([[img_x], [img_y], [1]]) # create a 3x1 matrix
world_coord = inv(cameraMatrix) * world_coord # use formula cameraMatrix^(-1)*coordinates
world_coord = world_coord * distance_cam 
world_x = world_coord[0][0]
world_y = world_coord[1][1]
print(world_x, world_y)

起初,我们可能没有意识到世界坐标中的单位并不重要。在乘以相机矩阵的倒数之后,你已经定义了x/z的比率,它是无单位的。因此,您可以选择任何单位的distance_cam,最终结果将以distance_cam为单位,也就是说,如果distance_cammm为单位,那么world_x, world_y也将以mm为单位。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51581748

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档