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

Доска почета


Popular Content

Showing most liked content on 09.03.2011 во всех областях

  1. 2 points
    Смотрел пример stereo_calib.cpp, там показаны оба метода cvStereoRectify и cvStereoRectifyUncalibrated, мне показалось что cvStereoRectifyUncalibrated, работает лучше... по крайней мере карта высот выглядит правдоподобнее. У меня есть модуль (см. вложение) который вроде как строит Q, по некоторым параметрам: Правда не известно откуда брать точные значения этих параметров... Да, вы можете посмотреть исходник с которым я работаю, ссылка в первом посте. Я попробовал использовать ее вот что получилось: 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
  2. 1 point
    Здравствуйте, Virt. Не могу сказать, что я спец в отладке, но полезными мне кажутся такие инструменты: conditional breakpoint (вы задаете условие в брейкпоинте, и когда, например переменная достигает некоторой величины, - программа останавливается на этом брейкпоинте), variable watch (не всегда оно, правда, хорошо работает, особенно, когда переменная локальная и выполнение выходит за пределы функции). Часто использую вывод отладочной информации в заголовок окна или вывод текста в консоль на каждом шаге. Вы можете попытаться логить каждую секунду (или меньший интервал) в файлик, и на каждом этапе просматривать значения, при этом постоянно искать максимальные и минимальные значения за какой-то определенный период времени. Мне кажется интерактивные приложения, особенно, когда данные постоянно изменяются, очень сложно отлаживать. Возможно неплохо записать, например десяток "хороших" взмахов руки вверх и вниз, и несколько плохих взмахов (или неправильных перемещений, например, горизонтальных) в avi файл (или несколько avi на каждое движение), а затем провести, "унифицированный тест", и проследить за тем, чтобы реакция на этот тест вас устраивала (функция определяла движения, как движения, а на "шумы" не реагировала). min_trigging_amount я просто подбирал, когда взмахивал рукой, и искал значения (оно выводилось в консоль). Я заметил что реакция на взмах вниз на моей камере хуже идет чем взмах вверх. Поэтому, может быть, целесообразно разделить min_trigging_amount_down и min_trigging_amount_up. min_trigging_amount_down я бы поставил равным полтора min_trigging_amount_up. Тут может быть несколько вариантов. Например, что-то на подобии цифрового фильтра, при котором происходит сложная зависимость изменения переменных во времени, а также слежение, например за скоростью изменения величин и продолжительностью их изменения. Вы можете накапливать несколько параметров, например: количество движений общих движений и распознаных перемещений вверх и вниз, а также их "результирующее перемещение" за последние 0.5 (меньше минимальной длительности жеста), 1 (среднее время жеста) и 4 (больше среднего) секунд. После этого можно сказать следующее: если малый участок проверки "заполнен" а средний не заполнен - тогда это шум если малый заполнен, и средний заполнен, а больший не заполнен - тогда это (возможно) правильное перемещение (можно еще проверить, соблюдалась ли однонаправленность все три интервала времени) "заполнен" - это значит, что за все время сканирования перемещения система приняла решение что sum > trigging_value. также вы можете определять скорость перемещения характерных точек за некоторое время (в процентах видимого пространства, то есть например если точка уехала на 30%, - это хороший показатель для определения жеста, а 70% - это человек просто поднялся и ушел (например) ) если вы, например, сможете записывать траекторию перемещения признаков по трем точкам (или больше), и отслеживать, чтобы эта ломаная (состоящая из трех точек) имела угол раскрытия (например) < 140-150 градусов - значит движение было "относительно" однонаправленно. Скорее всего, придется подбирать несколько ключевых коэффициентов вручную. Если вы хотите, например, автоматизировать процесс, т.е. обучить систему на взмахи каждого человека индивидуально, то можно было-бы обучить нейронную сеть (даже один слой, нелин. активационная функция). На её входы подавать: <sum, total, up, down, sum1, total1, up1, down1, чувствиельность>, (sum - сумма за последние 0.5 секунд, sum1 - за всю последнюю 1.0 секунду, например), а на выходе единственное значение (float) - коэффициент соответстивя и его знак, например (у нейросети обычно выходы от 0 до 1 (однополярный) или -0.5 ..0.5 (биполярный сигмоид): 0..0.3 - нет движения + шумы, 0.4-0.99 - пользователь оценил движение как "хоршее" и насколько "хорошее". Нейронная сеть, в данном случае лишь метод автоматического подбора коэффициентов. Писать код нейронной сети (и её обучения) часто не приходится, есть библиотеки FANN, Flood (http://www.cimne.com/flood/). Если вас интересует, я бы мог расписать более подробно, как я вижу эту задачу с подхода нейросетей.
  3. 1 point
    При подаче в функцию cvInitUndistortRectifyMap (вы же ректифицируете изображение?), четвертый параметр - матрица NewCameraMatrix для правой камеры, т.е. "M2". Она содержит все недостающие величины. Я так понимаю, в вашем примере, эта матрица тоже рассчитывается подобно тому как в книге (в коде на примере) стр 450 внизу (после "OR ELSE HARTLEY'S METHOD, ... , compute the rectification transformation directly ... "). Вот как выглядит матрица Q у меня. (моя предыдущая теоретическая имела C1 и C2 равные 0). У меня f = 5.84*10^2, C1 = 3.11*10^2, C2 = 2.41*10^2, Tx = 0.118 Вот написал функцию, которая принимает матрицу 4 параметра cvInitUndistortRectifyMap и расстояние между камерами в метрах, и возвращает double_1channel матрицу Q (возвращаемая ею матрица у меня полностью совпала с откалиброванной Q из StereoCalibrate() по выводу в xml). // vM2_right - та же что и 4 параметр cvInitUndistortRectifyMap для правой камеры // т.е. new_camera_matrix правой камеры CvMat * CreateArtificialMatQ(CvMat *vM2_right, double Tx) { // находим нужные величины из матрицы правой камеры vM2 double f = CV_MAT_ELEM(*vM2_right,double,0,0); double C1 = CV_MAT_ELEM(*vM2_right,double,0,2); double C2 = CV_MAT_ELEM(*vM2_right,double,1,2); // заполняем правильно элементы матрицы CvMat *MatQ_artificial = cvCreateMat(4,4,CV_64FC1); cvZero(MatQ_artificial); CV_MAT_ELEM(*MatQ_artificial,double,0,0) = 1; CV_MAT_ELEM(*MatQ_artificial,double,1,1) = 1; CV_MAT_ELEM(*MatQ_artificial,double,0,3) = -C1; CV_MAT_ELEM(*MatQ_artificial,double,1,3) = -C2; CV_MAT_ELEM(*MatQ_artificial,double,2,3) = f; CV_MAT_ELEM(*MatQ_artificial,double,3,2) = -1.0/Tx; return MatQ_artificial; } Но я не могу пока-что проверить будет ли она правильно работать на cvStereoRectifyUncalibrated.
×