OpenCV cvRemap裁剪图像

时间:2012-01-12 15:21:21

标签: opencv crop distortion

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

所以我设法校准了我正在使用的便宜网络摄像头(带有广角附件),使用棋盘校准方法产生内在和失真系数。

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

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

更好地传达我正在谈论的地区的图像可以是found here!此图片是在post中发现的。

目前: cvRemap()基本上会返回上面链接的图片中的黄色框,但我希望看到整个图片,因为我正在寻找相关数据。< / p>

我尝试了什么:将缩放转换应用于图像地图以使整个图像(包括拉伸部分)适合框架

        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已经知道如何做好。

1 个答案:

答案 0 :(得分: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,...)获取新的相机矩阵。您基本上只需输入intrinsicdistort,原始图像大小和参数alpha(以及容纳结果矩阵的容器,请参阅文档)。参数alpha将达到您想要的效果。

我引用文档:

  

该功能基于free计算最佳新相机矩阵   缩放参数。通过改变该参数,用户可以检索   仅合理像素alpha = 0 保留所有原始图像像素if   在角落alpha = 1 中有有价值的信息,或得到一些东西   之间。当alpha> 0时,非失真结果可能会有   一些黑色像素对应于外面的“虚拟”像素   捕获失真的图像。原始相机矩阵,失真   系数,计算出的新相机矩阵和newImageSize   应传递给InitUndistortRectifyMap以生成地图   重映射。

所以对于极端的例子,所有黑色位显示你想要{​​{1}}。

总结:

  • 使用alpha=1致电cvGetOptimalNewCameraMatrix以获取alpha=1
  • 使用newCameraMatrixcvInitUndistortRectifymap为身份矩阵,R设置为您刚刚计算的那个
  • 将新地图输入newCameraMatrix