Python Raspberry pi:校准相机和图像不失真
我想从图像中去除鱼眼效果,所以我需要摄像机矩阵和失真系数。这就是我创建Python Raspberry pi:校准相机和图像不失真,python,opencv,numpy,camera,raspberry-pi,Python,Opencv,Numpy,Camera,Raspberry Pi,我想从图像中去除鱼眼效果,所以我需要摄像机矩阵和失真系数。这就是我创建cal.py文件的原因 当我运行该文件时,它会给我相机矩阵和失真效率,我将其放入undis.py文件中以消除图像失真。现在每次我得到相同的RMS,摄像机矩阵,失真系数 但是当我把这个参数放在undi.py文件中时,它会给我一个空白的图像。。如何解决这个问题?请帮助我…提前感谢。我已经捕获了8幅图像和棋盘图案的一幅示例图像。我将在评论中对解决的所有问题进行总结(这样未来的读者就不必阅读所有问题) 按照中的教程进行操作,以便更好地
cal.py
文件的原因
当我运行该文件时,它会给我相机矩阵和失真效率,我将其放入undis.py
文件中以消除图像失真。现在每次我得到相同的RMS,摄像机矩阵,失真系数
但是当我把这个参数放在undi.py文件中时,它会给我一个空白的图像。。如何解决这个问题?请帮助我…提前感谢。我已经捕获了8幅图像和棋盘图案的一幅示例图像。我将在评论中对解决的所有问题进行总结(这样未来的读者就不必阅读所有问题)
[ f_x s c_x
0 f_y c_y
0 0 1 ]
s是一个偏移值,我认为在opencv中它总是给出0imshow
功能进行调试)newcamera, roi = cv2.getOptimalNewCameraMatrix(K, d, (w,h), 0)
newimg = cv2.undistort(img, K, d, None, newcamera)
cv2.getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, alpha[, newImgSize[, centerPrincipalPoint]]) → retval, validPixROI
及
该函数计算并返回基于图像的最佳新摄影机矩阵
关于自由缩放参数。通过改变此参数,您可以
仅检索敏感像素alpha=0,保留所有原始图像
如果角点中存在有价值的信息,则为像素alpha=1,或
介于两者之间。当alpha>0时,不失真结果为
可能有一些黑色像素对应于“虚拟”像素
在拍摄的失真图像之外。原始摄像机矩阵,
畸变系数、计算出的新摄像机矩阵,以及
应将newImageSize传递给initUnderTortRectiveyMap()以生成
重新映射()的映射
这意味着新的相机矩阵也为您提供了新的有效尺寸!!更具体地说:
计算出的新摄影机矩阵和newImageSize应传递给InitUndersortRectiveyMap()
但是undistort函数会自动执行initundistortrectitymap
。。。。它没有办法从这个函数传递newImageSize
。所以基本上你有两个选择
newcamera
矩阵,但您应该手动执行所有操作,而不是使用矩阵。。。。这意味着您必须执行并使用新的尺寸和新的相机矩阵calibleCamera
功能中获得的原始摄像机矩阵。这样它就不会有这种缩放效果,但您可能会有一些额外的黑色像素,表示由于校正而看不到的区域如果没有,它将始终为您提供这种缩放效果,因为它不会显示未失真区域的无效像素(黑色像素)。但是为什么这个矩阵是错误的?代码中的错误在哪里?我如何获得正确的矩阵值?我参考此链接并对该函数进行了注释,如果我取消对该函数的注释,它会给我错误,那么请告诉我如何以及在何处调用校准函数,以便它能给我正确的度量值?没错,但显然你需要解决函数内部的错误,它才能工作。。。所以,您之前显示的输出无效。。。您应该显示错误,这样就可以修复它。你的矩阵是错误的,因为它们从未被分配正确的摄像机矩阵,因为你没有运行调用校准函数的函数…我认为你的校准函数甚至没有加载图像。。。。您从程序参数中获得
img\u掩码
,但随后再次覆盖它。。。。也许这是一个错误。。。你应该在每一步打印图像,以检查它是否正确。。。。您可以在python opencv中检查这一点。此外,您引用的链接从未显示她是如何解决问题的……当我对此进行评论时:camera_matrix,dist_coefs=calibracion(),错误是:OpenCV错误:CalibleCamera中的断言失败(nimages>0),file/root/OpenCV-2.4.10/modules/calib3d/src/calibration.cpp,第3415行回溯(最近一次调用):file“cal.py”,第58行,在camera_矩阵中,dist_coefs=calibracion()文件“cal.py”,第47行,在calibracion rms中,camera_矩阵,dist_coefs,rvecs,tvecs=cv2.caliblecamera(obj_点,img_点,(w,h))cv2.error:/root/opencv-2.4.10/modules/calib3d/src/calib.cpp:3415:error:(-215)函数CalibleCamerai中的图像>0不知道此问题的解决方案..请告诉我此错误的解决方案..我必须在哪里更改代码?非常感谢..所有问题都已解决..但在转换正常图像时仍从四面八方显示剪切图像..我想你告诉过我此问题,但我不明白。。请再次详细告诉我为什么会发生这种情况?以及我们如何在不剪切或缩放的情况下获得完整图像?有什么方法可以做到这一点吗?我希望完整图像不是剪切图像。我还听说,在将鱼眼图像转换为正常图像时,它会从一个图像(上、下、前、左、右)生成5个图像…这是真的吗?如果是,那么我们是如何得到这5幅图像的?除了前面的部分,所有图像都是鱼眼状的,或者它们在转换时也转换成了正常图像和fornt图像?@snehaldesai,据我所知,它只生成了1幅图像。opencv所做的是生成一个映射函数。这将告诉每个像素在新图像中的位置。当你不失真图像时,有一些像素在失真图像中找不到,所以它们会显示为黑色。。。。get-NewCameraMatrix尝试剪切此像素并调整图像大小以适合大小。