OpenCv,带有鱼眼镜头的立体矫正

时间:2019-05-04 11:51:39

标签: c++ opencv fisheye

我有一副校准过的立体声鱼眼镜头。我正在尝试不失真,并对匹配的图像进行校正。

校准良好,失真看起来不错,但我似乎无法正确查看校正后的图像。我的代码是:

//get the calibration data
    cv::Mat camMatrix, distCoeffs, tt, Rr, P1, P2, K1, K2, D1, D2;

    std::string extFile = "data/Extrinsics.xml";
    FileStorage fs2(extFile, FileStorage::READ);
    fs2["T"] >> tt;
    fs2["R"] >> Rr;
    fs2["P1"] >> P1;
    fs2["P2"] >> P2;

    fs2["K1"] >> K1;
    fs2["K2"] >> K2;
    fs2["D1"] >> D1;
    fs2["D2"] >> D2;

//加载图像并使其不失真

cv::Mat left = cv::imread("3.jpg");
    cv::Mat right = cv::imread("4.jpg");

    cv::Mat imageUndistortedL, imageUndistortedR;
    cv::Matx33d newK = K1;
    cv::Matx33d newK2 = K2;
    cv::fisheye::undistortImage(left, imageUndistortedL, K1, D1, newK);
    cv::fisheye::undistortImage(right, imageUndistortedR, K2, D2, newK2);


    cv::imshow("unL", imageUndistortedL); //looks great
    cv::imshow("unR", imageUndistortedR); // looks great

//纠正并重新映射

cv::Size imageSize(left.cols, left.rows);
cv::Mat img1 = imageUndistortedL;
cv::Mat img2 = imageUndistortedR;
cv::Mat img1r, img2r, disp, vdisp;
cv::Mat R1, R2, map11, map12, map21, map22;
cv::fisheye::stereoRectify(K1, D1, K2, D2, imageSize, Rr, tt, R1, R2, P1, P2,
    cv::noArray(), 0);

cv::Mat map_x, map_y, map_xR, map_yR;
cv::fisheye::initUndistortRectifyMap(K1, D1, R1, P1, imageSize, CV_16SC2, map11,
    map12);
cv::fisheye::initUndistortRectifyMap(K2, D2, R2, P2, imageSize, CV_16SC2, map21,
    map22);


cv::Mat undistorted_image_out1, undistorted_image_out2; // output undistorted image
cv::remap(img1, img1r, map11, map12, cv::INTER_LINEAR, cv::BORDER_TRANSPARENT);
cv::remap(img2, img2r, map21, map22, cv::INTER_LINEAR, cv::BORDER_TRANSPARENT);

//创建校正后的展示垫

cv::Mat pair;

pair.create(left.rows, left.cols * 2, CV_8UC3);

cv::cvtColor(img1r, img1r, cv::COLOR_BGR2GRAY);
    cv::cvtColor(img2r, img2r, cv::COLOR_BGR2GRAY);


    cv::Mat part = pair.colRange(0, imageSize.width);
    cvtColor(img1r, part, cv::COLOR_GRAY2BGR);
    part = pair.colRange(imageSize.width, imageSize.width * 2);
    cvtColor(img2r, part, cv::COLOR_GRAY2BGR);
    for (int j = 0; j < imageSize.height; j += 16)
        cv::line(pair, cv::Point(0, j), cv::Point(imageSize.width * 2, j),
            cv::Scalar(0, 255, 0));

    cv::imshow("rectified", pair);

此图像显示了原始帧,未失真的帧以及(损坏的)校正后的显示。

frames

我在这里做错了什么?我如何成功矫正鱼眼镜头立体声对?

0 个答案:

没有答案