Showing posts with label opencv. Show all posts
Showing posts with label opencv. Show all posts

То, что вы хотели знать про оптический поток, но стеснялись спросить

Взято с http://habrahabr.ru/post/201406/.
Объяснение оптического потока из OpenCV для тех, кто не в теме и не очень хочет разобраться.



Оптический поток (Optical flow) – технология, использующаяся в различных областях computer vision для определения сдвигов, сегментации, выделения объектов, компрессии видео. Однако если мы захотим его по-быстрому реализовать в своем проекте, прочитав про него на википедии или где-нибудь еще, то, скорее всего, очень быстро наткнемся на то, что он работает очень плохо и сбоит при определении сдвигов уже порядка 1-2 пикселей (по крайней мере так было у меня). Тогда обратимся к готовым реализациям, например, в OpenCV. Там он реализован различными методами и совершенно непонятно, чем аббревиатура PyrLK лучше или хуже обозначения Farneback или чего-нибудь в этом роде, да и придется поразбираться со смыслом параметров, которых в некоторых реализациях очень много. Причем, что интересно, эти алгоритмы как-то работают, в отличие от того, что мы написали сами. В чем же секрет?

OpenCV tutorials (Russian)


1. Делаем детектор движения, или OpenCV — это просто
http://habrahabr.ru/company/avi/blog/200804/
2. OpenCV шаг за шагом
http://robocraft.ru/blog/computervision/265.html
3. Пару слов о распознавании образов
http://habrahabr.ru/post/208090/

Building opencv program in C

gcc -ggdb `pkg-config --cflags opencv` -o `basename test.c .c` test.c `pkg-config --libs opencv`
Description:`pkg-config --cflags opencv` — подставляет путь для инклудов через pkgconfig.
`pkg-config --libs opencv` — подставляет название либ для линковки через pkgconfig.
При установке opencv поместила файлик .pc (в моём случае это /usr/lib/pkgconfig/opencv.pc), в котором рассказывается, где находятся заголовочные файлы этой библиотеки, а где сами либы для линковки. Таким образом первое у меня разворачивается в "-I/usr/include/opencv", а второе — в "-lopencv_calib3d -lopencv_contrib -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_gpu -lopencv_highgui -lopencv_imgproc -lopencv_legacy -lopencv_ml -lopencv_nonfree -lopencv_objdetect -lopencv_ocl -lopencv_photo -lopencv_stitching -lopencv_superres -lopencv_ts -lopencv_video -lopencv_videostab", т.е. уже в прямые указания компилятору и линкеру, где искать инклуд-файлы (-Include) и библиотеки (-library), позволяющие разработчику не вбивать всё это руками.
-o `basename test.c .c` — отрезает от test.c часть с расширением (".c"), оставляя только часть имени файла «test», которое будет являться именем выходного (output) собранного исполняемого файла. Т.е. разворачивается это в "-o test".
-ggdb — смотрим в ман (а стоило бы сделать это ещё в начале ;))
-ggdb
Produce debugging information for use by GDB. This means to use the most expressive format available (DWARF 2, stabs, or the native format if neither of those are supported), including GDB extensions if at all possible.

т.е. генерация максимально полной отладочной информации для использовании в отладчике gdb (и включение её в выходной бинарник, например замечены секции .debug_aranges, .debug_info, .debug_abbrev, .debug_line, .debug_str).

Blog about computer vision and opencv
http://www.uralvision.blogspot.ru/

OpenCV. Copy image from unsigned char buffer, resize and save to file

How to copy image from unsigned char buffer, resize and save to file.
If you use single-channel image.

#include <opencv/cv.h>
#include <opencv/highgui.h>

                int coeff = 4;
                cv::Mat src( height, width, CV_8UC1, (void *) source_byte_beffer ) );
                cv::Mat small(height/ coeff, width/ coeff, CV_8UC1 );

                cv::Size s_half(width/ coeff, height/ coeff);
                cv::resize( src, small, s_half, 1, 1, cv::INTER_LINEAR ); // resize from src to small

                IplImage* writeImage;
                writeImage=cvCloneImage(&(IplImage)src);
                cvSaveImage("src1.bmp", writeImage);
                cvReleaseImage( &writeImage );

                writeImage=cvCloneImage(&(IplImage)small);
                cvSaveImage("little.bmp", writeImage);
                cvReleaseImage( &writeImage );


                //Another way of writtting:               
                /*cvWrite("src.bmp", src );
                cv::imwrite( "small.bmp", small );*/