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

ProgRoman

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

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

  • Посещение

  • Days Won

    7

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


  1. всем привет, разбираюсь с библиотекой http://conv-net.sourceforge.net/doc/index.html там реализована свёрточная сеть на С++ с использованием opencv.. может кто работал с этой библиотекой. У меня даже xml не может загрузиться вроде бы делаю всё правильно, пробовал загружать mnist.xml и sample.xml результат один

    XML Error: no bias found

    Error parsing the XML: p at line 29

    вылет происходит тут

    static void XMLCALL icvXML_EndElementHandler(void *userData, const XML_Char *name)

    .....

    CHK_POSSIBLE_FAIL( (!(data.isbias & FOUND_VALUE)) && (data.cur_type=="convolution" || data.cur_type=="subsampling"), "no bias found");

    .....

    ну а потом сообщение о вылете получаем тут

    int parse(std::string xml, std::string &creator,

    std::string &name,

    std::string &info,

    std::vector<CvGenericPlane *> &plane,

    std::map<std::string,int> &idmap)

    ........

    if ( XML_Parse(parser, xml.c_str(), xml.size(), 1) == XML_STATUS_ERROR )

    {

    cerr << "Error parsing the XML: " << XML_ErrorString( XML_GetErrorCode(parser) ) << " at line " << XML_GetCurrentLineNumber(parser) << endl;

    errcode = 0;

    }

    ......


  2. Отлично! всё получилось, для этого мне пришлось пересобрать либу(libccv) и изменить makefile, собрал её без оптимизации и добавил ещё отладочную информацию и всё стало работать наверно что-то с оптимизацией связано было..

    
    CFLAGS := -g -O0 -ffast-math -Wall $(CFLAGS)# -fprofile-arcs -ftest-coverage
    
    NVFLAGS := -g -O0 $(NVFLAGS)
    
    

    это были изменения теперь при отладке можно заходить в ccv_read ну и другие функции)

    при выполнении команды

    ./siftmatch ../samples/book.png ../samples/scene.png

    выдал список точек

    ....

    190.190292 153.517532 => 280.543396 132.711090

    220.898056 206.221832 => 317.080750 141.205688

    191.220901 54.023006 => 236.006592 90.889870

    191.220901 54.023006 => 236.006592 90.889870

    218.149765 126.782501 => 279.896118 108.751839

    126.360435 68.830391 => 217.303818 126.628815

    105.916687 222.729126 => 256.858429 107.466881

    105.916687 222.729126 => 256.858429 107.466881

    338x289 on 512x384

    98 keypoints out of 1178 are matched

    elpased time : 3432

    при выполнении

    ./cnnclassify ../samples/dex.png ../samples/image-net.sqlite3

    появился набор чисел

    363 0.258338 374 0.096494 365 0.057573 376 0.057549 384 0.039335

    elapsed time 8236ms

    так, что всё работает спасибо всем за помощь!

    Буду разбираться, что за цифры и что с ними можно сделать..


  3. у меня ccv_read() кода нету почему то.. есть дефайн в ccv.h, а какого-нибудь ccv.c нету где есть эта функция

    
    ccv.h
    
    .....
    
    int ccv_read_impl(const void* in, ccv_dense_matrix_t** x, int type, int rows, int cols, int scanline);
    
    #define ccv_read_n(in, x, type, rows, cols, scanline, ...) \
    
    	ccv_read_impl(in, x, type, rows, cols, scanline)
    
    #define ccv_read(in, x, type, ...) \
    
    	ccv_read_n(in, x, type, ##__VA_ARGS__, 0, 0, 0)
    
    // this is a way to implement function-signature based dispatch, you can call either
    
    // ccv_read(in, x, type) or ccv_read(in, x, type, rows, cols, scanline)
    
    // notice that you can implement this with va_* functions, but that is not type-safe
    
    

    ccv_read_impl, которая вызывается в свою очередь из ccv_read_n, а она из ccv_read так же нигде нету кода.. как это возможно.. ставлю точку останова она просто перескакивает через неё.. не заходит внутрь...


  4. скомпилировать под netbeans всё таки получилось надо в настройках изменить gcc на clang и добавить дополнительные параметры, которые есть в make файле, всё собралось без ошибок, тут такая проблема при чтении изображения

    
    ccv_read(argv[1], &image, CCV_IO_GRAY | CCV_IO_ANY_FILE);
    
    

    изображение не считывается, image равен 0 всегда, не понятно почему так.. пробовал и абсолютный и относительный путь всё равно image равен 0..


  5. А как можно результат посмотреть?.. у меня при вводе той же команды только с sudo вроде бы стало выполняться..

    roman@roman-VirtualBox:~/ccv/bin$ sudo ./siftmatch ../samples/book.jpg ../samples/scene.jpg

    roman@roman-VirtualBox:~/ccv/bin$

    в папке sample ничего не появляется.. странно..

    если ./cnnclassify вызывать таким образом то.. будет следующее

    roman@roman-VirtualBox:~/ccv/bin$ sudo ./cnnclassify ../samples/book.jpg ../samples/image-net.sqlite3

    cnnclassify: cnnclassify.c:63: int main(int, char **): Assertion `image != 0' failed.

    roman@roman-VirtualBox:~/ccv/bin$

    и ещё вопрос такой каким образом можно отлаживаться, а то работать в камандной строке не всегда удобно) в netbeans как я понял надо саму среде как-то настраивать..


  6. да вроде бы стоит у меня libpng

    вот полный список, что говорит при конфигурации

    roman@roman-VirtualBox:~/ccv/lib$ ./configure

    checking for clang... clang

    checking for nvcc... nvcc

    checking whether the C compiler works... yes

    checking for C compiler default output file name... a.out

    checking for suffix of executables...

    checking whether we are cross compiling... no

    checking for suffix of object files... o

    checking whether we are using the GNU C compiler... yes

    checking whether clang accepts -g... yes

    checking for clang option to accept ISO C89... none needed

    checking how to run the C preprocessor... clang -E

    checking for grep that handles long lines and -e... /bin/grep

    checking for egrep... /bin/grep -E

    checking for ANSI C header files... yes

    checking for sys/types.h... yes

    checking for sys/stat.h... yes

    checking for stdlib.h... yes

    checking for string.h... yes

    checking for memory.h... yes

    checking for strings.h... yes

    checking for inttypes.h... yes

    checking for stdint.h... yes

    checking for unistd.h... yes

    checking xmmintrin.h usability... yes

    checking xmmintrin.h presence... yes

    checking for xmmintrin.h... yes

    checking png.h usability... yes

    checking png.h presence... yes

    checking for png.h... yes

    checking jpeglib.h usability... yes

    checking jpeglib.h presence... yes

    checking for jpeglib.h... yes

    checking fftw3.h usability... yes

    checking fftw3.h presence... yes

    checking for fftw3.h... yes

    checking linear.h usability... no

    checking linear.h presence... no

    checking for linear.h... no

    checking cblas.h usability... yes

    checking cblas.h presence... yes

    checking for cblas.h... yes

    checking tesseract/capi.h usability... no

    checking tesseract/capi.h presence... no

    checking for tesseract/capi.h... no

    checking Accelerate/Accelerate.h usability... no

    checking Accelerate/Accelerate.h presence... no

    checking for Accelerate/Accelerate.h... no

    checking libavcodec/avcodec.h usability... yes

    checking libavcodec/avcodec.h presence... yes

    checking for libavcodec/avcodec.h... yes

    checking libavformat/avformat.h usability... yes

    checking libavformat/avformat.h presence... yes

    checking for libavformat/avformat.h... yes

    checking libswscale/swscale.h usability... yes

    checking libswscale/swscale.h presence... yes

    checking for libswscale/swscale.h... yes

    checking dispatch/dispatch.h usability... no

    checking dispatch/dispatch.h presence... no

    checking for dispatch/dispatch.h... no

    checking for dispatch_apply in -ldispatch... no

    checking for cos in -lm... yes

    checking for cblas_dgemm in -lgslcblas... yes

    checking for gsl_blas_dgemm in -lgsl... yes

    checking cuda... no

    USE: clang

    COMPILE FLAGS: -msse2 -D HAVE_SSE2 -D HAVE_LIBPNG -D HAVE_LIBJPEG -D HAVE_FFTW3 -D HAVE_CBLAS -D HAVE_AVCODEC -D HAVE_AVFORMAT -D HAVE_SWSCALE -D HAVE_GSL

    LINK FLAGS: -lm -lpng -ljpeg -lfftw3 -lfftw3f -lpthread -lblas -lavcodec -lavformat -lswscale -lgsl

    configure: creating ./config.status

    config.status: creating config.mk


  7. попробовал в командной строке. make собрал все файлы из ./bin без ошибок, появились объектные файлы и исполняемые ну а далее я как в примере в doc вызвал исполняемый файл

    
    ./siftmatch ../samples/book.png ../samples/scene.png
    
    
    выдало следующий ответ
    Ошибка сегментирования (сделан дамп памяти)
    попробовал cnnclassify
    
    ./cnnclassify ../samples/dex.png ../samples/image-net.sqlite3 output.png
    
    

    ответ такой

    cnnclassify: cnnclassify.c:63: int main(int, char **): Assertion `image != 0' failed.

    Аварийный останов (сделан дамп памяти)

    сами исполняемые файлы собраны без ошибок..


  8. Пробовал ещё и под Debian собирать.. всё собралось, получил libccv.a, а примеры выполнить так и не получилось, почему-то ошибки одни и теже.. как-то очень странно.. не понятно почему eglibc не подключилась.. (пакет eglibc-source устанавливал)... может быть в настройках netbeans надо что-то прописывать..


  9. Как-то странно проверил файл ccv_convnet.c как-то не нашёл там действительно функции powf.. хотя в самом коде она используется.. что-то непонятно..

    На самом деле пробовал и другие примеры, что-то пока без результатно...

    к прмеру при выполнении siftmatch.c появляется следуещее

    ccv_sift.c:(.text+0x205): undefined reference to `exp2'

    ccv_sift.c:(.text+0x22c): undefined reference to `__sqrt_finite'

    ccv_sift.c:(.text+0x28f): undefined reference to `__sqrt_finite'

    ccv_sift.c:(.text+0x2f1): undefined reference to `pow'

    ccv_sift.c:(.text+0x3c8): undefined reference to `__sqrt_finite'

    ccv_sift.c:(.text+0x441): undefined reference to `pow'

    ccv_sift.c:(.text+0x61d): undefined reference to `pow'

    ccv_sift.c:(.text+0x129f): undefined reference to `exp2'

    ccv_sift.c:(.text+0x13c0): undefined reference to `__exp_finite'

    ccv_sift.c:(.text+0x1d21): undefined reference to `__sqrt_finite'

    ccv_sift.c:(.text+0x1dd6): undefined reference to `sincos'

    ../lib/libccv.a(ccv_basic.o): In function `ccv_sobel':

    ccv_basic.c:(.text+0xb28): undefined reference to `__exp_finite'

    ../lib/libccv.a(ccv_basic.o): In function `ccv_blur':

    ccv_basic.c:(.text+0x3badc): undefined reference to `__exp_finite'

    collect2: выполнение ld завершилось с кодом возврата 1


  10. У меня почему-то не всё компилируется (пробую код из примера ./bin/cnnclassify.c)

    к примеру код компилируется вроде бы всё нормально...

    
        assert(argc >= 3);
    
        ccv_enable_default_cache();
    
        ccv_dense_matrix_t* image = 0;
    
        ccv_read(argv[1], &image, CCV_IO_ANY_FILE | CCV_IO_RGB_COLOR);
    
        if (image != 0)
    
        {
    
            //ccv_convnet_t* convnet = ccv_convnet_read(0, argv[2]);
    
            ccv_dense_matrix_t* input = 0;
    
            //ccv_convnet_input_formation(convnet, image, &input);
    
            ccv_matrix_free(image);
    
            uint elapsed_time = get_current_time();
    
    
            ccv_array_t* rank = 0;
    
        } 
    
        ccv_drain_cache();
    
    
    но если же раскомментировать строчку
    
    ccv_convnet_t* convnet = ccv_convnet_read(0, argv[2]);
    
    

    то идёт ошибка..

    gcc -o dist/Debug/GNU-Linux-x86/test_proj build/Debug/GNU-Linux-x86/main.o -L../../ccv/lib -lccv

    ../../ccv/lib/libccv.a(ccv_convnet.o): In function `_ccv_convnet_layer_forward_propagate':

    ccv_convnet.c:(.text+0x1db1): undefined reference to `powf'

    ccv_convnet.c:(.text+0x2165): undefined reference to `powf'

    ../../ccv/lib/libccv.a(ccv_convnet.o): In function `ccv_convnet_classify':

    ccv_convnet.c:(.text+0x2dff): undefined reference to `__expf_finite'

    ccv_convnet.c:(.text+0x2e5d): undefined reference to `__expf_finite'

    ../../ccv/lib/libccv.a(ccv_basic.o): In function `ccv_sobel':

    ccv_basic.c:(.text+0xb28): undefined reference to `__exp_finite'

    ../../ccv/lib/libccv.a(ccv_basic.o): In function `ccv_blur':

    ccv_basic.c:(.text+0x3badc): undefined reference to `__exp_finite'

    collect2: выполнение ld завершилось с кодом возврата 1

    make[2]: *** [dist/Debug/GNU-Linux-x86/test_proj] Ошибка 1

    make[2]: Выход из каталога `/home/roman/samples/test_proj'

    make[1]: *** [.build-conf] Ошибка 2

    make[1]: Выход из каталога `/home/roman/samples/test_proj'

    make: *** [.build-impl] Ошибка 2

    что-то не понятно, вроде бы ccv_convnet_t есть в библиотеке ccv не знаю что и думать...

    в компоновщике в дополнительные каталоги библиотек добавил libccv.a


  11. что-то у меня какой-то косяк с установкой, так после когфигурации получаю такое сообщение

    roman@roman-VirtualBox:~/ccv/lib$ ./configure

    checking for clang... no

    checking for nvcc... nvcc

    checking for gcc... gcc

    checking whether the C compiler works... yes

    checking for C compiler default output file name... a.out

    checking for suffix of executables...

    checking whether we are cross compiling... no

    checking for suffix of object files... o

    checking whether we are using the GNU C compiler... yes

    checking whether gcc accepts -g... yes

    checking for gcc option to accept ISO C89... none needed

    checking how to run the C preprocessor... gcc -E

    checking for grep that handles long lines and -e... /bin/grep

    checking for egrep... /bin/grep -E

    checking for ANSI C header files... yes

    checking for sys/types.h... yes

    checking for sys/stat.h... yes

    checking for stdlib.h... yes

    checking for string.h... yes

    checking for memory.h... yes

    checking for strings.h... yes

    checking for inttypes.h... yes

    checking for stdint.h... yes

    checking for unistd.h... yes

    checking xmmintrin.h usability... yes

    checking xmmintrin.h presence... yes

    checking for xmmintrin.h... yes

    checking png.h usability... no

    checking png.h presence... no

    checking for png.h... no

    checking jpeglib.h usability... no

    checking jpeglib.h presence... no

    checking for jpeglib.h... no

    checking fftw3.h usability... no

    checking fftw3.h presence... no

    checking for fftw3.h... no

    checking linear.h usability... no

    checking linear.h presence... no

    checking for linear.h... no

    checking cblas.h usability... yes

    checking cblas.h presence... yes

    checking for cblas.h... yes

    checking tesseract/capi.h usability... no

    checking tesseract/capi.h presence... no

    checking for tesseract/capi.h... no

    checking Accelerate/Accelerate.h usability... no

    checking Accelerate/Accelerate.h presence... no

    checking for Accelerate/Accelerate.h... no

    checking libavcodec/avcodec.h usability... yes

    checking libavcodec/avcodec.h presence... yes

    checking for libavcodec/avcodec.h... yes

    checking libavformat/avformat.h usability... yes

    checking libavformat/avformat.h presence... yes

    checking for libavformat/avformat.h... yes

    checking libswscale/swscale.h usability... yes

    checking libswscale/swscale.h presence... yes

    checking for libswscale/swscale.h... yes

    checking for cos in -lm... yes

    checking for cblas_dgemm in -lgslcblas... no

    checking for gsl_blas_dgemm in -lgsl... no

    checking cuda... no

    USE: gcc

    COMPILE FLAGS: -msse2 -D HAVE_SSE2 -D HAVE_CBLAS -D HAVE_AVCODEC -D HAVE_AVFORMAT -D HAVE_SWSCALE

    LINK FLAGS: -lm -lblas -lavcodec -lavformat -lswscale

    configure: creating ./config.status

    config.status: creating config.mk

    далее делаю make и получаю следующее

    roman@roman-VirtualBox:~/ccv/lib$ make

    gcc ccv_resample.c -o ccv_resample.o -c -O3 -ffast-math -Wall -msse2 -D HAVE_SSE2 -D HAVE_CBLAS -D HAVE_AVCODEC -D HAVE_AVFORMAT -D HAVE_SWSCALE

    gcc: внутренняя ошибка компилятора: Убито (program cc1)

    Отправьте подробное сообщение об ошибке

    с препроцессированным исходным кодом.

    Смотрите инструкции в <file:///usr/share/doc/gcc-4.6/README.Bugs>.

    make: *** [ccv_resample.o] Ошибка 4


  12. после команды ./configure

    получаю следующее

    
    .....
    
    checking for libavcodec/avcodec.h... no
    
    checking libavformat/avformat.h usability... no
    
    checking libavformat/avformat.h presence... no
    
    checking for libavformat/avformat.h... no
    
    checking libswscale/swscale.h usability... no
    
    checking libswscale/swscale.h presence... no
    
    checking for libswscale/swscale.h... no
    
    checking for cos in -lm... yes
    
    checking for cblas_dgemm in -lgslcblas... no
    
    checking for gsl_blas_dgemm in -lgsl... no
    
    checking cuda... no
    
    

    правильно я понимаю везде где no надо установить эти библиотеки, где их брать откуда устанавливать поясните пожалуйста) в линуксе я новичок)


  13. Добрый день, вот пытаюсь разобраться прочитал, что в библиотеке CCV есть более современные(по сравнению с OpenCV) методы классификации с помощью глубокого обучения свёрточных нейронных сетей вот нашёл пример у них в папке /bin называется cnnclassify.c, но ни как не могу запустить его, возможно кто-то пробовал работать с этой библиотекой, как её надо настроить?.. под windows она вроде бы не работает.. работает только под линукс.. поэтому я пробовал запускать её на ubuntu в netbeans 8.0, но запустить так и не удалось, ошибки сразу при построении причём ругается на функции библиотеки ccv...


  14. Добрый день, в samples opencv есть примеры работы детектора latent svm можно даже найти файлы xml для обучения модели детектора они обучены как я понимаю на базе данных INRIA-2007 и есть для каждого из 20-ти классов изображений вопрос в том как их сгенерировать самому для своей задачи?


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

    1. Сперва запускаем детектор, получаем блобы и их тречим, периодически запуская детектор снова для проверки

    2. у нас уже есть блобы полученные каким-то другим способом(к примеру вычитанием фона), но без запуска детектора вот и нам во первых надо убедиться что блобы являются интересующимися объектами для нас ну т.е. что это объекты трекинга вот, и второе надо разъединить несколько людей в одном блобе на разные блобы. Для этого мы так же должны запустить детектор, который уже в блобах и должен выделить человека или сказать что его там нету, возможно что в блобе несколько людей. Пока пробовал стандартные средства в opencv это CascadeClassifier на различных наборах и HOGDescriptor, отработали они достаточно плохо часто вообще просто не видели людей вот. Сейчас я пробую обучить каскады и хога под свою задачу думаю будет получше.

    Наверное есть более эффективные детекторы возможно кто сталкивался или работал с этим?..


  16. странно сейчас пересматривал повторно запускал трекер с фильтром частиц и такое ощущение, что когда трек рвётся ну начинается время жизни нового объекта, то он показывает эти полосы ну как бы траекторию первую и последнюю точку трека...


  17. Спасибо за ответ ниже даю ссылки на ролики работы трекера с разными фильтрами, фильтром частиц и фильтром Калмана

    по роликам можно сказать, что всё же у фильтра Калмана меньше ложняка получается возможно настроил я как-то не так фильтр частиц, но приблизительно такой вариант получался всегда, ниже прикрепил класс фильтр частиц написанный по аналогии с Калманом. Пробовал различные распределения вероятностей для частиц.. особо сильного улучшения не было

    
    //condens->flConfidence[i] = exp(1.0 / (sqrt(diffX * diffX + diffY * diffY)));
    
    //condens->flConfidence[i] = exp(-(sqrt(diffX * diffX + diffY * diffY)));
    
    //condens->flConfidence[i] = exp(-((diffX*diffX)/(2*diffX * diffX + 2*diffY * diffY)))*exp(-((diffY*diffY)/(2*diffX * diffX + 2*diffY * diffY)));
    
    //condens->flConfidence[i] = exp(-((diffX*diffX)/(2*xRange *yRange)))*exp(-((diffY*diffY)/(2*xRange *yRange)));
    
    condens->flConfidence[i] = 1.0 / (sqrt(diffX * diffX + diffY * diffY));
    
    

    ParticleFilter.h

    ParticleFilter.cpp

    • Like 2

  18. большое спасибо за разъяснения по работе фильтра:) вот ещё вопрос

    я составляю класс ParticleFilter по аналогии с классом Kalman из вашей программы. Приведу заголовочный файл

    
    class TKalmanFilter
    
    {
    
    public:
    
    	KalmanFilter* kalman;
    
    	double deltatime; //приращение времени
    
    	Point2f LastResult;
    
    	TKalmanFilter(Point2f p,float dt=0.2,float Accel_noise_mag=0.5);
    
    	~TKalmanFilter();
    
    	Point2f GetPrediction();
    
    	Point2f Update(Point2f p, bool DataCorrect);
    
    };
    
    
    для класса ParticleFilter всё довольно похоже(там конечно свои параметры) метод GetPrediction() получается довольно просто cv::Point statePt(condens->State[0], condens->State[1]); и у нас есть точка. а вот метод Point2f Update(Point2f p, bool DataCorrect); пока ставит меня в тупик если смотреть на калмана, то там вызывается специальный метод внутреннего класса Калмана для коррекции
    
    // Коррекция
    
    		Mat estimated = kalman->correct(measurement);
    
    		LastResult.x=estimated.at<float>(0);  //уточняем, используя данные измерений
    
    		LastResult.y=estimated.at<float>(1);
    
    

    ничего похожего у CvConDensation я не нашёл... но как-то же надо обновлять координаты...


  19. я правильно понимаю если xRange и yRange задают диапазон в котором происходит распределение частиц то мне надо задавать не по всему размеру изображения, а только по выделенному прямоугольнику + какой-то шаг ну т.к. человек (объект) может сместиться.. или даже наверно так просто надо просто задавать распределение частиц внутри каждого прямоугольника вроде бы так...

    В случае с несколькими объектами, Вы должны уметь вычислить вероятность принадлежности частицы к конкретному объекту.

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

    если это возможно.. то задача значительно усложняется вроде бы...


  20. спасибо за ссылку разбираюсь ниже прикрепляю код из ссылки

    
    // Example of how to use the OpenCV Particle Filter.
    
    // 
    
    // Stolen largely from morethantechnical.com's nice mouse_kalman project.
    
    //
    
    
    #include <iostream>
    
    #include <vector>
    
    
    #include <opencv2/highgui/highgui.hpp>
    
    #include <opencv2/video/tracking.hpp>
    
    #include <opencv2/legacy/legacy.hpp>
    
    
    using namespace std;
    
    
    #define drawCross( center, color, d )                  \
    
      line( img, cv::Point( center.x - d, center.y - d ),           \
    
        cv::Point( center.x + d, center.y + d ), color, 2, CV_AA, 0);   \
    
      line( img, cv::Point( center.x + d, center.y - d ),           \
    
        cv::Point( center.x - d, center.y + d ), color, 2, CV_AA, 0 )
    
    
    
    struct mouse_info_struct { int x,y; };
    
    struct mouse_info_struct mouse_info = {-1,-1}, last_mouse;
    
    
    vector<cv::Point> mouseV, particleV;
    
    int counter = -1;
    
    
    // Define this to proceed one click at a time.
    
    //#define CLICK 1
    
    #define PLOT_PARTICLES 1
    
    
    void on_mouse(int event, int x, int y, int flags, void* param) 
    
    {
    
    
    #ifdef CLICK
    
      if (event == CV_EVENT_LBUTTONUP) 
    
    #endif
    
      {
    
        last_mouse = mouse_info;
    
        mouse_info.x = x;
    
        mouse_info.y = y;
    
        counter = 0;
    
      }
    
    
    }
    
    
    int main(int argc, char * const argv[]) 
    
    {
    
      cv::Mat img(650, 650, CV_8UC3);
    
      char code = (char)-1;
    
    
      cv::namedWindow("mouse particle");
    
      cv::setMouseCallback("mouse particle", on_mouse, 0);
    
    
      cv::Mat_<float> measurement(2,1); 
    
      measurement.setTo(cv::Scalar(0));
    
    
      int dim = 2;
    
      int nParticles = 25;
    
      float xRange = 650.0;
    
      float yRange = 650.0;
    
    
      float minRange[] = { 0, 0 };
    
      float maxRange[] = { xRange, yRange };
    
      CvMat LB, UB;
    
      cvInitMatHeader(&LB, 2, 1, CV_32FC1, minRange);
    
      cvInitMatHeader(&UB, 2, 1, CV_32FC1, maxRange);
    
    
      CvConDensation* condens = cvCreateConDensation(dim, dim, nParticles);
    
    
      cvConDensInitSampleSet(condens, &LB, &UB);
    
    
      // The OpenCV documentation doesn't tell you to initialize this
    
      // transition matrix, but you have to do it.  For this 2D example, 
    
      // we're just using a 2x2 identity matrix.  I'm sure there's a slicker 
    
      // way to do this, left as an exercise for the reader.
    
      condens->DynamMatr[0] = 1.0;
    
      condens->DynamMatr[1] = 0.0;
    
      condens->DynamMatr[2] = 0.0;
    
      condens->DynamMatr[3] = 1.0;  
    
    
      for(;
    
      {
    
    
        if (mouse_info.x < 0 || mouse_info.y < 0) 
    
    	{
    
          imshow("mouse particle", img);
    
          cv::waitKey(30);
    
          continue;
    
        }
    
    
        mouseV.clear();
    
        particleV.clear();
    
    
        for(;
    
    	{
    
          code = (char)cv::waitKey(100);
    
    
          if( code > 0 ) break;
    
    
    #ifdef CLICK
    
          if (counter++ > 0) {
    
        continue;
    
          } 
    
    #endif
    
    
          measurement(0) = mouse_info.x;
    
          measurement(1) = mouse_info.y;
    
    
          cv::Point measPt(measurement(0),measurement(1));
    
          mouseV.push_back(measPt);
    
    
          // Clear screen
    
          img = cv::Scalar::all(100);
    
    
          for (int i = 0; i < condens->SamplesNum; i++) 
    
    	  {
    
    
    		float diffX = (measurement(0) - condens->flSamples[i][0])/xRange;
    
    		float diffY = (measurement(1) - condens->flSamples[i][1])/yRange;
    
    
    		condens->flConfidence[i] = 1.0 / (sqrt(diffX * diffX + diffY * diffY));
    
    
    	// plot particles
    
    #ifdef PLOT_PARTICLES
    
    	cv::Point partPt(condens->flSamples[i][0], condens->flSamples[i][1]);
    
    	drawCross(partPt , cv::Scalar(255,0,255), 2);
    
    #endif
    
    
          }
    
    
          cvConDensUpdateByTime(condens);
    
    
          cv::Point statePt(condens->State[0], condens->State[1]);
    
          particleV.push_back(statePt);
    
    
          // plot points
    
          drawCross( statePt, cv::Scalar(255,255,255), 5 );
    
          drawCross( measPt, cv::Scalar(0,0,255), 5 );
    
    
          for (int i = 0; i < mouseV.size() - 1; i++) {
    
        line(img, mouseV[i], mouseV[i+1], cv::Scalar(255,255,0), 1);
    
          }
    
          for (int i = 0; i < particleV.size() - 1; i++) {
    
        line(img, particleV[i], particleV[i+1], cv::Scalar(0,255,0), 1);
    
          }
    
    
          imshow( "mouse particle", img );
    
        }
    
    
        if( code == 27 || code == 'q' || code == 'Q' )
    
          break;
    
      }
    
    
      return 0;
    
    }
    
    [/code]

    не могли бы вы пояснить что такое тут

    float xRange = 650.0;

    float yRange = 650.0;

    что это за диапазон такой.. не понятно...

    и ещё я собрался попробовать заменить в программе выложенной выше фильтр Калмана на фильтр частиц, в связи с этим возникли следующие вопросы. Могу ли я вообще это делать ну т.к. на пример в случае с тараканами движущихся областей много не будет ли фильтр частиц запущенный для i-го таракана перескакивать на j-го таракана... или это в принципе невозможно?..

×