2012-01-12 114 views
3

所以我对OpenCV(2.1)很新,所以请记住这一点。OpenCV cvRemap裁剪图像

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

然后,我可以毫无困难地重新输入这些值并生成图像映射,然后将其应用于视频输入以更正输入图像。

但是我遇到了一个问题。我知道它何时扭曲/校正图像,它会创建多个倾斜部分,然后对图像进行格式化以剪出任何黑色区域。我的问题是,我可以查看完整的扭曲图像,包括一些有黑色区域的区域吗?以下是我尝试传达的黑色区域的示例,如果我的术语已关闭:

更好地传达我所说的区域的图像可以是found here!此图像在post中被发现。

当前: 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

从内存中,您需要使用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,distort,您的原始图像大小和一个参数alpha(以及用于容纳结果矩阵的容器,请参阅文档)。参数alpha将实现你想要的。

我从文档报价:

的函数计算基于自由 缩放参数最优新的相机矩阵。通过改变这个参数,用户可以检索 唯一明智的像素的α= 0保留所有的原始图像的像素,如果 有在弯道的α= 1,或得到的东西之间 有价值的信息。当α> 0时,失真结果将可能具有对应于所拍摄的失真图像之外的“虚拟”像素的一些黑色像素。应将原始摄像机矩阵,失真 系数,计算出的新摄像机矩阵和新图像大小 传递给InitUndistortRectifyMap以生成 重映射的地图。

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

总结:

  • 呼叫cvGetOptimalNewCameraMatrixalpha=1获得newCameraMatrix
  • 使用cvInitUndistortRectifymapR为单位矩阵,newCameraMatrix设置为您刚刚计算
  • 进新地图到cvRemap之一。
+1

mathematical.coffee,我不能够感谢你。这正是我所需要的,并且详细的解决方案,我能够相应地实现它!非常感谢! – user1145707 2012-01-13 14:32:57

+0

不用担心:)它花了我永远的工作(我发现在线文档有时难以理解,特别是当我使用python界面时)。一个非常宝贵的资源(我发现)是OpenCV包含的例子(在'OpenCV-2.x.x/samples/pick_your_language'中)。 – 2012-01-14 00:41:54

+0

但修正图像仍然有黑色区域或边界。 – Abc 2017-07-04 08:31:45