我想从图像中删除鱼眼效果,所以我需要相机矩阵和失真系数。这就是我创建cal.py
文件的原因。
当我运行该文件时,它给了我相机矩阵和失真效率,我放在undist.py
文件中以取消图像。现在我每次都得到相同的RMS,相机矩阵,失真系数。
但是,当我把这个参数放在undist.py文件中,这是给我空白的图像..如何解决这个问题?PLZ帮助我...在提前感谢。我有捕获8图像和其中一个示例图像棋盘图案。
答案 0 :(得分:1)
我将回答总结评论中解决的所有问题(这样未来的读者不必阅读所有这些问题)。
按照here中的教程更好地了解您应该做什么以及使用哪些功能。
检查相机矩阵的格式是否正确:
[ f_x s c_x
0 f_y c_y
0 0 1 ]
s是一个偏斜值,我认为在opencv中它总是给出0。
确保每一步都能正确加载图像并确保它们完全符合预期(使用imshow
函数进行调试)
这部分代码
newcamera, roi = cv2.getOptimalNewCameraMatrix(K, d, (w,h), 0)
newimg = cv2.undistort(img, K, d, None, newcamera)
有问题。为什么,从opencv documentation我们得到了:
cv2.getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, alpha[, newImgSize[, centerPrincipalPoint]]) → retval, validPixROI
和
该函数计算并返回最佳的新相机矩阵 关于自由缩放参数。通过改变这个参数,你可以 仅检索敏感像素alpha = 0,保留所有原始图像 像素,如果角落alpha = 1中有有价值的信息,或者 得到介于两者之间。当α> 0时,不失真的结果是 可能有一些黑色像素对应于“虚拟”像素 在捕获的扭曲图像之外。原始相机矩阵, 失真系数,计算出的新相机矩阵,以及 应该将newImageSize传递给initUndistortRectifyMap()来生成 remap()的地图。
这意味着新的相机矩阵还为您提供了新的有效尺寸!更具体地来说:
计算出的新相机矩阵,newImageSize应传递给initUndistortRectifyMap()
但是,undistort函数自动执行initUndistortRectifyMap
....并且它没有办法从此函数传递newImageSize
。所以基本上你有2个选择。
newcamera
矩阵,但不应执行undistort
,而应手动执行所有操作....这意味着您必须使用initUndistortRectifyMap
和remap
新尺寸和新相机矩阵。calibrateCamera
功能中获得的原始相机矩阵。这样它就不会有这种缩放效果,但是你可能会有一些额外的黑色像素代表你因整改而可能看不到的区域。如果没有,它将始终为您提供此缩放效果,因为它不会显示未失真区域的无效像素(黑色像素)。