ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

手眼标定(eye-in-hand)-实现

2021-06-28 17:04:07  阅读:819  来源: 互联网

标签:eye frame cv2 标定 hand points params 3d 手眼


目录

一、使用标定板类型

二、标定步骤及实现

2.1 相机外参标定

2.2 手眼标定


一、使用标定板类型

使用的是非对称圆分布的标定板如下图

二、标定步骤及实现

opencv实现

2.1 相机外参标定

相机外参标定结果点如下图,红色点为标定结果还原的点,绿色点为原始点

相机外参标定实现

def calibrate():
    #相机内参
    cameraMatrix =np.array([[2753.8901912306533,0,949.2910576185922],
                           [0,2753.5946107288023,593.6244109240248],
                           [0,0,1]])
    distCoeffs =np.array([
            -0.06501463142556438,
            0.1712297534594541,
            5.265462242831182e-05,
            0.00032355313360590214,
            0
        ])
    #标定板行列数
    pattern_shape=(4,5)
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
    #标定板上圆心的物理坐标定义(根据标定板的规格:间距为35mm)
    example_3d = np.array([[0,0,0],[70,0,0], [140,0,0],[210,0,0],
        [35,35,0],[105,35,0],[175,35,0],[245,35,0],
        [0,70,0],[70,70,0],[140,70,0],[210,70,0],
        [35,105,0],[105,105,0],[175,105,0],[245,105,0],
        [0,140,0],[70,140,0],[140,140,0],[210,140,0],
    ],dtype="float32")
    example_3d = example_3d*0.001#单位是米

    points_3d = []
    points_2d = []
    images = glob.glob('G:/calib_images/EyeInHand/*.jpg')  # 拍摄的十几张标定板图片所在目录
    for fname in images:
        # ret, frame = camera.cap.read()
        print(fname)
        frame = cv2.imread(fname)
        # assert ret
        gray_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        ret, bin = cv2.threshold(gray_frame, 171, 255, cv2.THRESH_BINARY)
        k = np.ones((5, 5), np.uint8)
        bin_CLOSE = cv2.morphologyEx(bin, cv2.MORPH_CLOSE, k)
        # cv2.imshow("bin", bin_CLOSE)
        # cv2.waitKey(0)
        params = cv2.SimpleBlobDetector_Params()
        params.filterByArea = True
        params.maxArea = 24034
        params.minArea = 961

        params.filterByColor = True
        params.filterByConvexity = False
        params.blobColor = 255
        params.minThreshold = 171
        params.maxThreshold = 251
        params.minDistBetweenBlobs = 50

        params.filterByInertia = True
        params.minInertiaRatio = 0.01

        blobDetector = cv2.SimpleBlobDetector_create(params)

        ret, corners = cv2.findCirclesGrid(
            bin_CLOSE, pattern_shape, flags=cv2.CALIB_CB_ASYMMETRIC_GRID ,blobDetector =blobDetector
        )
        if ret:
            corners2 = cv2.cornerSubPix(bin_CLOSE, corners, (11, 11), (-1, -1), criteria)
            points_3d.append(example_3d.copy())
            points_2d.append(corners2)
            print("Found calibration %i " % (len(points_3d)))
            drawn_frame = cv2.drawChessboardCorners(frame, pattern_shape, corners2, corners is not None)
            cv2.imwrite('drawn_frame.jpg',drawn_frame)
            # cv2.imshow("calib", drawn_frame)
            ret, camera_matrix, distortion_coefficients, rvecs, tvecs = cv2.calibrateCamera(points_3d, points_2d,
                                                                                            gray_frame.shape[::-1],
                                                                                            cameraMatrix, distCoeffs)  #cameraMatrix, distCoeffs
            # print(camera_matrix)
            # print(distortion_coefficients)
            # Ret, rvec, tvec = cv2.solvePnP(example_3d, corners2, cameraMatrix, distCoeffs)
            #将物理坐标还原回像素坐标查看标定精度
            imgpts, jac = cv2.projectPoints(points_3d[-1], rvecs[-1], tvecs[-1], camera_matrix, distortion_coefficients)
            img = draw(frame, corners2, imgpts)#画图显示像素点和标定还原点
            cv2.imshow('',img)
            cv2.waitKey(0)
            # plt.show()
        # cv2.waitKey(10)
        # break


    ret, camera_matrix, distortion_coefficients, rvecs, tvecs = cv2.calibrateCamera(points_3d, points_2d, gray_frame.shape[::-1], cameraMatrix, distCoeffs)#

    print('camera_matrix:\n',camera_matrix)
    assert ret
    return rvecs, tvecs

2.2 手眼标定

手眼标定也使用opencv中的方法实现,代码如下

Rcf,Tcf = cv2.calibrateHandEye(Rfbs,Tfbs,Rtcs,Ttcs,method=cv2.CALIB_HAND_EYE_ANDREFF)

标签:eye,frame,cv2,标定,hand,points,params,3d,手眼
来源: https://blog.csdn.net/Bolly_He/article/details/118306721

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有