opencv undistortPoints函数介绍和注意(返回数值太小)

好几次使用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]

用处:根据相机参数和观测到点坐标位置计算实际坐标位置
参数说明:
opencv undistortPoints函数介绍和注意(返回数值太小)_第1张图片

注意问题

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)

你可能感兴趣的:(openCV)