Я изначально разместил это на форумах 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. ]
Спасибо за чтение, и я честно оценить любые предложения на данный момент ...
Мне не разрешалось размещать более двух ссылок. Таким образом, они являются остальными: 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
Вопрос: вы останетесь довольны облаком точек в камере координатная рамка?Если это так, вы можете использовать файл калибровки Point Gray, чтобы получить то, что вы хотите (без калибровки с помощью шахматной доски). Исправленные изображения не имеют искажений объектива, поэтому, учитывая значение несоответствия, вы преобразовываете его в глубину (z = Bf/d) и обратно проецируете его в координаты камеры с использованием известного фокусного расстояния f. – killogre