2013-10-06 22 views
9

Bunu ilk olarak OpenCV forumlarında yayınladım, ancak maalesef çok fazla görüş/cevap almadım bu yüzden burada birinin önerebileceği bir yönün olabileceğini ümit ederek gönderiyorum ?OpenCV Stereo Eşleştirme/Kalibrasyon

Bumblebee XB3 Stereo Kamera kullanıyorum ve 3 objektife sahip. Üç hafta boyunca forumları, öğreticileri, OpenCV kitabını ve stereo kalibrasyon ve stereo eşleştirme işlevselliğini kullanma hakkındaki gerçek OpenCV belgelerini okudum. Özet olarak, benim sorunum, iyi bir eşitsizlik haritasının oluşmasıdır, ancak çok zayıf nokta-bulutları, çarpık/ezilmiş gibi görünmektedir ve gerçek sahneyi temsil etmemektedir.

şimdiye kadar ne yaptım:

için OpenCV stereo_calibration ve stereo_matching örnekleri Kullanılan:

satranç tahtası görüntüleri

1) Ham Sahne Görüntüleri kullanarak stereo kamera Kalibre :
2) Fotoğraf makinesinden elde edilen ham görüntüleri, kamera kalibrasyonu'den sonra matrisler kullanarak düzeltin.: http://answers.opencv.org/upfiles/13808502665723237.png
3) Stereo Eşleme (SGBM)
kullanılarak rektifiye görüntülerden bir uyumsuzluk görüntü Oluşturulan: bu farklılıkları Öngörülen) 4 3D Nokta Bulut ben doğru eliminasyon kadar ileri ne yaptın

benim sorun:

  • Ben 1. ve 2. görüntüleri denedi, daha sonra 2. ve 3. lensler ve nihayet 1. ve 2.. Benim satranç kurulu
  • Ben ettik yeniden çalıştırmak kalibrasyon ben
  • Değişen Chessboard boyutu kullanılan kalibrasyon için 20 yılı stereo çiftleri kullandık
  • mesafe (yakın/uzağa) değiştirilerek yakalar: Ben kalibrasyon için bir 9x6 Chessboard görüntüsünü kullandı ve şimdi bir 8x5 yerine
  • kullanıldı. Blok Eşleştirmeyi ve SGBM varyantlarını kullanmayı denedim ve
    göreceli olarak benzer sonuçlar elde ettim. Şimdiye kadar SGBM ile
    daha iyi sonuçlar elde edin.
  • Ben, eşitsizlik aralıkları değişiyordu küçük bir iyileşme ile SAD Pencere boyutu vb değiştirdik

Sorunun şüpheli Ne:

Benim eşitsizliği görüntü nispeten kabul edilebilir görünüyor ama bir sonraki adım Q matrisini kullanarak 3D Nokta bulutuna gitmek. Şüpheliyim, doğru Q matrisini oluşturmak için kameraları doğru şekilde kalibre etmiyorum. Ne yazık ki, daha iyi bir Q matrisi elde etmek için başka neler yapabileceğimi düşünmek açısından duvara çarptım. Birisi önünüzdeki yolları önerebilir mi?

Sanırım sorun olabileceğini düşündüğüm diğer şey, cv :: stereoCalibrate işlevini kullanırken yaptığım varsayımlar.Şimdilik, kamerayı ve distorsiyonu (cameraMatrix [0], distCoeffs [0] ve cameraMatrix [1], disCoeffs [1]) matrislerini elde etmek için her kamerayı ayrı ayrı kalibre ediyorum, böylece stereoCalibrate fonksiyonu için karmaşıklığı biraz daha kolay hale getiriyor.

stereoCalibrate(objectPoints, imagePoints[0], imagePoints[1], 
        cameraMatrix[0], distCoeffs[0], 
        cameraMatrix[1], distCoeffs[1], 
        imageSize, R, T, E, F, 
        TermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 100, 1e-5), 
        //CV_CALIB_FIX_ASPECT_RATIO + 
        //CV_CALIB_ZERO_TANGENT_DIST + 
        //CV_CALIB_SAME_FOCAL_LENGTH + 
        CV_CALIB_RATIONAL_MODEL 
        //CV_CALIB_FIX_K3 + CV_CALIB_FIX_K4 + CV_CALIB_FIX_K5 
        ); 

Ayrıca, bunu ben bulut noktasına eşitsizlik dan gidiyorum nasıl ifade etmekte fayda var diye düşünüyorum. OpenCV's cv :: reprojectImageTo3D kullanıyorum ve daha sonra verileri bir PCL Point bulut yapısına yazıyorum.

