c++ - InitUndistortRectifyMap 和 Remap

标签 c++ opencv camera

我目前正在为一对立体相机编写 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], distCoeffs[0], R1, newP1, imageSize,        
        CV_16SC2 , mapx1,  mapy1);
    remap(x_Image, imageRectified[0],mapx1, mapy1, INTER_LINEAR);

    return imageRectified[0];
}   

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

    return imageRectified[1];
}

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

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

最佳答案

好吧,我有点绕过了这个问题,我想我会分享解决方案,以防任何人都可以使用它。

InitUndistortRectifyMap 在使用 StereoRectify 生成的旋转矩阵 R1 和 R2 时确实输出了空白图像。

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

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

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

关于c++ - InitUndistortRectifyMap 和 Remap,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13862001/

相关文章:

c++ - 传递重物 C++0x

c++ - Boost 插件选择

c++ - 传入的模板类型与基本类型或对象的比较

OpenCV 2.4.2 imshow 导致崩溃

android - 将 LED 转为 TORCH 模式会出现什么错误?

c++ - QThread和notify的实现

python - 使用openCV python查找骨架与边界之间的距离

ios - Apple Mach-O 链接器警告直接访问...到全局弱符号

camera - Xamarin Forms - 如何获取相机流并使用它?

c# - 如何从 C# 运行 windows 8 camera api