Карта несоответствий opencv

Я пытаюсь сделать карту несоответствия. Я увидел пример кода, предоставленный opencv 'stereo_match.cpp', и написал следующий код. Но когда я отображаю левое и правое изображение после исправления и переназначения, изображение черное. Может ли кто-нибудь сказать мне, где я делаю неправильно?

int main(int argc, char* argv[])
{
    Mat img1, img2, g1, g2;
    Mat disp, disp8;
    char* method ="SGBM";
    float scale = 1.f; // don't know why
    //img1 = imread(argv[1]);
    //img2 = imread(argv[2]);
    img1=imread("l1.jpg");
    img2=imread("r1.jpg");
    cvtColor(img1, g1, CV_BGR2GRAY);
    cvtColor(img2, g2, CV_BGR2GRAY);
    Size img_size = img1.size();
    Rect roi1, roi2;
    Mat Q;

    /*reading parameters of ectrinssic & intrinssic file*/
    const char* intrinsic_filename="intrinsics";
    Mat img1r, img2r;
    if( intrinsic_filename )
    {
        FileStorage fs("intrinsics.yml", cv::FileStorage::READ);
        if(!fs.isOpened())
        {
            printf("Failed to open file %s\n");
            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("extrinsics.yml", cv::FileStorage::READ);
        if(!fs.isOpened())
        {
            printf("Failed to open file %s\n");
            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, 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);


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


        //  img1 = img1r;
        // img2 = img2r;

        imshow("left1", img1r);
        imshow("left2", img2r); 

    }
}

выходное левое изображение} выходное правое изображение ![исходное левое изображение][3]


person MMH    schedule 03.12.2013    source источник


Ответы (3)


Разве вы не переключали параметры ввода/вывода на cvtColor(...) в:

cvtColor(img1, g1, CV_BGR2GRAY);
cvtColor(img2, g2, CV_BGR2GRAY);

g1 и g2 кажутся версиями входных изображений в градациях серого, но они никогда не используются в последующем коде. Почему бы вам просто не попробовать это наоборот?:

g1=imread("l1.jpg");
g2=imread("r1.jpg");
cvtColor(g1, img1, CV_BGR2GRAY);
cvtColor(g2, img2, CV_BGR2GRAY);
person iriusf    schedule 03.12.2013
comment
Спасибо за Ваш ответ. Но это ничего не меняет. вывод тот же :( - person MMH; 04.12.2013

Карты несоответствия выходят из OpenCV в масштабе, который не показывает большого контраста на 8-битных дисплеях. Вам нужно переназначить диапазон изображения, чтобы увеличить контрастность.

Чтобы улучшить этот ответ, вот код, который я использую для этого в Python:

disp = cv2.normalize(sgbm.compute(ri_l, ri_r), alpha=0, beta=255, \
    norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)

sgmb.compute() — это функция генерации карты несоответствий.

person Jon Watte    schedule 06.05.2014

если remap создал только серые изображения, это означает, что ваши внутренние/внешние значения были плохими.

вам придется вернуться к этапу калибровки, и делать это снова, пока вы не выйдете с ошибкой ‹ 1 от StereoCalibrate.

person berak    schedule 07.05.2014