好几次使用undistortPoints都碰到些障碍,把几个问题记录一下,我都是单目相机用
void cv::undistortPoints(InputArray src,
OutputArray dst,
InputArray cameraMatrix,
InputArray distCoeffs,
InputArray R = noArray(),
InputArray P = noArray() )
Python:
dst=cv.undistortPoints(src, cameraMatrix, distCoeffs[, dst[, R[, P]]])
dst=cv.undistortPointsIter(src, cameraMatrix, distCoeffs, R, P, criteria[, dst]
用处:根据相机参数和观测到点坐标位置计算实际坐标位置
参数说明:
注意问题
1. 观测点的shape,即src的shape是1xNx2或Nx1x2;
2. R参数是用在双目里的,单目里置为空矩阵;
3. P矩阵值为空时,得到的结果的点坐标是相机的归一化坐标
(
x
,
y
)
(x, y)
(x,y),这时候数值就会明显很小;设置相机内参会进行以下计算,
u
′
=
x
f
x
′
+
c
x
′
u'=xf_x'+c'_x
u′=xfx′+cx′
v
′
=
y
f
y
′
+
c
y
′
v'=yf_y'+c'_y
v′=yfy′+cy′
这时候得到的才是特征点消畸变后的像素坐标
我们通常使用时是想得到在同一个相机下的真实像素,所以P设置为内参就可以了。
其实官方文档里就写了,但是看的时候没看那么仔细,记录一下
undistortPoints官方文档
示例
import cv2 as cv
cv.undistortPoints(pnts, cameraMatrix, dist, None, cameraMatrix)