使用initUndistortRectifyMap来取消图像点

时间:2017-04-13 13:11:50

标签: python c++ opencv computer-vision camera-calibration

我有一个应用程序,我经常不得不将像素位置保持为"对"位置。

我首先在Python中尝试过,下面的代码产生了良好的结果:

cam_m=np.array([[2590.2742, 0, 997.78192],[0, 2582.9724, 509.76907],[0, 0, 1]])
dist_c=np.array([0.088253155, 0.96952456, 0.0033740622, -0.00064934365, -6.0030732])
map1,map2=cv2.initUndistortRectifyMap(cam_m, dist_c, None, None, (1920,1024), cv2.CV_32FC1)

当我尝试将其转换为C ++时,它只是返回垃圾。我打电话给:

cv::initUndistortRectifyMap(this->m_cameraMatrix,this->m_distortionCoeffs, 
         cv::Mat::eye(3, 3, CV_32FC1),cv::Mat::eye(3, 3, CV_32FC1),
         cv::Size(dimX,dimY),CV_32FC1,this->m_undistortMapX,this->m_undistortMapY);

但是在地图中它会返回大的值,当我输出m_undistortMapX时,它包含大约-2.0e + 21的值。 this->m_undistortMapXthis->m_undistortMapY在类中声明,之前未初始化。其他参数看起来也是正确的:

std::cout  << this->m_cameraMatrix << std::endl;
std::cout  << this->m_distortionCoeffs << std::endl;
std::cout << dimX <<" / "<<dimY<<std::endl;

输出

[2590.2742, 0, 997.78192;
0, 2582.9724, 509.76907;
0, 0, 1]
[0.088253155, 0.96952456, 0.0033740622, -0.00064934365, -6.0030732]
1920 / 1024

就像在Python中一样,我想。任何想法仍然可能出错?!

2 个答案:

答案 0 :(得分:0)

试试这个;首先获得最佳新相机矩阵 newcam1 ,然后找到x和y方向的映射矩阵 map1x map1y 。最后通过使用unsistort函数,您可以获得 image_undistorted

Mat newcam1,map1x,map1y;


newcam1 = getOptimalNewCameraMatrix(CM1, Dist1, Size(w, h), 0);

initUndistortRectifyMap(CM1, Dist1, R1, newcam1, Size(w, h), CV_32FC1, map1x, map1y);

undistort(img, image_undistorted, CM1, Dist1, newcam1);

答案 1 :(得分:0)

我遇到了类似的问题,偶然发现了您的问题,所以也许这可以对某人有所帮助。另一个答案提供了一个可行的解决方案,但没有解释出什么问题。

在CPP版本中,您为P矩阵提供了None / Identity矩阵,出于某种原因,尽管OpenCV会生成垃圾(生成的地图将使用1 f.e.的焦距),但出于某些原因,它在OpenCV中是允许的。我将尝试看看是否可以在OpenCV中解决此问题。

我无法评论为什么python版本适合您,特别是由于自2017年以来OpenCV python绑定中发生的更改。