4

所以我对 OpenCV (2.1) 很陌生,所以请记住这一点。

因此,我设法校准了我正在使用的廉价网络摄像头(带有广角附件),使用棋盘校准方法来产生固有系数和失真系数。

然后我可以毫不费力地将这些值反馈回并生成图像映射,然后我将其应用于视频源以纠正传入的图像。

但是我遇到了一个问题。我知道当它扭曲/校正图像时,它会创建几个倾斜的部分,然后格式化图像以裁剪掉任何黑色区域。那么我的问题是我可以查看完整的扭曲图像,包括一些有黑色区域的区域吗?下面是一个带有倾斜部分的黑色区域的示例,如果我的术语不正确,我试图传达:

可以在这里找到更好地传达我正在谈论的区域的图像!这张图片是在这篇文章中发现的。

目前: cvRemap() 基本上返回上面链接的图像中的黄色框,但我想查看整个图像,因为我希望从中获得相关数据。

我尝试过的: 对图像映射应用比例转换以将完整图像(包括拉伸部分)放入框架中

        CvMat *intrinsic = (CvMat*)cvLoad( "Intrinsics.xml" );
        CvMat *distortion = (CvMat*)cvLoad( "Distortion.xml" );

        cvInitUndistortMap( intrinsic, distortion, mapx, mapy );

        cvConvertScale(mapx, mapx, 1.25, -shift_x);   // Some sort of scale conversion
        cvConvertScale(mapy, mapy, 1.25, -shift_y);   // applied to the image map

        cvRemap(distorted,undistorted,mapx,mapy);

cvConvertScale,当我认为我已正确对齐 x/y 偏移(猜测/检查)时,它会以某种方式扭曲图像映射,使校正无用。这里可能涉及一些数学,我没有正确遵循/理解。

有没有人有任何其他建议来解决这个问题,或者我可能做错了什么?我也尝试编写自己的代码来解决失真问题,但可以说 OpenCV 已经知道如何做好。

4

1 回答 1

4

从记忆中,您需要使用InitUndistortRectifyMap(cameraMatrix,distCoeffs,R,newCameraMatrix,map1,map2),其中InitUndistortMap是简化版本。

cvInitUndistortMap( intrinsic, distort, map1, map2 )

相当于:

cvInitUndistortRectifyMap( intrinsic, distort, Identity matrix, intrinsic, 
                           map1, map2 )

新参数是RnewCameraMatrixR物种一个额外的转换(例如旋转)来执行(只需将其设置为单位矩阵)。

您感兴趣的参数是newCameraMatrix。这InitUndistortMap与原始相机矩阵相同,但您可以使用它来获得您正在谈论的缩放效果。

你得到新的相机矩阵GetOptimalNewCameraMatrix(cameraMat, distCoeffs, imageSize, alpha,...)。您基本上输入原始图像大小和参数(以及保存结果矩阵的容器,请参阅文档)intrinsic。该参数将实现您想要的。distortalphaalpha

我从文档中引用:

该函数根据自由缩放参数计算最佳新相机矩阵。通过改变这个参数,用户可以 只检索敏感像素 alpha=0如果角落 alpha=1 有有价值的信息,则保留所有原始图像像素,或者在两者之间获取一些东西。当 alpha>0 时,未失真结果可能会有一些黑色像素对应于捕获的失真图像之外的“虚拟”像素。原始相机矩阵、畸变系数、计算出的新相机矩阵和 newImageSize 应传递给 InitUndistortRectifyMap 以生成 Remap 的地图。

因此,对于所有显示您想要的黑色位的极端示例alpha=1

总之:

  • 调用cvGetOptimalNewCameraMatrixalpha=1获取newCameraMatrix.
  • cvInitUndistortRectifymapR作为单位矩阵一起使用并newCameraMatrix设置为您刚刚计算的那个
  • 将新地图输入cvRemap.
于 2012-01-13T01:06:10.210 回答