其他分享
首页 > 其他分享> > c – OpenCV鱼眼校准会削减过多的图像

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”结.

原始镜头:
Original

我用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)

而且我觉得它太过分了.我想看看整个魔方

initUndistortRectifyMap/remap with the K,D

我修好了

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!

This is what I want

标签:c,opencv,camera-calibration,computer-vision,fisheye
来源: https://codeday.me/bug/20191001/1839008.html