2016-03-10 4 views
0

Я пытаюсь получить стерео-совместимость, работающую с изображениями искусственной глубины. Совпадение, кажется, не выйдет хороших (без закупорки), но перевернутый (черный = близко, белый = далеко)OpenCV стерео-совместимый инвертированный выход

int main() 
{ 
    Mat img1, img2, g1, g2; 
    Mat disp, disp8; 
    img1 = imread("W:/GoogleDrive/UDK/Croped_left/4.png"); 
    img2 = imread("W:/GoogleDrive/UDK/Croped_left/1.png"); 

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

    StereoBM sbm; 
    sbm.state->SADWindowSize = 9; 
    sbm.state->numberOfDisparities = 16; 
    sbm.state->preFilterSize = 5; 
    sbm.state->preFilterCap = 61; 
    sbm.state->minDisparity = -39; 
    sbm.state->textureThreshold = 507; 
    sbm.state->uniquenessRatio = 0; 
    sbm.state->speckleWindowSize = 0; 
    sbm.state->speckleRange = 8; 
    sbm.state->disp12MaxDiff = 1; 
    sbm(g1, g2, disp); 

    normalize(disp, disp8, 0, 255, CV_MINMAX, CV_8U); 

    imshow("left", img1); 
    imshow("right", img2); 
    imshow("disp", disp8); 

    waitKey(0); 

    return(0); 
} 

Это образы, которые я использую 4.png и 1.png

И выход я получаю это: enter image description here

Я что-то не так? Спасибо

+1

Попробуйте использовать [bitwise_not()] (http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#bitwise-not) функция, она переворачивает все байтов на вашем изображении (от белого до черного, от черного до белого и т. д.). У меня никогда не было опыта с стереоизображениями, не уверен, что это возможно, но прочитайте об этом, это может вам помочь. Я использую эту функцию для инвертирования изображений Mat. –

+0

Значения ** depth ** не инвертируются. Черные значения имеют ** низкое ** расстояние и ** низкое значение ** пикселя, а в то время как пиксели имеют ** высокую ** глубину и ** высокие значения ** пикселя! Может быть, вы просто перепутали условия? – anderas

+0

Ну, да, глубина вычисляется правильно, но она отображается неверно. 8-битные карты несоответствия обычно используют 255 для указания белого, который является пикселем ближе к камере, и 0 как черный пиксель, наиболее удаленный от камеры. http://students.cec.wustl.edu/~jwaldron/559/project2/depthMaps/torus.jpg – user1031204

ответ

0

Ну, я сделал работу, используя предложение Дайниуса Шальтениса, инвертируя изображение, используя побитовый оператор в opencv и удаляя все чистые белые пиксели.

//Bitwise_not to invert the images 
bitwise_not(disp8, disp8); 

//Loop through the images find all white pixels and replace with black 
for (int i = 0; i < disp8.rows; i++) 
    for (int j = 0; j < disp8.cols; j++) 
     if (disp8.at<uchar>(i, j) > 254) 
      disp8.at<uchar>(i, j) = 0; 

enter image description here

0

Я полагаю, вы смущены влево и вправо. 4.png должен быть прав/img2 и 1.png left/img1. (Изображение с изображением справа видно из левой камеры и наоборот.)

+0

Если я переворачиваю изображения по-другому, я получаю неплохие результаты даже после корректируя значения. – user1031204

+1

Странно, мне показалось, что это работает. Во всяком случае, я рад, что вы нашли решение. – jodis