Jump to content
Compvision.ru

zloibobig

Пользователи
  • Content count

    4
  • Joined

  • Last visited

  • Days Won

    2

zloibobig last won the day on December 21 2012

zloibobig had the most liked content!

Community Reputation

4 Новичек

About zloibobig

  • Rank
    Новичок
  1. Vasily, я в аналогичном проекте использовал Semi-Global Block Matching алгоритм, он был единственным, который работал очень хорошо. Здесь все зависит от калибровки камер, а именно от ректификации изображений с левой и правой камер. Это когда точки левого и правого изборажения имеют одинаковые y координаты. Я очень сильно намучался с этой калибровкой. Пришлось лепить целую конструкцию, чтобы камеры не смещались во время движения, иначе вся карта глубины превращалась в мусор и приходилось заново калибровать. Если потребуется могу прислать пример кода и параметров алгоритма. http://www.cvlibs.net/software/libelas.html Еще посмотрите вот эту библиотеку, выдает очень хорошие результаты при большом расстоянии между камерами. Там же есть библиотека для одометрии и зд реконструкции, как раз что вам и нужно. А вообще купите кинект, с ним все это гораздо проще.
  2. Стерео зрение

    Никогда не пользовался С-интерфейсом, но приведу часть кода на С++ из моего проекта pcl::PointCloud<pcl::PointXYZRGB>::Ptr BaseStereoMatcher::pointCloud(const cv::Mat &disp, const cv::Mat &image, const CalibrationParams &calib_params) { Q_ASSERT((image.rows != 0) && (image.cols != 0) && (image.rows == disp.rows) && (image.cols == disp.cols) && (image.type() == CV_8UC3)); pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZRGB>); cv::Matx44f Q = calib_params.DisparityToDepthMatrix; cv::Matx41f reproj_point; for (int v = 0; v < disp.rows; v++) { for (int u = 0; u < disp.cols; u++) { float d; if (disp.type() == CV_16S) d = disp.at<short>(v, u) / 16.0f; if (disp.type() == CV_32F) d = disp.at<float>(v, u); if (d <= FLT_EPSILON) { // point.x = point.y = point.z = bad_point; continue; } pcl::PointXYZRGB point; cv::Matx41f uv_point(u,v,d,1); //диспарантность в однородных координатах reproj_point = Q * uv_point; //так осуществляется проекция в однородные 3д координаты float w = reproj_point.val[3]; point.x = -reproj_point.val[0] / w; point.y = -reproj_point.val[1] / w; point.z = reproj_point.val[2] / w; // point - готовая точка в 3д cv::Vec3b pix = image.at<cv::Vec3b>(v, u); uint8_t r = pix[2], g = pix[1], b = pix[0]; uint32_t rgb = (static_cast<uint32_t>(r) << 16 | static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(); point.rgb = *reinterpret_cast<float*>(&rgb); cloud->push_back(point); } } return cloud; } [/code] Тоже самое выполняется в функции ReprojectTo3D (откомментированные строчки), так что можешь врунчую заполнить матрицу с 3д координатами. И, кстати, в матрице диспарантности все ее величины умножены на 16, поэтому прежде чем ее использовать, нужно значение диспарантности поделить на 16, выше в коде ты можешь это увидеть.
  3. 3D реконструкция

    Доброго времени, господа. Соорудил конструкцию из двух камер, получаю карту глубины с помощью Semi-global block matching алгоритма, все хорошо. Использую Point CLoud Library пока что просто для вывода облака точек, кстати проверял расстояние меряет довольно точно - на реальном расстоянии в 2 метра погрешность была 5 см. Расчитываю с помощью визуальной одометрии матрицу поворота+переноса из предыдущего кадра в текущий. Теперь проблема. Хочу строить 3д карту помещения, просто вращая свою установку и не могу понять как сюда привязать одометрию и регистрацию облаков точек. По сути получается аналогия со склейкой изображений для панорам, только в 3д пространстве. Помогите люди добрые разобраться, бьюсь 4 месяца уже.
  4. Blob detector

    Есть хорошая библиотека cvblob. Использует основные типы данных из Opencv, правда она на С, но перейти от IplImage к Mat и обратно не составляет труда. Туда передается CV_8UC1 изоражение после преварительной обработки, например, функцией threshold. Дальше библиотека по какому-то алгоритму находит "8-connected components". Подробностей не знаю. Еще можно по идее сегментацию по цвету сделать, чтобы вообще красиво было. Кстати, не подскажете быстрый алгоритм сегментации по цвету? Знаю только в OpenCV MeanShift segmentation алгоритм, но он очень медленный, и все. Также в модуле OpenCV features2d есть класс SimpleBlobDetector. Но он в моем случае ничего не находит, поэтому я использовал cvblob. Кстати, cvblob имеет структуру CvBlob, она хранит уже вычесленные центр блоба, моменты контура, площадь. Могу выложить пример кода использования cvblob.
×