所以我对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已经知道如何做好。
答案 0 :(得分:4)
从内存中,您需要使用InitUndistortRectifyMap(cameraMatrix,distCoeffs,R,newCameraMatrix,map1,map2)
,其中InitUndistortMap
是简化版。
cvInitUndistortMap( intrinsic, distort, map1, map2 )
相当于:
cvInitUndistortRectifyMap( intrinsic, distort, Identity matrix, intrinsic,
map1, map2 )
新参数为R
和newCameraMatrix
。 R
种类需要执行额外的转换(例如旋转)(只需将其设置为单位矩阵)。
您感兴趣的参数是newCameraMatrix
。在InitUndistortMap
中,这与原始相机矩阵相同,但您可以使用它来获得您正在谈论的缩放效果。
您可以使用GetOptimalNewCameraMatrix(cameraMat, distCoeffs, imageSize, alpha,...)
获取新的相机矩阵。您基本上只需输入intrinsic
,distort
,原始图像大小和参数alpha
(以及容纳结果矩阵的容器,请参阅文档)。参数alpha
将达到您想要的效果。
我引用文档:
该功能基于free计算最佳新相机矩阵 缩放参数。通过改变该参数,用户可以检索 仅合理像素alpha = 0 ,保留所有原始图像像素if 在角落alpha = 1 中有有价值的信息,或得到一些东西 之间。当alpha> 0时,非失真结果可能会有 一些黑色像素对应于外面的“虚拟”像素 捕获失真的图像。原始相机矩阵,失真 系数,计算出的新相机矩阵和newImageSize 应传递给InitUndistortRectifyMap以生成地图 重映射。
所以对于极端的例子,所有黑色位显示你想要{{1}}。
总结:
alpha=1
致电cvGetOptimalNewCameraMatrix
以获取alpha=1
。newCameraMatrix
,cvInitUndistortRectifymap
为身份矩阵,R
设置为您刚刚计算的那个newCameraMatrix
。