关于参数讲解,博文已经讲的很好了,这里只对自己觉得疑惑的地方作下笔记:
问题1
关于cv::getOptimalNewCameraMatrix() 和 cv::stereoRectify() 这篇文章讲的很好。
我的主要问题是:为什么单目相机的 newCameraMatrix 一般和 cameraMatrix 相等,而双目的就需要用 cv::stereoRectify() 另行计算?
另外对于双目相机,cv::stereoRectify() 得到的新投影矩阵
P
1
,
P
2
P_1, P_2
P1,P2 是 3x4 的,使用时要像下面这样调用 P1.rowRange(0, 3).colRange(0, 3)
只取其左上角的 3x3 矩阵
cv::stereoRectify(K1,camera1DistortionCoef(),K2,camera2DistortionCoef(),newImSize_,
R12, t12,
R_r1_u1,R_r2_u2,P1,P2,Q,
cv::CALIB_ZERO_DISPARITY,-1,newImSize_);
// https://blog.csdn.net/u013341645/article/details/78710740
// https://www.freesion.com/article/3256753294/
// 计算无畸变和修正转换映射。
cv::initUndistortRectifyMap(K1, camera1DistortionCoef(), R_r1_u1, P1.rowRange(0, 3).colRange(0, 3),
newImSize_, CV_32F, M1l_, M2l_);
cv::initUndistortRectifyMap(K2, camera2DistortionCoef(), R_r2_u2, P2.rowRange(0, 3).colRange(0, 3),
newImSize_, CV_32F, M1r_, M2r_);
问题2
这里的
m
a
p
x
(
u
,
v
)
,
m
a
p
y
(
u
,
v
)
map_x(u,v), map_y(u,v)
mapx(u,v),mapy(u,v) 应该就是对应的 initUndistortRectifyMap() 的最后两个参数:map1,map2
initUndistortRectifyMap() + remap() = undistort()
cv::remap(imLeft, imLeftToFeed, M1l_, M2l_, cv::INTER_LINEAR);
cv::remap(imRight, imRightToFeed, M1r_, M2r_, cv::INTER_LINEAR);
remap的参数可以参考博文