Перейти к содержимому
Compvision.ru

RinOS

Пользователи
  • Количество публикаций

    99
  • Зарегистрирован

  • Посещение

  • Days Won

    8

Сообщения, опубликованные пользователем RinOS


  1. Вызывал я функцию cvReprojectImageTo3D с разным Q, и пришел к выводу что она все-таки работает (карта высот довольно реалистичная в MatLab-e).

    a6a50d5e9f4f.jpg

    484140c9f0e6.jpg

    f2f0e141cc98.jpg

    17a500600d6d.jpg

    Функция cvReprojectImageTo3D, возвращает 3х канальное изображение 3 канал, глубина - расстояние до объекта.

    Так я получаю расстояние

    
      cvReprojectImageTo3D(imageDepth, 3dImage, Q);
    
      cvSetImageCOI(3dImage, 3);
    
      cvCopy(3dImage, Zimg, 0);
    
    
      dist = cvGetReal2D(Zimg, 160, 120);
    
    

    Но вот в чем прикол... Если объект дальше то и значение dist должно быть больше, а происходит ровно наоборот...

    Чем ближе объект, тем больше значение dist.

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

    расстояние 60 см, dist равен 0,117

    расстояние 70 см, dist равен 0,093

    расстояние 80 см, dist равен 0,079

    расстояние 90 см, dist равен 0,661

    расстояние 100 см, dist равен 0,580

    Где то не вяжется... Или я чего то не понимаю...


  2. Рекомендую все-таки использовать cvStereoRectify() т.к. результат его работы более точен, а cvStereoRectifyUncalibrated() лучше использовать когда существуют значительные непараллельности в оптических осях камер, насколько я понимаю.

    Смотрел пример stereo_calib.cpp, там показаны оба метода cvStereoRectify и cvStereoRectifyUncalibrated, мне показалось что cvStereoRectifyUncalibrated, работает лучше... по крайней мере карта высот выглядит правдоподобнее.

    Искомую матрицу репроекции Q вы можете заполнить вручную по формуле Q= стр 435 Learn OpenCV, используя ранее вычисленные матрицы: CameraMatrix и T, например.. но мне кажется это сложный путь, и ... некоторые величины (f, n) придется выдумывать.

    У меня есть модуль (см. вложение) который вроде как строит Q, по некоторым параметрам:

    * \brief Constructor that takes camera parameters and parameterizes the object.

    * The object is ready to be used after constructed by this constructor.

    * @param Fx - focal length in x direction of the rectified image in pixels.

    * @param Fy - focal length in y direction of the rectified image in pixels.

    * @param Tx - Translation in x direction from the left camera to the right camera.

    * @param Clx - x coordinate of the optical center of the left camera

    * @param Crx - x coordinate of the optical center of the right camera

    * @param Cy - y coordinate of the optical center of both left and right camera

    * @param dispUnitScale - the unit of the value in a disparity map. e.g. 1/4 of a pixel.

    */

    Правда не известно откуда брать точные значения этих параметров...

    При подаче в функцию cvInitUndistortRectifyMap (вы же ректифицируете изображение?)

    Да, вы можете посмотреть исходник с которым я работаю, ссылка в первом посте.

    Вот написал функцию, которая принимает матрицу 4 параметра cvInitUndistortRectifyMap

    Я попробовал использовать ее вот что получилось:

    Q возвращенное функцией cvStereoRectify:

    [ 1., 0., 0., -179.1385765075683600, 0., 1., 0.,

    -120.1025462150573700, 0., 0., 0., 350.7473711626223000, 0., 0.,

    -24.8326591292256540, -538.7927019658170600 ]

    Q полученное с помощью cvStereoRectifyUncalibrated и вашей функции:

    [ 1., 0., 0., -150.7913341775544300, 0., 1., 0.,

    -102.6185674775258400, 0., 0., 0., 352.8618670197555500, 0., 0.,

    -25.9740261147689360, 0. ]

    Пытался много раз калибровать, Q иногда больше похожи иногда меньше в среднем как-то так.

    stereo_utils.rar

    • Like 2

  3. Допустим как то я как то скалибровал и получил disparityImage, карта глубины конечно не ахти, впрочем сойдет...

    Карта глубины как я понял это не реальные числа глубины, а разности между слоями... (так ли)?

    И что бы получить расстояние до объекта, надо преобразовать координаты.

    Если я правильно понял то для этого используется функция cvReprojectImageTo3D() (так ли)?

    В которой:

    первый параметр disparityImage который нам создал cvFindStereoCorrespondenceBM()

    второй параметр IplImage (size, IPL_DEPTH_32F, 3)

    третий параметр самый интересный... матрица СvMat(4,4, CV_64F), в доке написано что:

    (You’re going to need the reprojection matrix (named Q) from the cvStereoRectify method.)

    Дело в том что в этой программе, используется cvStereoRectifyUncalibrated, а там ни какого Q, нет...

    откуда бы взять эту матрицу Q?

    И вообще правильный ли ход мыслей, для получения реальных координат, из disparityImage?


  4. Читая статьи на эту тему и форумы выяснил что

    1. Оси камер должны быть параллельны

    2. Расстояние между камерами 10-15 см.

    3. Калибровка очень, и очень важна (правда ни чего не нашел о том как правильно калибровать...)

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

    Кто знает как правильно калибровать)?

    Доска для калибровки во вложении.

    ChessBoard Stereo Calibration.pdf

    • Like 1

  5. Всем привет! Решил заняться стерео зрением.

    Нашел в сети такой проект на OpenCV: http://code.google.com/p/opencvstereovision/

    даже удалось скомпилить его) exe во вложении.

    Поигрался с программой пытался калибровать шахматной доской но результат мягко говоря неочень...

    Раньше ни когда этим не занимался сразу возникло несколько вопросов.

    Какое расстояние должно быть между камерами?

    a699d7ed427e.png

    Как они должны быть направлены? (какой угол примерно)

    3d875203edef.png

    (ехе требует библиотеки OpenCV 1.1 и библиотеки Qt если в сети не найдете выложу )

    OpenCV-Qt-StereoCalibration.rar

    • Like 2

  6. У меня у одного такая проблема, с 2.2?

    Пытаюсь подключится к 2 вебкам:

    
        captures[0] = cvCreateCameraCapture(0);
    
        captures[1] = cvCreateCameraCapture(1);
    
    

    к первой подключается ко второй нет. Хотя компилировал под 1 версию все отлично работало...


  7. На первый взгляд ошибка в следующем:

    Вынеси определение объекта IplImage *img; ДО цикла while.

    В теле цикла просто:

    img = cvQueryFrame(capture);

    Не помогло. Я даже делал циклический буфер, то есть что бы делать cvReleaseImage не сразу, а по прошествии некоторого времени, все равно ошибка вылетает.

    Unhandled exception at 0x6d7a15be in ffmpegtest.exe: 0xC0000005: Access violation writing location 0x01141000.

  8. О подключении версии 2.0 к билдеру

    Заменяем в строках с ошибками "Mat_" на "Mat_<_Tp>".

    Попробовал, проблемы с шаблонами это решает (остается много других ошибок, но они не сложно исправляются).

    Перспектива есть.

    Подскажи как исправил)?

    к примеру у меня в cxcore в строке (2144) FileNode operator -> () const;

    выдает : cxcore.hpp operator-> must return a pointer or a class

    еще есть куча ошибок подобных [cxoperations.hpp(: E2316 '_fm_cos' is not a member of 'std'


  9. 1. Скачал ffmpeg.

    2. Поправил в ffopencv.cpp подключаемые либы на те, которые есть в скачанной ffmpeg.

    ...

    Сделал все как по инструкции) Заработало!

    Но обнаружился один МЕГА баг, в общем утечка памяти.

    cvNamedWindow("1", 1);
    
    
    CvCapture *capture = cvCaptureFromFile_FFMPEG("http://192.168.1.2/axis-cgi/mjpg/video.cgi?resolution=320x240&.mjpg");
    
    
    while (true)
    
    {
    
    	if (cvWaitKey(10) == 27)
    
    		break;
    
    
    	IplImage *img = cvQueryFrame(capture);
    
    
    	if (img == NULL)
    
    		break;
    
    
    	cvShowImage("1", img);
    
    	// cvReleaseImage(&img); // если очищать то при следующем cvQueryFrame будет эксепшен, если не чищать то утечка будет расти((
    
    }

    Что делать, как исправлять?


  10. а вот негативных должно быть все равно много.

    В общем что бы не детектировал фон я решил по пробывать отсекать его (заливать белым) оставляя только объект. получается негативные мне почти совсем не нужны?

    хм... что получится из этого позже отпишу.


  11. А имеет значение размер изображения?

    К примеру если я обучаю каскад на картинках 320x240, а использовать буду на 160х120.

    И имеет ли значение поворот объекта?

    К примеру я обучу распознавать профиль человека который смотрит налево, будет ли он так же хорошо работать с профилем повернутым направо?


  12. Всем привет! Пытался обучать классификатор Хаара, использовал haarkit.

    Но вышло как то не очень... Почему то детектируется фон, Куча разноцветных кружочков)

    - npos <number_of_positive_samples>,

    - nneg <number_of_negative_samples>

    количество положителных/отрицательных образцов используемых при обучении каждого уровня классификатора. Разумные значения: npos = 7000 и nneg = 3000.

    Это значит что должно быть столько картинок (7000, 3000)? и причем у положительных должны быть выделены объекты типа:

    rawdata/0018.bmp 1 90 22 55 68

    rawdata/0019.bmp 1 81 19 59 76

    rawdata/0020.bmp 1 83 19 53 73

    ?

    http://www.iem.pw.edu.pl/~domanskj/haarkit.rar


  13. Нашел отличную реализацию, трекинга объектов :) спешу с вами поделиться. Смотрите вложение.

    Есть основные 4 функции cvLabel, cvFilterByArea, cvUpdateTracks, cvRenderTracks;

    В cvLabel передается сегментированное изображение, функция назначает белым пятнам(blob), каждому свой номер. (как сегментировать решаем сами, в примере осуществляется поиск красного квадрата)

    cvFilterByArea удаляет blob-ы которые не подходят по площади.

    cvUpdateTracks собственно сам трекинг.

    cvRenderTracks отображение blob-ов.

    Проект расположен тут: http://code.google.com/p/cvblob/

    BlobTrack.rar

×