cv::reprojectImageTo3D(imgDisparity16S, reconstructed3D, Q, false, CV_32F); 
    for (int i = 0; i < reconstructed3D.rows; i++) 
    { 
    for (int j = 0; j < reconstructed3D.cols; j++) 
    { 
     cv::Point3f cvPoint = reconstructed3D.at<cv::Point3f>(i, j); 
      //Filling in a PCL structure 
      pcl::PointXYZRGB point; 
      point.x = cvPoint.x; 
      point.y = cvPoint.y; 
      point.z = cvPoint.z; 
      point.rgb = rectified_imgRight.at<cv::Vec3b>(i,j)[0]; //Grey information 

      point_cloud_ptr->points.push_back (point); 
    } 
    } 

    point_cloud_ptr->width = (int) point_cloud_ptr->points.size(); 
    point_cloud_ptr->height = 1; 
    pcl::io::savePCDFileASCII("OpenCV-PointCloud.pts", *point_cloud_ptr); 

PS: İşte alakalı kodudur Bence bu görüntüler sahne bazı dokuya sahiptir vardır yüklemeyi tercih sebebi, bu yüzden sahneyi diyerek cevap tahmin edildi çok homojen olduğunu. Bölme ve sandalye üzerindeki örtü de doku açısından oldukça zengindir.

Birkaç Sorular:

beni noktası bulutunun parçası gibi görünüyor resim/eşitsizliği uçağı kaldırmak yardımcı olabilir misiniz? Bu neden oluyor?

Yanlış yaptığım belli bir şey var mı? Kodumu gönderirim, ancak sağlanan OpenCV örneklerine çok benzer ve daha yaratıcı bir şey yaptığımı düşünmüyorum. İlgili olabilecek belirli bir bölüm varsa yapabilirim.

Benim naif düşüncemde, eşitsizlik görüntüsü iyi görünüyor. Ancak nokta bulutu, nispeten iyi bir eşitsizlik imajından beklediğim kesinlikle bir şey değil, WAY daha da kötü.

Eğer yardımcı oluyorsa, fotoğraf makinesi kalibrasyonundan sonra elde ettiğim Q matrisinden bahsetmiştim, açık bir şekilde dışarı atılan bir şey ortaya çıkar. Öğrenme OpenCV defterine bu karşılaştırma, ben ... pervasızca yanlış bir şey var mı okuma için

Q: rows: 4 
    cols: 4 
    data: [ 1., 0., 0., -5.9767076110839844e+002, 0., 1., 0., 
     -5.0785438156127930e+002, 0., 0., 0., 6.8683948509213735e+002, 0., 
     0., -4.4965180874519222e+000, 0. ] 

Teşekkür sanmıyorum ve dürüstçe ... Bu noktada herhangi önerileri takdir edersiniz

+0

2'den fazla bağlantı yayınlayamadım. Bu yüzden kalanlar: 3) Stereo Eşleştirme (SGBM) kullanarak düzeltilmiş görüntülerden bir eşitsizlik görüntüsü oluşturuldu: http://answers.opencv.org/upfiles/13808503551344959.png 4) Bu eşitsizlikleri bir 3D'ye yansıtmak Point Cloud: http://answers.opencv.org/upfiles/13808503649376151.png ve: http://answers.opencv.org/upfiles/13808503782809438.png – BumblebeeUser89

+0

Soru: Fotoğraf makinesindeki nokta bulutu ile memnun olacaksınız koordinat çerçevesiEğer öyleyse, istediğiniz şeyi elde etmek için Nokta Gri kalibrasyon dosyasını kullanabilirsiniz (bir satranç tahtasına göre ayarlama yapmadan). Düzeltilmiş görüntülerde lens distorsiyonu yoktur, bu yüzden bir eşitsizlik değeri verilirse, onu derinlik (z = Bf/d) olarak dönüştürürsünüz ve bilinen odak uzaklığı f'yi kullanarak onu kamera koordinatlarına yansıtırsınız. – killogre

cevap

0

OpenCV (v.2.4.6) 3D yeniden yapılandırma fonksiyonu kullanılırken benzer problemler buldum. Martin Peris gibi bazı insanlar yeniden kendi başlarına uyguladılar. http://blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html

Ne yazık ki bazen verilerimle her iki uygulamada da sorunlar buldum. Yani, bu gibi durumlarda benim sorunumun zayıf bir dışsal kamera parametresi tanımlamasına bağlı olduğunu varsaydım. Belki de senin davan. : -?

PS. Arka plandan kurtulmak için onu segmentlere ayırmanız gerekir. Veya en azından, yeniden yapılanma bittikten sonra bir eşikten daha büyük olan derinlik değerlerini kontrol edin. handleMissingValues ​​bayrağı yalnızca "sonsuz" PS2'deki noktaları ortadan kaldırır. Lütfen, bu sorunu çözerseniz bize bildirin. Bence tüm burası için değerlidir. Thnx

+0

Bağlantı öldü, ancak internet sağlayıcısı buna sahip. –