各位同志,对于这样一个装件台,有30个装件孔可以用于装件,我是想用双目相机识别30个孔以及每个孔上是否有工件,工件就3种形状,圆形、正方形、三角形,我想要识别工件的类型和位姿,并且与机械手臂标定。请问各位同志有什么解决方案吗?双目相机,识别姿势是因为,还有一个装工件的地方,和工件形状是一样的,所以形状和姿势得对上。

各位同志,对于这样一个装件台,有30个装件孔可以用于装件,我是想用双目相机识别30个孔以及每个孔上是否有工件,工件就3种形状,圆形、正方形、三角形,我想要识别工件的类型和位姿,并且与机械手臂标定。请问各位同志有什么解决方案吗?双目相机,识别姿势是因为,还有一个装工件的地方,和工件形状是一样的,所以形状和姿势得对上。

阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
机器视觉识别工件类型和位姿的实现
根据你的需求,我给出以下解决方案:
stereoCalibrate 函数进行标定。findContours 函数检测工件的轮廓。可以使用 cv2.RETR_EXTERNAL 和 cv2.CHAIN_APPROX_SIMPLE 参数来检测外部轮廓。moments 函数计算工件的矩,并根据矩的值来识别工件的类型。核心代码
import cv2
import numpy as np
# 双目相机标定
ret, camera_matrix, dist_coeffs, _, _, _, _, _ = cv2.stereoCalibrate(
objpoints, imgpoints, camera_matrix, dist_coeffs, rvecs, tvecs, flags=cv2.CALIB_SAME_FOCAL_LENGTH
)
# 工件检测
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
contours, _ = cv2.findContours(gray, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 工件类型识别
for contour in contours:
moments = cv2.moments(contour)
if moments['m00'] != 0:
x = int(moments['m10'] / moments['m00'])
y = int(moments['m01'] / moments['m00'])
area = moments['m00']
if area > 100: # 根据工件的大小来识别
if area > 200: # 圆形工件
cv2.circle(img, (x, y), int(np.sqrt(area / np.pi)), (0, 255, 0), 2)
elif area > 100: # 正方形工件
cv2.rectangle(img, (x, y), (x + int(np.sqrt(area)), y + int(np.sqrt(area))), (0, 0, 255), 2)
else: # 三角形工件
cv2.drawContours(img, [contour], -1, (255, 0, 0), 2)
# 位姿估计
stereo_matcher = cv2.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo_matcher.compute(gray, gray)
depth = cv2.reprojectImageTo3D(disparity, camera_matrix)
# 机械手臂标定
# 使用机械手臂的标定数据来计算工件的世界坐标
注意:上述代码仅提供了一个基本的解决方案,可能需要根据具体的需求和场景进行调整和优化。