c – OpenCV鱼眼校准会削减过多的图像
作者:互联网
我正在使用OpenCV来校准使用带鱼眼镜头的相机拍摄的图像.
我正在使用的功能是:
> findChessboardCorners(…);找到校准图案的角落.
> cornerSubPix(…);改善找到的角落.
> fisheye :: calibrate(…);校准相机矩阵和失真系数.
> fisheye :: undistortImage(…);使用从校准获得的相机信息使图像不失真.
虽然生成的图像看起来看起来很好(直线等),但我的问题是该功能切掉了太多的图像.
这是一个真正的问题,因为我使用了四个90度相机的相机,当这么多的边被切断时,它们之间没有重叠的区域,这是我要缝合图像所需要的.
我研究了使用fisheye :: estimateNewCameraMatrixForUndistortRectify(…)但是我无法得到它给出好的结果,因为我不知道我应该放入什么作为R输入,因为fisheye :: calibrate的旋转矢量输出是3xN(其中N是校准图像的数量)和fisheye :: estimateNewCameraMatrixForUndistortRectify需要1×3或3×3.
下面的图像显示了我的非失真结果的图像,以及我理想情况下想要的结果的一个例子.
Undistortion:
想要结果的示例:
解决方法:
我想我遇到了类似的问题,寻找getOptimalNewCameraMatrix中用于鱼眼的“alpha”结.
我用cv2.fisheye.calibrate校准它,得到K和D参数
K = [[ 329.75951163 0. 422.36510555]
[ 0. 329.84897388 266.45855056]
[ 0. 0. 1. ]]
D = [[ 0.04004325]
[ 0.00112638]
[ 0.01004722]
[-0.00593285]]
这就是我所得到的
map1, map2 = cv2.fisheye.initUndistortRectifyMap(K, d, np.eye(3), k, (800,600), cv2.CV_16SC2)
nemImg = cv2.remap( img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
而且我觉得它太过分了.我想看看整个魔方
我修好了
nk = k.copy()
nk[0,0]=k[0,0]/2
nk[1,1]=k[1,1]/2
# Just by scaling the matrix coefficients!
map1, map2 = cv2.fisheye.initUndistortRectifyMap(k, d, np.eye(3), nk, (800,600), cv2.CV_16SC2) # Pass k in 1st parameter, nk in 4th parameter
nemImg = cv2.remap( img, map1, map2, interpolation=cv2.INTER_LINEAR, borderMode=cv2.BORDER_CONSTANT)
TADA!
标签:c,opencv,camera-calibration,computer-vision,fisheye 来源: https://codeday.me/bug/20191001/1839008.html