c – InitUndistortRectifyMap和Remap

我目前正在为一对立体相机编写openCV程序.
完成了摄像机校准和立体声校准.

下一步是从我得到的2张图像中找到一个特征在空间中的位置.这就是为什么我必须立体声整理图像然后进行计算.

我在initUndistortRectifyMap面临的问题如下:

– 如果我将由stereoRectify()计算的R1或R2传递给initUndistortRectifyMap(),我会在重映射后得到黑色图像.

– 如果我将r(空矩阵)传递给initUndistortRectifyMap(),我会在重新映射后得到未经校正的图像.我得到的图像虽然有点扭曲.

我需要将R1和R2传递给initUndistortRectifyMap()来纠正2个摄像头,否则当传递空矩阵时,立体声头不会旋转到同一个平面.

以下是我的代码

stereoRectify(intrinsic[0],distCoeffs[0],intrinsic[1],distCoeffs[1],imageSize,R,T_Stereo,R1,R2,newP1,newP2,Q,CV_CALIB_ZERO_disPARITY,-1,imageSize);

if (x_Cam.GetSerial()=="4002678487")
{
    initUndistortRectifyMap(intrinsic[0],CV_16SC2,mapx1,mapy1);
    remap(x_Image,imageRectified[0],mapy1,INTER_LINEAR);

    return imageRectified[0];
}   

if (x_Cam.GetSerial()=="4002702131")
{
    //flip(in,in,-1);
    initUndistortRectifyMap(intrinsic[1],mapx2,mapy2);
    remap(x_Image,imageRectified[1],mapy2,INTER_LINEAR,BORDER_CONSTANT,0);

    return imageRectified[1];
}

我检查了进入stereoRectify()的所有矩阵值,它们是正确的.旋转矩阵R1和R2似乎也是正确的.我只是将黑色图像作为输出.

我尝试将垃圾值传递到InitUndistortRectifyMap()中以获取R1和R2(例如R1 * R2)以简单地看到效果,并且我确实获得了奇怪的结果但不是黑色图像.

解决方法

好吧,我解决了这个问题,并认为我会分享解决方案,任何人都可以使用它.

使用Rotation Matrices R1时,InitUndistortRectifyMap输出空白图像,StereoRectify生成R2.

因此,我尝试使用StereoRectifyUncalibrated,它生成2个Homography矩阵H1和H2,并且我根据OpenCV文档计算了旋转:

R1 = inv(CamMatrix1)* H1 * CamMatrix1
R2 = inv(CamMatrix2)* H2 * CamMatrix2

我将新的R1和R2传递给InitUndistortRectifyMap并重新映射,结果令人满意.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...