非对称圆形标定板

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/weixin_43526787/article/details/88736980

如图为我使用的4x11非对称圆图案标定板,标定板的尺寸为square_size = 17.2525mm,这里的square_size为半圆心距长(即每一行相邻两个圆心的圆心距的一半)。

我所使用的标定程序是在opencv sample文件夹下自带的calibration.cpp文件的基础上进行修改的。

一共主要有三个部分需要进行修改(其余细节可能需要稍微修改)

1、设置棋盘格参数改为设置非对称圆图案标定板参数:

标定程序中标定板的尺寸只需要行列信息和半圆心距信息,如下:


 
 
  1. float square_size = 17.2525;
  2. Size board_size = Size( 4, 11); /* 标定板上每行、列的角点数 */

2、提取角点部分

将标定代码中的提取棋盘格角点的代码部分改为使用opencv的findCirclesGrid()函数提取标定图片中的圆心坐标,代码如下:


 
 
  1. /* 提取角点 */
  2. if ( false == findCirclesGrid(imageInput, board_size, image_points_buf, CALIB_CB_ASYMMETRIC_GRID))
  3. {
  4. cout << filename << endl; // 找不到角点
  5. std::system( "pause");
  6. continue;
  7. }

3、初始化标定板上角点的三维坐标部分

注释部分为原棋盘格的设置,修改为非对称圆图案标定板,第18行其实就是画出4x11非对称圆图案的圆心的过程,稍加思考即可理解!


 
 
  1. /* 初始化标定板上角点的三维坐标 */
  2. int i, j, t;
  3. for (t = 0; t < image_count; t++)
  4. {
  5. vector<Point3f> tempPointSet;
  6. for (i = 0; i < board_size.height; i++)
  7. {
  8. for (j = 0; j < board_size.width; j++)
  9. {
  10. Point3f realPoint;
  11. /* 假设标定板放在世界坐标系中z=0的平面上 */
  12. /*
  13. realPoint.x = i * square_size.width;
  14. realPoint.y = j * square_size.height;
  15. realPoint.z = 0;
  16. */
  17. tempPointSet.push_back(Point3f(( float)(( 2 * j + i % 2)*square_size), i*square_size, 0));
  18. // tempPointSet.push_back(realPoint);
  19. }
  20. }
  21. object_points.push_back(tempPointSet);
  22. }

 

 

小白发博客诚惶诚恐,如有疑问欢迎在下方进行交流!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
以下是圆形非对称靶标相机标定的Python代码代码中有详细的注释说明: ```python import numpy as np import cv2 # 定义圆形非对称靶标的行列数和每个小格子的大小 rows = 6 cols = 9 square_size = 20 # 单位为毫米 # 生成标定板角点的世界坐标系坐标 objp = np.zeros((rows * cols, 3), np.float32) objp[:, :2] = np.mgrid[0:cols, 0:rows].T.reshape(-1, 2) * square_size # 存储所有的角点坐标 objpoints = [] # 世界坐标系中的坐标 imgpoints = [] # 图像坐标系中的坐标 # 读取所有标定图片并提取角点坐标 images = glob.glob('calibration_images/*.jpg') for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 查找角点 ret, corners = cv2.findCirclesGrid(gray, (cols, rows), flags=cv2.CALIB_CB_ASYMMETRIC_GRID) # 如果找到了角点,则添加到objpoints和imgpoints中 if ret == True: objpoints.append(objp) imgpoints.append(corners) # 在图像上绘制角点 cv2.drawChessboardCorners(img, (cols, rows), corners, ret) cv2.imshow('img', img) cv2.waitKey(500) cv2.destroyAllWindows() # 进行相机标定 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) # 打印标定结果 print("相机内参矩阵:\n", mtx) print("畸变系数:\n", dist) # 校正图像 img = cv2.imread('calibration_images/test_image.jpg') h, w = img.shape[:2] newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h)) dst = cv2.undistort(img, mtx, dist, None, newcameramtx) # 显示校正前后的图像 cv2.imshow('original', img) cv2.imshow('corrected', dst) cv2.waitKey(0) cv2.destroyAllWindows() ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值