1 cv2的安装

  python下的opencv叫cv2,但是安装cv2并不是直接pip install cv2,而是:

pip install opencv-python

  安装完成后,就可以使用啦。
  

2 像素坐标去畸变

  对像素坐标去畸变要使用到cv2的undistortPoints()函数,其官方文档点击这里查看。如下图所示:
在这里插入图片描述
  其中涉及的参数包括:

src:图像的像素坐标点集合,类型是np.ndarray,维度可以是N×1×2或者1×N×2
dst:输出的去畸变结果,类型是np.ndarray,维度是N×1×2
cameraMatrix:如官方文档所示,就是一个3×3的相机内参矩阵K,类型为np.ndarray
distCoeffs:畸变参数,排列顺序为:k1,k2,p1,p2[,k3[,k4,k5,k6[,s1,s2,s3,s4[,τx,τy]]]],其长度可以是4、5、8、12或14,类型为np.float32或者np.float64(注意,这里不能是np.ndarray,否则报错)
R:双目相机的校准才要用到,单目直接默认为单位阵即可
P:默认是单位阵,这样输出的结果为归一化坐标点,数值很小(0.几的级别)。如果要获得去畸变后的图像平面坐标,需要设置为相机的内参K

  虽然上述官方文档里undistortPoints()函数的参数排列顺序是:src, dst, cameraMatrix, distCoeffs, R, P。但是实际上,其参数排列顺序是:src, cameraMatrix, distCoeffs[, dst[, R[, P]]],其中[ ]内的参数为可选参数。接收输出的数组dst可以直接通过等号进行赋值,而不一定需要提前建好然后丢进函数中。这些信息在上图的函数描述之后有个python行里有介绍,或者可以通过在python命令行下,输入help(cv2.undistortPoints)查看,如下图所示:
在这里插入图片描述
  好了,函数使用方法已经介绍差不多了,下面给一个完整的使用示例:

import numpy as np 
import cv2 as cv

undistort_pts = cv.undistortPoints(pts, K, distCoeffs, P=K)

  其中,pts是输入src,K是内参cameraMatrix,distCoeffs是畸变参数,最后的P=K是指定的相机矩阵,这样将会获得去畸变后的像素坐标点。需要特别指定是参数P,是因为该参数在函数接口中是排在最后一位的可选参数,而在它之前还有dst和R两个参数,我们都没有设置,所以我们需要指定参数名来进行赋值。如果没有指定P,那么将输出归一化坐标点(数值很小,为0.几的级别)。undistort_pts是获取到的输出结果。
  

3 对图像去畸变

  图像去畸变和像素坐标去畸变大同小异,仅有输入输出的差别。对图像去畸变需要使用到undistort()函数,官方文档的描述如下:
在这里插入图片描述
  参数的具体类型含义就不多介绍了,和上面是一样的,只是其输入输出变成了图像矩阵。其中这个新的newCameraMatrix参数,其默认是和cameraMatrix一样的,如果有平移缩放需要的话,则可以自己定义输入,与像素坐标去畸变的参数P一样。下面是一个示例:

import numpy as np
import cv2 as cv

K = np.zeros((3, 3))
K[0, 0] = 1201.58
K[1, 1] = 1201.72
K[0, 2] = 1019.59
K[1, 2] = 807.568
K[2, 2] = 1

distCoeffs = np.float32([-0.0911113, 0.0852054, 1.79509e-06, 0.000242446])

img = cv.imread('1.png')
img_undistored = cv.undistort(img, K, distCoeffs)
cv.imwrite('11.png', img_undistored)

  去畸变前后的图像如下图所示:
在这里插入图片描述
在这里插入图片描述

GitHub 加速计划 / opencv31 / opencv
77.34 K
55.71 K
下载
OpenCV: 开源计算机视觉库
最近提交(Master分支:1 个月前 )
e1fec156 features2d: fixed out of bounds access in SIFT 20 天前
63087396 - 20 天前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