2016-01-14 3 views
1

J'ai construit mes propres stéréocaméras à partir de deux caméras USB (avec un autofocus gênant). Je les ai calibré à l'aide /opencv/samples/cpp/stereo_calib.cpp', qui a produit un extrinsèques/intrinsics fichier avec une erreur RMS de 0,4818 et une erreur de reprojection moyenne 0,5426Problèmes de traitement d'image stéréocam OpenCV en temps réel (post-calibrage)

Je suis en train maintenant d'exécuter en temps réel la cartographie de profondeur à l'aide Ptr<StereoBM> bm dans OpenCV. Je reçois des images inutiles et je me demande si quelqu'un peut me diriger dans la bonne direction. Je me demande aussi si la mise au point automatique des caméras de temps en temps peut changer la focale et donc changer l'étalonnage, en altérant les résultats.

Code et photos ci-dessous.

Bonus si quelqu'un peut recommander des méthodes plus robustes que StereoBM pour faire correspondre à OpenCV :)


Image de calibration de checkerboard: enter image description here

image de la caméra gauche: enter image description here

Poster StereoBM Traitement: enter image description here

Snippet du Code:

//Set up stereoBM 
    Ptr<StereoBM> bm = StereoBM::create(16,9); 

    //Read intrinsice parameters 
    string intrinsic_filepath = "/home/will/Desktop/repos3.0/stereo-vision/Stereo-Vision/intrinsics.yml"; 
    FileStorage fs(intrinsic_filepath, FileStorage::READ); 
    if(!fs.isOpened()) 
    { 
     printf("Failed to open intrinsics.yml"); 
     return -1; 
    } 
    Mat M1, D1, M2, D2; 
    fs["M1"] >> M1; 
    fs["D1"] >> D1; 
    fs["M2"] >> M2; 
    fs["D2"] >> D2; 

    //Read Extrinsic Parameters 
    string extrinsic_filepath = "/home/will/Desktop/repos3.0/stereo-vision/Stereo-Vision/extrinsics.yml"; 
    fs.open(extrinsic_filepath, FileStorage::READ); 
    if(!fs.isOpened()) 
    { 
     printf("Failed to open extrinsics"); 
     return -1; 
    } 

    Mat R, T, R1, P1, R2, P2; 
    fs["R"] >> R; 
    fs["T"] >> T; 

    Mat frame1,frame2, gray1, gray2; 
    int counter = 0; 

    capture >> frame1; 
    capture >> frame2; 

    Size img_size = frame1.size(); 
    Rect roi1, roi2; 
    Mat Q; 

    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); 

    int numberOfDisparities = 16; 
    int SADWindowSize = 9; 

    bm->setROI1(roi1); 
    bm->setROI2(roi2); 
    bm->setPreFilterCap(31); 
    bm->setBlockSize(SADWindowSize); 
    bm->setMinDisparity(0); 
    bm->setNumDisparities(numberOfDisparities); 
    bm->setTextureThreshold(10); 
    bm->setUniquenessRatio(15); 
    bm->setSpeckleWindowSize(100); 
    bm->setSpeckleRange(32); 
    bm->setDisp12MaxDiff(1); 

    while(1){ 
     capture >> frame1; 
     capture2 >> frame2; 
     imshow("Cam1", frame1); 
     imshow("Cam2", frame2); 

     /************************* STEREO ***********************/ 

     cvtColor(frame1, gray1, CV_RGB2GRAY); 
     cvtColor(frame2, gray2, CV_RGB2GRAY); 

     int64 t = getTickCount(); 

     Mat img1r, img2r; 
     remap(gray1, img1r, map11, map12, INTER_LINEAR); 
     remap(gray2, img2r, map21, map22, INTER_LINEAR); 

     Mat disp, disp8; 
     bm->compute(img1r, img2r, disp); 
     t = getTickCount() - t; 
     printf("Time elapsed: %fms\n", t*1000/getTickFrequency()); 

     disp.convertTo(disp8, CV_8U, 255/(numberOfDisparities*16.)); 
     imshow("disparity", disp8); 
    } 
+0

L'autofocus va changer le calibrage des caméras - vous devez le désactiver. –

Répondre

1

Ainsi, un demi-pixel d'erreur RMS signifie que votre calibration est essentiellement ordures.

Dans votre image d'étalonnage, j'ai remarqué que la cible n'est pas plate. Si je peux voir cela, l'appareil photo peut aussi, mais le modèle de calibrage supposera toujours qu'il est plat, et cela rendra l'optimiseur très triste.

Suggère que vous jetez un oeil à this answer sur l'étalonnage.

+0

C'est un article fantastique, j'aimerais qu'il soit plus visible et facile à trouver. Je ne suis pas sûr si c'est votre domaine d'expertise, mais savez-vous d'un moyen infaillible pour désactiver l'autofocus sur les caméras USB? Je cours ubuntu 14.04. Je n'ai pas réussi à trouver un moyen de le désactiver via openCV, (pas de chance avec VideoCapture :: set) Je n'ai pas non plus eu de chance manuellement via uvcdynctrl. Je suis en cours d'exécution avec deux de ces gars-là: http://www.amazon.com/gp/product/B00VLXV4FU/ref=s9_simh_gw_g147_i3_r?pf_rd_m=ATVPDKIKX0DER&pf_rd_s=desktop-1&pf_rd_r=1H9FYP1AVBSBF4XQ7T8Y&pf_rd_t=36701&pf_rd_p=2079475242&pf_rd_i=desktop – wprins

+0

Pas spécifiquement, mais Je commence par googler le numéro de série de la carte de la caméra (ou tous les identifiants de la puce), et j'espère qu'une fiche technique (ou mieux, un manuel du programmeur d'application) s'affiche et j'espère qu'il y aura une entrée de contrôle Je voudrais prier la déesse de l'appareil photo bon marché que le concepteur de cette carte particulière avait la sagesse de l'acheminer vers le contrôleur USB, enfin, je lisais très attentivement les documents du pilote USB pour voir comment ce signal peut être affirmé. Inutile de dire que vos chances de se faufiler le long de cette chaîne augmentent à chaque étape: il y a une raison pour laquelle les caméras dédiées au CV coûtent de l'argent :-( –