2017-05-08 7 views
0

opencvで提供されている、exapleを使って作業しています。 RMSが約0.66のステレオペアを較正した後、3Dポイントクラウドを作成しようとしました。 不幸にも、私がstereoRectifyを実行した後で、入力画像が黒くなります。そして他の仕事は可能ではありません。 私は悪い較正をしたために起こることがありますか?Opencv StereoRectify Issue

Mat img1 = imread(img1_filename, IMREAD_GRAYSCALE); 
Mat img2 = imread(img2_filename, IMREAD_GRAYSCALE); 

if (img1.empty()) 
{ 
    printf("Command-line parameter error: could not load the first input image file\n"); 
    return -1; 
} 
if (img2.empty()) 
{ 
    printf("Command-line parameter error: could not load the second input image file\n"); 
    return -1; 
} 
scale = 1; 
if (scale != 1.f) 
{ 
    Mat temp1, temp2; 
    int method = scale < 1 ? INTER_AREA : INTER_CUBIC; 
    resize(img1, temp1, Size(), scale, scale, method); 
    img1 = temp1; 
    resize(img2, temp2, Size(), scale, scale, method); 
    img2 = temp2; 
} 

Size img_size = img1.size(); 

Rect roi1, roi2; 

Mat Q; 

if (!intrinsic_filename.empty()) 
{ 
    // reading intrinsic parameters 
    FileStorage fs(intrinsic_filename, FileStorage::READ); 
    if (!fs.isOpened()) 
    { 
     printf("Failed to open file %s\n", intrinsic_filename.c_str()); 
     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(extrinsic_filename, FileStorage::READ); 
    if (!fs.isOpened()) 
    { 
     printf("Failed to open file %s\n", extrinsic_filename.c_str()); 
     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, CV_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); 

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

    img1 = img1r; 
    img2 = img2r; 
    imshow("img1", img1); 
    imshow("img2", img2); 
    cv::waitKey(0); 
} 

答えて

0

に従って:OpenCVの校正例でstereoCalibrateフラグを変更 http://answers.opencv.org/question/93090/stereo-rectify-doesnt-rectify-even-with-correct-m-and-d/

は、この問題を解決します。使用例 :CV :: CALIB_RATIONAL_MODEL + CV :: CALIB_FIX_K3 + CV :: CALIB_FIX_K4 + CV :: CALIB_FIX_K5 + CV :: CALIB_FIX_K6

大きなRMS誤差を与えたもう一つが、少なくとも正しいリマップは、キャリブレーションされた組み込み関数と外来を一緒にする。 したがって、cv :: CALIB_USE_INTRINSIC_GUESS + cv :: CALIB_FIX_INTRINSICは使用しないでください。