2013-10-06 2 views
9

Я изначально разместил это на форумах OpenCV, но, к сожалению, у меня не было слишком много просмотров/ответов, поэтому я размещаю здесь свои надежды на то, что у кого-то может быть направление, ?Согласование/калибровка с помощью OpenCV

Я использую стереоаппаратуру Bumblebee XB3 и имеет 3 объектива. Я провел около трех недель, читая форумы, учебные пособия, учебную книгу OpenCV и фактическую документацию OpenCV по использованию функций стереокалибровки и стереофонического сопоставления. Таким образом, моя проблема заключается в том, что у меня есть хорошая карта несоответствий, созданная, но очень плохая точка-облака, которые кажутся перекошенными/скрюченными и не являются репрезентативными для реальной сцены.

То, что я сделал до сих пор:

Пользовался OpenCV stereo_calibration и stereo_matching примеров:

калиброванных моя стереокамеру с помощью шахматной доски изображений

1) Raw Scene Images : http://answers.opencv.org/upfiles/1380850337241986.jpg
2) Исправлены необработанные изображения, полученные с камеры, с использованием матриц после калибровки камеры
: http://answers.opencv.org/upfiles/13808502665723237.png
3) Сформирован несоответствие изображение из выпрямленных изображений с помощью Stereo Matching (SGBM)
: 4) Прогнозируемого этих различий к 3D Облако точек

То, что я сделал до сих пор, упразднение в стороне моя проблема:

  • Я попробовал 1-й и 2-го изображения, затем второй и 3 линзы и наконец первый и второй.
  • Я повторно запустить калибровка моей шахматной доски захватывает варьируя расстояние (ближе/дальше)
  • я использовал более 20 стереопары для калибровки используется
  • Различных шахматной размер есть: использовал изображение 9х6 для шахматной доски для калибровки и теперь переключилось на использование 8х5 вместо
  • Я попытался использовать варианты соответствия блоков, а также варианты SGBM и получить
    относительно похожие результаты. Получение
    лучших результатов с SGBM до сих пор.
  • Я варьировалась в диапазон диспаритета, изменила SAD размера окна и т.д. с небольшим улучшением

Я подозреваю, что проблема заключается в:

Моего несоответствие изображение выглядит относительно приемлемым , но следующим шагом будет переход в облако 3D-точек с использованием Q-матрицы. Я подозреваю, что я не калибрую камеры правильно, чтобы создать правильную Q-матрицу. К сожалению, я ударил стену с точки зрения того, что еще я могу сделать, чтобы получить лучшую Q-матрицу. Может ли кто-нибудь предложить вам пути вперед?

Другое, что, я думаю, может быть проблематичным, - это предположения, которые я делаю при использовании функции cv :: stereoCalibrate.На данный момент я индивидуально откалибрую каждую камеру, чтобы получить матрицы камер и искажений (матрицы CameraMatrix [0], distCoeffs [0] и cameraMatrix [1], distCoeffs [1]), что облегчает сложность функции stereoCalibrate.

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

Кроме того, я думаю, было бы полезно упомянуть, как я перехожу от несоответствия к облаку точек. Я использую OpenVV cv :: repjectImageTo3D, а затем записываю данные в облачную структуру точек PCL. Вот соответствующий код:

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: Причина, почему я выбрал, чтобы загрузить эти изображения, что сцена имеет текстуру, поэтому я ожидал ответа, сказав, что сцена слишком однородны. Покрытие на перегородке и стуле также довольно богато с точки зрения текстуры.

Несколько вопросов:

Можете ли вы помочь мне удалить изображение/несоответствий самолет, который, кажется, часть облака точек? Почему это происходит?

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

По моему наивному мнению, кажется, что изображение несоответствия в порядке. Но облако точек, безусловно, ничего не ожидало бы от относительно приличного изображения несоответствия, это еще хуже.

Если это помогает, я упомянул о Q-матрице, которую я получаю после калибровки камеры, если вы обнаружите что-то очевидное. Сравнивая это с книгой Learning OpenCV, я не думаю, что есть что-то явно неправильно ...

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. ] 

Спасибо за чтение, и я честно оценить любые предложения на данный момент ...

+0

Мне не разрешалось размещать более двух ссылок. Таким образом, они являются остальными: 3) Сгенерировано изображение несоответствия с выпрямленными изображениями с использованием Stereo Matching (SGBM): http://answers.opencv.org/upfiles/13808503551344959.png 4) Прогнозировали эти различия в 3D Point Cloud: http://answers.opencv.org/upfiles/13808503649376151.png и: http://answers.opencv.org/upfiles/13808503782809438.png – BumblebeeUser89

+0

Вопрос: вы останетесь довольны облаком точек в камере координатная рамка?Если это так, вы можете использовать файл калибровки Point Gray, чтобы получить то, что вы хотите (без калибровки с помощью шахматной доски). Исправленные изображения не имеют искажений объектива, поэтому, учитывая значение несоответствия, вы преобразовываете его в глубину (z = Bf/d) и обратно проецируете его в координаты камеры с использованием известного фокусного расстояния f. – killogre

ответ

0

Я нашел похожие проблемы при использовании функции восстановления 3D OpenCV (v.2.4.6). Некоторые люди, такие как Мартин Перис, снова реализовали сами. http://blog.martinperis.com/2012/01/3d-reconstruction-with-opencv-and-point.html

К сожалению, иногда я обнаружил проблемы в обеих реализациях с моими данными. Итак, я предположил, что моя проблема в этих случаях связана с плохим внешним описанием параметров камеры. Возможно, это и ваше дело. : -?

PS. Чтобы избавиться от фона, вам нужно сегментировать его. Или, по крайней мере, проверьте глубину, превышающую пороговую величину, как только будет проведена реконструкция. flagMissingValues ​​только исключает точки на «бесконечности» PS2. Пожалуйста, сообщите нам, решите ли вы эту проблему. Я думаю, что это ценно для всей общины. Thnx

+0

Ссылка мертва, но у нее есть интернет. –

Смежные вопросы