从摄像机标定到用机器人手臂提取彩色立方体

2024-05-14 06:14:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用一个机器人手臂,用Python中的摄像机和OpenCV来检测彩色立方体。我设法检测到不同颜色的立方体,我用棋盘程序校准了相机。在

设置:

Setup frontSetup top

立方体检测:Cubes detected

问题是我不明白用摄像机从物体上获取坐标并将其转换到机器人手臂上进行拾取的其余过程。在

已完成以下步骤:

  1. 用HSV分离颜色边界并绘制边界框。所以我有物体的像素x,y。

  2. 校准摄像机,得到以下摄像机矩阵和失真系数:

    摄像机矩阵:[[1.42715609e+03 0.00000000 E+00 9.13700651e+02][0.00000000 E+00 1.43275509e+03 5.58917609e+02][0.00000000 E+00 0.00000000 E+00 1.00000000 E+00]]

    失真:[[0.03924722-0.30622971 0.00124042-0.00303094 0.49458539]]

  3. 试图找出OpenCV文档中的下一步

结果

我阅读了这个页面上的API文档:https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html

但以我的技术水平,我似乎不能提取实际步骤,以达到我的目标。在

我的问题:

  1. 如何使用摄像机矩阵和失真系数来获得图像帧中物体的坐标?在
  2. 如何将图像框上的坐标转换为机器人末端执行器的坐标?在
  3. 如果我把相机放在固定的位置。这是否意味着我只需要做校准?在

******编辑:*****

我选择了另一种方法。通过奇异值分解,解决了两个坐标系之间的旋转和平移问题。但是我犯了一个错误,我认为我可以使用像素坐标从相机坐标系转换到机器人坐标系。我想你需要先翻译u,v值。在

如何将像素uv转换为世界坐标,以便我可以使用下面的代码对机械臂进行平移和旋转?

我的代码是:

#######################################################################
# Step 1: Input camera and world coordinates, and calculate centroids #
#######################################################################
print("")

# Camera and robot to world coordinates
Pc = np.matrix([[604,119,0],[473,351,0], [730,329,0]])
print("Camera points matrix: ")
print(Pc)
print("")

Pr = np.matrix([[177,-38,0],[264,-93,0], [258,4.7,0]])
print("Robot points matrix: ")
print(Pr)
print("")

# Calculate centroids
Cc = Pc.mean(axis=0)
Cr = Pr.mean(axis=0)

print("Centroid camera: ")
print(Cc)
print("")
print("Centroid robot: ")
print(Cr)
print("")

# Pc and Pr - centroids of Pc and Pr
Pc_minus_Cc = np.subtract(Pc, Cc)
print("Pc - centroidC: ")
print(Pc_minus_Cc)
print("")

Pr_minus_Cr = np.subtract(Pr, Cr)
print("Pr - centroidR: ")
print(Pr_minus_Cr)
print("")

############################################################################
# Step 2: Calculate H, perform SVD and get rotation and translation matrix #
############################################################################

# Get H
print("(Pr - centroidR) transposed: ")
print(Pr_minus_Cr.T)
print("")
H = np.matmul(Pc_minus_Cc, Pr_minus_Cr.T)
print("H: ")
print(H)
print("")

# Perform SVD
u, s, v = np.linalg.svd(H)
print("SVD result: ")
print("u: ")
print("")
print(u)
print("")
print("s: ")
print(s)
print("")
print("v: ")
print(v)
print("")

# Calculate rotation matrix
R = np.matmul(v,u.T)
print("Rotation matrix: ")
print(R)

# Calculate t
t = -R * Cc.T + Cr.T
print("t: ")
print(t)

Tags: andnp机器人像素prmatrix摄像机物体
1条回答
网友
1楼 · 发布于 2024-05-14 06:14:18

到1)你已经有了在检测到的对象周围绘制方框的代码。所以你已经在矩阵中找到了坐标。如果没有,你可以做这样的事。在

        for c in contours:
        if cv2.contourArea(c) < self.min_area:
            continue
        # detected
        (x, y, w, h) = cv2.boundingRect(c)
        cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

而x+w/2是矩阵中的x

2)你不能直接,你需要一些方向点,这样手臂 知道你的矩阵在手臂世界的起始位置(x+y距离)

校准总是取决于你的光照条件,对吗?所以只要他们不改变你的口径就可以了。但事实证明需要不时进行校准,例如使用usb摄像头

相关问题 更多 >