python-3.x - 动态相机标定OpenCV python3

标签 python-3.x opencv camera-calibration inverse-kinematics

我正计划制作一个机械臂。我的 ARM 上安装了一个摄像头。我正在使用 Opencv 和 python3 来做 IP。

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

这里的问题是我已经针对特定高度(20 厘米)校准了相机。因此,正确的世界坐标仅在 20 厘米的高度处接收到。我希望相机在向地面(向下)移动时每 2 秒校正一次读数。

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

最佳答案

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

克服这个问题的聪明方法是轻松消除旋转矢量和平移矢量。

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

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

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

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 中。

关于python-3.x - 动态相机标定OpenCV python3,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51581748/

相关文章:

python - 如何使 pyodbc 输出更具可读性/更好?

python-3.x - Slack 上未显示交互式响应

python - 在 Python 中绘制曲线

opencv - 查找数码相机的固有参数

python - OpenCV 无法找到棋盘角

opencv - ISO调整和亮度公式的代码实现

python - 追加到 Python 中的列表理解返回 None

python - 如何从角点检测给出的点数组中检测特定的坐标点?

opencv - 使用OpenCV获取拼图的单像素线轮廓

python - 从字节串到 Python 中的 OpenCV 的 IplImage?