2016-03-10 4 views
0

J'essaie d'obtenir une adaptation stéréo en travaillant avec des images de profondeur artificielle. La correspondance semble sortir bon (pas occlusions) mais inversé (noir = proche, blanc = bien)Sortie stéréo inversée 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); 
} 

Ce sont les images que je me sers 4.png et 1.png

et la sortie que je reçois est ceci: enter image description here

Est-ce que je fais quelque chose de mal? Merci

+1

Essayez d'utiliser la fonction [bitwise_not()] (http://docs.opencv.org/2.4/modules/core/doc/operations_on_arrays.html#bitwise-not), il intervertit tout octets sur votre image (blanc à noir, noir à blanc et ainsi de suite). Je n'ai jamais eu d'expérience avec les images stéréo, je ne sais pas si c'est possible, mais lire à ce sujet, il peut vous aider. J'utilise cette fonction pour inverser les images de Mat. –

+0

Les valeurs ** depth ** ne sont pas inversées. Les valeurs noires ont des valeurs de pixels ** basse ** et ** basse **, tandis que les pixels ont des valeurs ** haute ** profondeur et ** haute ** pixel! Peut-être que vous avez juste mélangé les termes? – anderas

+0

Eh bien, oui, la profondeur est calculée correctement mais elle est mal représentée. Les cartes de disparité 8 bits utilisent généralement 255 pour indiquer le blanc qui est un pixel plus proche de la caméra et 0 le pixel le plus éloigné de la caméra. http://students.cec.wustl.edu/~jwaldron/559/project2/depthMaps/torus.jpg – user1031204

Répondre

0

Eh bien, j'ai fait un travail en utilisant la suggestion de Dainius Šaltenis en inversant l'image en utilisant l'opérateur bitwise pas dans opencv et le enlever tous les pixels blancs purs.

//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

Je suppose que vous avez confondu gauche et droite. 4.png devrait être à droite/img2 et 1.png à gauche/img1. (L'image avec l'objet à droite est vue de la caméra de gauche et vice versa.)

+0

Si je retourne les images d'un autre côté, je reçois des résultats assez mauvais même après ajuster les valeurs. – user1031204

+1

Étrange, ça a l'air de marcher pour moi. Quoi qu'il en soit, je suis content que vous ayez trouvé une solution. – jodis