2012-12-13 7 views
6

Şu anda bir çift stereo kamera için bir openCV programı yazıyorum. Kamera kalibrasyonu ve Stereo Kalibrasyon yapıldı.InitUndistortRectifyMap ve Remap

Bir sonraki adım, elde ettiğim 2 görüntüden bir özelliğin yerini uzayda bulmak. Bu yüzden Stereo'yu görüntüleri düzeltmek ve daha sonra hesaplamalarımı yapmak zorundayım.

I initUndistortRectifyMap ile Karşılıklı sorun şudur:

I yeniden eşleme sonra siyah görüntüler elde stereoRectify()initUndistortRectifyMap() için hesaplanmıştır R1 veya R2 geçmesi -Eğer.

-r (boş bir matris) öğesini initUndistortRectifyMap()'a aktarırsam, yeniden hizalamadan sonra düzeltilmiş görüntüler elde ederim. Aldığım görüntüler biraz çarpık.

2 kamerayı düzeltmek için R1 ve R2'yi initUndistortRectifyMap()'a aktarmam gerekiyor, aksi takdirde boş bir matris geçirilirken stereo kafalar aynı düzlemde döndürülemez.

stereoRectify(intrinsic[0], distCoeffs[0], intrinsic[1], distCoeffs[1], imageSize, 
    R, T_Stereo, R1, R2, newP1, newP2, Q, CV_CALIB_ZERO_DISPARITY, -1, imageSize); 

if (x_Cam.GetSerial()=="4002678487") 
{ 
    initUndistortRectifyMap(intrinsic[0], distCoeffs[0], R1, newP1, imageSize,   
     CV_16SC2 , mapx1, mapy1); 
    remap(x_Image, imageRectified[0],mapx1, mapy1, INTER_LINEAR); 

    return imageRectified[0]; 
} 

if (x_Cam.GetSerial()=="4002702131") 
{ 
    //flip(in, in, -1); 
    initUndistortRectifyMap(intrinsic[1], distCoeffs[1], R2, newP2, imageSize, 
     CV_16SC2 , mapx2, mapy2); 
    remap(x_Image, imageRectified[1],mapx2, mapy2, INTER_LINEAR, BORDER_CONSTANT, 0); 

    return imageRectified[1]; 
} 

ben stereoRectify() için gidiş tüm matris değerleri kontrol edilmeli ve Doğru olduklarından: Aşağıdaki

benim kodudur. R1 ve R2 dönüş matrisleri de doğru gibi görünüyor. Sadece çıktı olarak siyah görüntüler alıyorum.

Efekti görmek için çöp değerlerini R1 ve R2 (örneğin R1 * R2) için InitUndistortRectifyMap()'a aktarmayı denedim ve siyah görüntüler değil, garip sonuçlar aldım.

+2

Sorunun şu olabileceğini varsayıyorum: "Neden initUndistortRectifyMap()' sadece garip sonuçlar değil, siyah görüntüleri döndürüyor? " Bir dahaki sefere özel sorunuzu açıklığa kavuşturmaya çalışın. –

+0

'initUndistortRectifyMap() 'işlevini kullanabilmeniz için önce fotoğraf makinesini kalibre etmeniz gerekiyor ve görünüşe göre bunu henüz yapmadınız. Lütfen kamerayı kalibre ettiğiniz kodu yazınız: http://www.aishack.in/2010/07/calibrating-undistorting-with-opencv-in-c-oh-yeah/ –

+0

Tek kameralar hem StereoCalibrate() ile birlikte kameralar. R ve T matrislerini StereoCalibratoin'den kontrol ettim ve doğrular. – user1901213

cevap

7

Eh, ben sorun etrafında gitti ve herkesin kullanabileceği bir çözüm paylaşacağımı düşündüm.

InitUndistortRectifyMap StereoRectify tarafından üretilen Rotasyon Matrisleri R1 ve R2'yi kullanırken boş görüntü çıktı.

Bu nedenle, OpenCV belgelerine göre hesaplanan rotasyonları 2 eşyazımı H1 matrisler üreten StereoRectifyUncalibrated, ve H2 ve I kullanımı çalıştı:

R1 = inv (CamMatrix1) * H1 * CamMatrix1 R2 = inv (CamMatrix2) * H2 * CamMatrix2

Yeni R1'i ve R2'yi InitUndistortRectifyMap geçtim ve yeniden eşleştirdim ve sonuçlar tatmin edici.

2

Bu eski yazıyı kazacağım çünkü bu soruna yönelik araştırmalarda son zamanlarda biraz çaba harcamışım. Yani, ben aynı konuda karşılaştım - uygun stereo kalibrasyon ve düzeltme (tüm opencv sağlanan stereo görüş makineleri), nihayet 'çarpık' görüntüler siyahtı. Neden böyle olduğunu açıklamama izin ver.

Her şeyden önce, remap (src, dst, mapX, mapY) çalışır. Eğer documentation giderseniz görebilirsiniz

enter image description here

Ve değerlere MapX (x, y) ya da MAPY biri (x, y) dışında src ise, dst (x, y) = o 0 (siyah!). Bu, tüm çiftlerin (x, y) mapX veya mapY'de geçersiz değerlere sahip olduğu anlamına gelir. Örneğin, benim durumumda, açıklayamadığım nedenlerden dolayı, mapY negatif tüm değerlere sahibim.

Ancak bunun nedeni bunun yalnızca stero görüş yapılandırmalarıyla gerçekleşmesidir. Aralarında dönme açıları küçük (birkaç dereceye kadar) küçük olacak şekilde hizalanmış kameralar ile birkaç örnek yaptım. Bu durumda, opencv prosedürleri iyi çalışır. İki euler açıları aynı olduğunda ve bir açı (Y etrafında dönme) 17 derece olduğunda sahip olduğum 'siyah' çıktı sorunları. Bu durumda, bazı deney yaptı - Ben şu şekilde MapX ve MAPY tercüme:

for(int i=0;i<_imageSize.width;i++) 
     for(int j=0;j<_imageSize.height;j++) { 
      _mapXA.at<float>(j, i) -= 1200; 
      _mapYA.at<float>(j, i) -= 1200; 
      _mapXB.at<float>(j, i) += 2500; 
      _mapYB.at<float>(j, i) += 2500; 
     } 

(I _mapXA çok büyük olduğunu gördü ve _mapYB -1500 etrafında negatif değerler vardı beacuse). Şaşırtıcı bir şekilde, remap()'dan sonraki çıktı siyah değildi. Görüntü tam olarak bir açı etrafında döndürülmüş gibi görünüyordu (17, tam olarak kontrol etmedim) ama hiç düzeltilmedi.

Opencv'nin stereo görüş alanındaki iyi olmayan paralel kameraları işleyememesi olası olabilir. Demek istediğim, bazı örnekler için çalışıyor ve bazıları için değil - ama bu yöntemin güvenilir olmadığı anlamına geliyor.

kez daha, bu sizin kadar neredeyse frontal paralel olması için kameraları düzenleyen eğer iyi sonuçlar almak eğiliminde olacaktır nedenlerinden biri: Ayrıca, bu tür bilgileri Gary Bradski ve Adrian Kaehler Öğrenme OpenCV bulabilirsiniz mümkün (en azından stereo vizyonunda uzman oluncaya kadar)