我有一副校准过的立体声鱼眼镜头。我正在尝试不失真,并对匹配的图像进行校正。
校准良好,失真看起来不错,但我似乎无法正确查看校正后的图像。我的代码是:
//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);
此图像显示了原始帧,未失真的帧以及(损坏的)校正后的显示。
我在这里做错了什么?我如何成功矫正鱼眼镜头立体声对?