OpenCV3.1.0的calibrateCamera()函数计算相机内参数

        OpenCV3.1.0计算相机内参数的函数calibrateCamera与1.0的cvCalibrateCamera2相比,发生了较大变化,主要是有关参数由Mat变成了ArrayArrayOfArrays ,下面是我运行成功的一个程序:


int boards_num = 40;     // 共40幅棋盘格图像
int board_w = 6;         //6*8个角点
int board_h = 8;         //6*8个角点
int n_board_pts = board_w * board_h;   //每幅图的角点数量
CvSize board_size = cvSize(board_w, board_h);

vector<Point2f> img_ptsTemp;                      //装载单幅棋盘格角点的像素坐标,长度等于角点个数

vector<vector<Point2f>> img_ptsVector;     //装载所有棋盘格角点的像素坐标,长度等于棋盘格数量

vector<Point3f> obj_ptsTemp;                       //装载单幅棋盘格角点的世界坐标,长度等于角点个数        
vector<vector<Point3f>> obj_ptsVector;      //装载所有棋盘格角点的世界坐标,长度等于棋盘格数量

CvSize board_img_size;       //棋盘格所在图像的尺寸


if (getChessCorners(frame, board_size, corners) == 0)

{
for (int i = 0; i < n_board_pts; i++)
{
img_ptsTemp.push_back(Point2f(corners[i].x, corners[i].y));        //加载角点坐标
}

img_ptsVector.push_back(img_ptsTemp);
img_ptsTemp.clear();

cvDrawChessboardCorners(frame, board_size, corners, n_board_pts, 1);
cout << real_boards_num << endl;
}


加载世界坐标:

for (int i = 0, k = 0; i < boards_num; i++)
{
for (int j = 0; j < n_board_pts; j++)
{
obj_ptsTemp.push_back(Point3f((float)(j / board_w), (float)(j % board_w), 0.0));
}

obj_ptsVector.push_back(obj_ptsTemp);
obj_ptsTemp.clear();     //一定要清空,否则会连着前面加载的数据
}


// 摄像机参数
Mat intrinsic_mat;
Mat distortion_coeffs;
vector<Mat> rotation_vectors;
vector<Mat> translation_vectors;


calibrateCamera(obj_ptsVector,     
                      img_ptsVector,     
      board_img_size, 
      intrinsic_mat, 
      distortion_coeffs, 
      rotation_vectors,         //若不需要,也可设为cv::noArray(),
      translation_vectors,
      CV_CALIB_RATIONAL_MODEL);


printf("INTRINSIC MATRIX: \n");
cout << intrinsic_mat << endl;

printf("DISTORTION VECTOR: \n");
cout << distortion_coeffs << endl;








  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Python中,使用OpenCV库中的`calibrateCamera`函数可以进行相机标定,从而计算相机的内参和外参,以实现从平面坐标到实际坐标的转换。以下是使用`calibrateCamera`函数进行相机标定的基本步骤: 1. 准备标定图像:你需要准备一组已知尺度的标定板图片,这些图片用于检测标定板上的角点。 2. 检测角点:使用`findChessboardCorners`函数检测标定板图片上的角点。 3. 提取角点坐标:使用`cornerSubPix`函数对检测到的角点进行亚像素级精确化,以获得更准确的角点坐标。 4. 标定:将所有角点坐标和对应的图像点传递给`calibrateCamera`函数,进行相机标定。 5. 获取内参和外参矩阵:`calibrateCamera`函数会返回相机内参矩阵、畸变系数以及(可选的)外参矩阵。 6. 使用标定结果进行坐标转换:有了内参矩阵和畸变系数,可以使用`undistort`函数来校正图像畸变。然后,如果需要将图像上的点转换为实际世界坐标,可以使用`projectPoints`函数进行透视变换。 请参考以下示例代码: ```python import numpy as np import cv2 import glob # 准备对象点,如 (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) # 假设标定板为7x6的棋盘格 objp = np.zeros((6*7, 3), np.float32) objp[:,:2] = np.mgrid[0:7, 0:6].T.reshape(-1, 2) # 用于存储所有图片的对象点和图像点的数组 objpoints = [] # 真实世界中的3D点 imgpoints = [] # 图像中的2D点 # 读取标定图像 images = glob.glob('calibration_images/*.jpg') for fname in images: img = cv2.imread(fname) gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 找到棋盘格角点 ret, corners = cv2.findChessboardCorners(gray, (7,6), None) # 如果找到了,添加对象点,图像点 if ret == True: objpoints.append(objp) imgpoints.append(corners) # 绘制并显示角点 img = cv2.drawChessboardCorners(img, (7,6), 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) # 计算标定板上一个点的世界坐标到图像坐标的转换矩阵 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) h, w = img.shape[:2] newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w,h), 1, (w,h)) # 使用标定结果进行坐标转换 for fname in images: img = cv2.imread(fname) img = cv2.undistort(img, mtx, dist, None, newcameramtx) # 提取图像中需要转换的点坐标 # 假设提取出的点坐标为 pt_img,为numpy数组格式 # pt_world = cv2.projectPoints(pt_img.reshape(1, 1, 2), rvecs[0], tvecs[0], mtx, dist)[0] # pt_world = pt_world.reshape(-1, 3) # 转换为世界坐标系中的坐标 cv2.imshow('calibresult', img) cv2.waitKey(500) cv2.destroyAllWindows() ``` 确保你有一个实际的棋盘格标定图像文件夹路径,并用你自己的路径替换示例代码中的`'calibration_images/*.jpg'`。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值