使用cv2.getOptimalNewCameraMatrix函数,变为圆形是出现什么错误

发布时间 2024-01-10 17:18:14作者: heyrro

cv2.getOptimalNewCameraMatrix 函数用于计算一个新的相机矩阵,以进行图像畸变校正。这个函数的目标是通过考虑畸变的影响,生成一个新的相机矩阵,使得校正后的图像更接近理想的情况。

cv2.getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, alpha, newImgSize)

其中参数的含义如下:

  • cameraMatrix: 输入的相机矩阵,包含内参信息。
  • distCoeffs: 输入的畸变系数。
  • imageSize: 输入图像的尺寸,为 (width, height) 的元组。
  • alpha: 控制缩放比例的参数,通常设置为 1。
  • newImgSize: 新图像的尺寸,为 (width, height) 的元组。

函数返回两个值:

  1. 新的相机矩阵 (newCameraMatrix)。
  2. 感兴趣区域 (validPixROI),是一个元组 (x, y, width, height),表示不受畸变影响的图像区域。

但是在使用以下函数时,标定结果为圆形。

new_camera_matrix, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (u, v ), 0.5, (u, v ))
undistorted_image = cv2.undistort(img, mtx, dist, None, new_camera_matrix)

标定结果为

解决方法为

将以上代码中的alpha设置为0,即可。

总结:

1.alpha=0,视场会放大,alpha=1,视场不变
2.进行roi的crop会裁掉一些像素

alpha(因为畸变矫正后有黑边,这个值指示的是保留多少畸变后的像素,选择0,那么就意味着保留最少的黑边,使用1的话,保留全部像素,那么所有黑边都包含进去了)

该函数的返回值返回值:

1. 新的内参
2. 返回的ROI,理解成:因为有黑边,这里可能要剪切黑边,这个ROI就是怎么剪切才能没有黑边。

使用上述API返回的新的内参,矫正图像,使用cv2.undistort进行(1. 原图 numpy.array类型 2. 畸变图像对应的内参 3. 矫正参数 4. None 5. 得到的新的相机内参)。