StereoRectify в openCV не дает правильный результат, используя ориентацию камеры и перевод - PullRequest
0 голосов
/ 10 июля 2019

У меня есть стереоизображения с собственной внутренней и внешней ориентацией первая камера вторая камера , полученная с помощью программного обеспечения фотограмметрии (эволюция саммита) триангуляция эволюции саммита .

хотя я правильно применил шаги, упомянутые в документе OpenCV и приведенном примере в StackOverflow.Но я все еще не могу получить исправленные изображения, и результаты всегда неверны.

Хотя я пробовал разные альфа-значения, -1, 0 и 1, но результаты все равно неверны.кроме того, для относительных ориентаций я пробовал разные комбинации, потому что cv :: composeRT выдавал ошибки:

Rrel = R2 * tran (R1), Trel = T1-tran (R) * T2;

Rrel = R2 * tran (R1), Trel = T2- (R) * T1;

Rrel = R1 * tran (R2), Trel = T2-tran (R) * T1;и

Rrel = R2 * tran (R1), Trel = T1-T2;

Я был бы очень признателен, если бы кто-то мог помочь мне решить эту проблему, потому что я работал над этим дляболее одного месяца, просто для информации, я также обновил OpenCV с 3.4 до 4.1, но, тем не менее, это было бесполезно.

#include "stdafx.h"
#include <iostream>
#include <fstream>
#include <iomanip>
#include <opencv2\core\core.hpp>
#include <opencv2\highgui\highgui.hpp>
#include "opencv2/imgcodecs.hpp"
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>
#include<limits.h> 
#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#define R 5 
#define C 5

const char* source_window = "Source image";
const char* corners_window = "Corners detected";
using namespace cv;
using namespace std;

//int minCostMAt(int cost[R][C], int m, int n);
using namespace std;
int main()
{



    ///////////camera parameters//////////////////////////////

    cv::Mat K1 = (cv::Mat_<double>(3, 3) << 16750, 0,8655 ,
        0, 16750, 5635,
        0, 0, 1);
    cv::Mat kk1 = cv::Mat_<double>::zeros(1, 5);
    cv::Mat K2 = (cv::Mat_<double>(3, 3) << 16750, 0,8655 ,
        0, 16750,5635 ,
        0, 0, 1);

    cv::Mat kk2 = cv::Mat_<double>::zeros(1, 5);


    ///////////////////rotation matrix for the images/////////
    cv::Mat RR1 = (cv::Mat_<double>(3, 3) << 
        -0.99999100324, -0.00227689086, -0.00357899578,
        0.00227693999, -0.99999740772, -0.00000965317,
        -0.00357896452, -0.00001780224, 0.99999359533

        );
    cv::Mat TT1 = (cv::Mat_<double>(3, 1) << 412130.090, 4000048.907, 2229.931);

    cv::Mat RR2 = (cv::Mat_<double>(3, 3) <<
        -0.99999300398, -0.00163328377, -0.00336517143,
        0.00163222195, -0.99999861728, 0.00031825616,
        -0.00336568658, 0.00031276123, 0.99999428715

        );
    cv::Mat TT2 = (cv::Mat_<double>(3, 1) << 412133.231, 4000524.367, 2230.390);

    ///////////////////////
    /*
    Mat RR1tran;// = RR2.inv();
    transpose(RR1, RR1tran);
    cv::Mat RRR = RR2 * RR1tran;
    cv::Mat RRRT;
    cv::Mat RT;
    transpose(RRR, RT);
    cv::Mat RT_temp = RT * TT2;
    RRRT = TT1 - RT_temp;
    */
    /////////////////////////////
    ///////////////////////

    Mat RR1tran;// = RR2.inv();
    transpose(RR1, RR1tran);
    cv::Mat RRR = RR2 * RR1tran;
    cv::Mat RRRT;
    cv::Mat RT;
    transpose(RRR, RT);
    cv::Mat RT_temp = RRR * TT1;
    //RRRT = TT2 - RT_temp;
    RRRT = TT1 - TT2;
    /////////////////////////////
    ///////////////////////
    /*
    Mat RR2tran;// = RR2.inv();
    transpose(RR2, RR2tran);
    cv::Mat RRR = RR1 * RR2tran;
    cv::Mat RRRT;
    cv::Mat RT;
    transpose(RRR, RT);
    cv::Mat RT_temp = RT * TT1;
    //RRRT = TT2 - RT_temp;
    //RRRT = TT2 - TT1;
*/

    /////////////////////////////


    cv::Size imgsize(17310, 11310);
    /////////////////////////

    Mat composedRvec = Mat_<float>(3, 3);// << 1, 0, 1, 1, 1, 1, 1, 1, 0);
                                         // cv::at composedRvec;
    Mat composedTvec = Mat_<float>(3, 1);// << 1, 0, 1, 1, 1, 1, 1, 1, 0);M
    cv::Mat compR;
    cv::Mat compT;
//  cv::composeRT(RR1, TT1, RR2, TT2, compR, compT);

    //////////////////////




    cv::Mat R1;
    cv::Mat R2;
    cv::Mat P1;
    cv::Mat P2;
    cv::Mat Q;
    cv::Rect RL;
    cv::Rect RR;
    cv::stereoRectify(K1, kk1, K2, kk2, imgsize, RRR, RRRT, R1, R2, P1, P2, Q, 1,0, imgsize, &RL, &RR);//the value of alpha with -1 is wgives bot 
                                                                                                         // cv::stereoRectify(K0, kk0, K1, kk1, imgsize, RRR, T, R1, R2, P1, P2, Q, 1, 0, imgsize, &RL, &RR);
                                                                                                         //cv::stereoRectify(K0, kk0, K1, kk1, imgsize, RRR, T, R1, R2, P1, P2, Q, 1, 1.0, imgsize, &RL, &RR);
                                                                                                         //cv::stereoRectify(K0, kk0, K1, kk1, imgsize, RRR, T, R1, R2, P1, P2, Q, 0, 1.0, imgsize, &RL, &RR);
    std::cout << "Results with OpenCV " << CV_VERSION_MAJOR << "." << CV_VERSION_MINOR << "." << CV_VERSION_REVISION << std::endl;
    std::cout << "R1 = " << R1 << std::endl;
    std::cout << "R2 = " << R2 << std::endl;
    std::cout << "P1 = " << P1 << std::endl;
    std::cout << "P2 = " << P2 << std::endl;
    std::cout << " Q = " << Q << std::endl;
    std::cout << "RL = " << RL << std::endl;
    std::cout << "RR = " << RR << std::endl;
    //////////stereorectify matrix/////////////////////////////////////////////////////////////////////////////

    cv::Mat img1 = cv::imread("E:\\12_0628.tif", 0);
    cv::Mat img2 = cv::imread("E:\\12_0629.tif", 0);


    Mat map1x, map1y, map2x, map2y;
    Mat imgdst1, imgdst2;


    initUndistortRectifyMap(K1, kk1, R1, P1, Size(img1.cols, img1.rows), CV_32FC1, map1x, map2x);
    initUndistortRectifyMap(K2, kk2, R2, P2, Size(img1.cols, img1.rows), CV_32FC1, map1y, map2y);
    cv::remap(img1, imgdst1, map1x, map2x, INTER_LANCZOS4);
    cv::remap(img2, imgdst2, map1y, map2y, INTER_LANCZOS4);

////////////////////////////////////
    imwrite("E:\\Disparity_imgL.jpg", imgdst1);
    imwrite("E:\\Disparity_imgR.jpg", imgdst2);
    cv::waitKey(0);
    system("pause");
}
```
...