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中它总是给出0

  • 确保在每个步骤中正确加载图像,并确保它们完全按照预期进行操作(使用
    imshow
    功能进行调试)

  • 这部分代码

    newcamera, roi = cv2.getOptimalNewCameraMatrix(K, d, (w,h), 0)
    newimg = cv2.undistort(img, K, d, None, newcamera)
    
  • 这是错误的。为什么,从opencv我们可以看到:

    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尝试剪切此像素并调整图像大小以适合大小。