2

我正在唱歌cv::undistort,但它会裁剪图像。我想要所有未失真的图像,以便未失真的尺寸大于原始尺寸,如下所示:

在此处输入图像描述

我想我需要使用cv::getOptimalNewCameraMatrix,但我的试验没有运气..有帮助吗?

4

3 回答 3

4

仅作记录:您应该使用cv::getOptimalNewCameraMatrix并将 alpha 参数设置为 1。Alpha 0 仅显示图像上的有效点,alpha 1 显示所有原始点以及黑色区域。cv::getOptimalNewCameraMatrix aslo 还为您提供了一个 ROI,可以从 cv::undistort 裁剪结果。

于 2013-11-20T11:39:36.213 回答
3

这段代码可以解决问题:

void loadUndistortedImage(std::string fileName, Mat & outputImage, 
    Mat & cameraMatrix, Mat & distCoeffs) {

    Mat image = imread(fileName, CV_LOAD_IMAGE_GRAYSCALE);

    // setup enlargement and offset for new image
    double y_shift = 60;
    double x_shift = 70;
    Size imageSize = image.size();
    imageSize.height += 2*y_shift;
    imageSize.width += 2*x_shift;

    // create a new camera matrix with the principal point 
    // offest according to the offset above
    Mat newCameraMatrix = cameraMatrix.clone();
    newCameraMatrix.at<double>(0, 2) += x_shift; //adjust c_x by x_shift
    newCameraMatrix.at<double>(1, 2) += y_shift; //adjust c_y by y_shift

    // create undistortion maps
    Mat map1;
    Mat map2;
    initUndistortRectifyMap(cameraMatrix, distCoeffs, Mat(), 
        newCameraMatrix, imageSize, CV_16SC2, map1, map2);

    //remap
    remap(image, outputImage, map1, map2, INTER_LINEAR);
}

请参阅http://docs.opencv.org/2.4/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.htmlhttp://docs.opencv.org/2.4/modules/imgproc/doc/geometric_transformations.html

于 2016-03-19T16:51:08.327 回答
0

最好的方法是子类化 OpenCV 的类并重载方法 undistort(),以便访问您需要的所有图像。

于 2013-10-15T15:04:45.447 回答