我想用一个机器人手臂,用Python中的摄像机和OpenCV来检测彩色立方体。我设法检测到不同颜色的立方体,我用棋盘程序校准了相机。在
设置:
问题是我不明白用摄像机从物体上获取坐标并将其转换到机器人手臂上进行拾取的其余过程。在
已完成以下步骤:
用HSV分离颜色边界并绘制边界框。所以我有物体的像素x,y。
校准摄像机,得到以下摄像机矩阵和失真系数:
摄像机矩阵:[[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]]
试图找出OpenCV文档中的下一步
结果
我阅读了这个页面上的API文档:https://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html
但以我的技术水平,我似乎不能提取实际步骤,以达到我的目标。在
我的问题:
******编辑:*****
我选择了另一种方法。通过奇异值分解,解决了两个坐标系之间的旋转和平移问题。但是我犯了一个错误,我认为我可以使用像素坐标从相机坐标系转换到机器人坐标系。我想你需要先翻译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)
到1)你已经有了在检测到的对象周围绘制方框的代码。所以你已经在矩阵中找到了坐标。如果没有,你可以做这样的事。在
而x+w/2是矩阵中的x
2)你不能直接,你需要一些方向点,这样手臂 知道你的矩阵在手臂世界的起始位置(x+y距离)
校准总是取决于你的光照条件,对吗?所以只要他们不改变你的口径就可以了。但事实证明需要不时进行校准,例如使用usb摄像头
相关问题 更多 >
编程相关推荐