【问题标题】:Disparity map opencv视差图opencv
【发布时间】:2013-12-19 06:45:00
【问题描述】:

我正在尝试制作视差图。我看到了 opencv 'stereo_match.cpp' 提供的示例代码,并编写了以下代码。但是当我在校正和重新映射后显示左右图像时,图像是黑色的。谁能告诉我哪里做错了?

int main(int argc, char* argv[])
{
    Mat img1, img2, g1, g2;
    Mat disp, disp8;
    char* method ="SGBM";
    float scale = 1.f; // don't know why
    //img1 = imread(argv[1]);
    //img2 = imread(argv[2]);
    img1=imread("l1.jpg");
    img2=imread("r1.jpg");
    cvtColor(img1, g1, CV_BGR2GRAY);
    cvtColor(img2, g2, CV_BGR2GRAY);
    Size img_size = img1.size();
    Rect roi1, roi2;
    Mat Q;

    /*reading parameters of ectrinssic & intrinssic file*/
    const char* intrinsic_filename="intrinsics";
    Mat img1r, img2r;
    if( intrinsic_filename )
    {
        FileStorage fs("intrinsics.yml", cv::FileStorage::READ);
        if(!fs.isOpened())
        {
            printf("Failed to open file %s\n");
            return -1;
        }

        Mat M1, D1, M2, D2;
        fs["M1"] >> M1;
        fs["D1"] >> D1;
        fs["M2"] >> M2;
        fs["D2"] >> D2;

        M1 *= scale;
        M2 *= scale;

        fs.open("extrinsics.yml", cv::FileStorage::READ);
        if(!fs.isOpened())
        {
            printf("Failed to open file %s\n");
            return -1;
        }

        Mat R, T, R1, P1, R2, P2;
        fs["R"] >> R;
        fs["T"] >> T;
        stereoRectify( M1, D1, M2, D2, img_size, R, T, R1, R2, P1, P2, Q, CALIB_ZERO_DISPARITY, -1, img_size, &roi1, &roi2 );

        Mat map11, map12, map21, map22;
        initUndistortRectifyMap(M1, D1, R1, P1, img_size, CV_16SC2, map11, map12);
        initUndistortRectifyMap(M2, D2, R2, P2, img_size, CV_16SC2, map21, map22);


        remap(img1, img1r, map11, map12, INTER_LINEAR);
        remap(img2, img2r, map21, map22, INTER_LINEAR);


        //  img1 = img1r;
        // img2 = img2r;

        imshow("left1", img1r);
        imshow("left2", img2r); 

    }
}

} ![原左图][3]

【问题讨论】:

    标签: c++ opencv stereo-3d


    【解决方案1】:

    你没有在 cvtColor(...) 上切换输入/输出参数吗:

    cvtColor(img1, g1, CV_BGR2GRAY);
    cvtColor(img2, g2, CV_BGR2GRAY);
    

    g1 和 g2 似乎是输入图像的灰度版本,但它们从未在后面的代码中使用。 你为什么不反过来试试呢?:

    g1=imread("l1.jpg");
    g2=imread("r1.jpg");
    cvtColor(g1, img1, CV_BGR2GRAY);
    cvtColor(g2, img2, CV_BGR2GRAY);
    

    【讨论】:

    • 感谢您的回答。但这并没有带来任何改变。输出是一样的:(
    【解决方案2】:

    来自 OpenCV 的视差图的比例在 8 位显示器上不会显示出太多的对比度。您需要重新映射图像范围以增加对比度。

    为了改进这个答案,这是我在 Python 中使用的代码:

    disp = cv2.normalize(sgbm.compute(ri_l, ri_r), alpha=0, beta=255, \
        norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)
    

    sgmb.compute()为视差图生成函数。

    【讨论】:

      【解决方案3】:

      如果重新映射只创建了灰色图像,这意味着你的内在/外在价值很糟糕。

      你必须回到校准阶段,然后再做一次,直到你得到一个来自 stereoCalibrate 的错误

      【讨论】:

        猜你喜欢
        • 2015-06-09
        • 2011-05-27
        • 2014-07-18
        • 2016-06-24
        • 2013-10-13
        • 2017-02-23
        • 2018-10-02
        • 2014-09-21
        • 2020-01-26
        相关资源
        最近更新 更多