python 如何使用opencv calibrateCamera函数计算平面坐标转实际坐标
时间: 2024-09-10 16:12:22 浏览: 39
Python在OpenCV里实现极坐标变换功能
在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'`。
阅读全文