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

Smorodov

Главные администраторы
  • Количество публикаций

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

  • Посещение

  • Days Won

    346

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


  1. Если вы не против я буду писать сюда небольшие отчеты о продвижении.

    Думаю всем это будет интересно.

    Для скорости надо поставить IPP, если еще не установлены, с ними заметно быстрее работает. У меня кадров 15-20 дает на Athlon64x2 5000 (вэбка примерно 350х280 пикселей). На Вашей же картинке (вэбкой с экрана) все отлично. Кстати, в каком разрешении работаете? Может после считывания изображения уменьшать его, до разумных размеров?

    IPP существенно (в разы) ускоряющая работу OpenCV хреновина берется с сайта Intel.

    Ставим интелловский компилятор Intel C Plus Plus Compiler v10.1.025

    Google рулит.

    IPP ставится после установки компилятора. И использует его лицензию smile.gif

    Подключается автоматически, нужно только указать в системной переменной Path путь к директории, /bin библиотеки IPP, в самой программе ничего отдельно указывать не нужно.


  2. Спасибо за ответ. Всё попробую, может получится. Вот просматривал примеры, которые устанавливаются в месте с OpeCV, и наткнулся на пример демонстрирующий работу SURF Speeded Up Robust Features алгоритма (название примера find_obj). Этот алгоритм очень хорошо работает, вот только не уверен можно ли его использовать для работы с камерой. Если всё таки можно то рамки могут выглядеть так. Кстати он определяет и перевернутые объекты.

    1.

    i-61.jpg

    2.

    i-62.jpg

    Все примеры могут работать с камерой (некоторые после незначительной переделки), главное там функция обработки изображения, а как Вы его получили дело Ваше. Кстати, по моему на основе этого примера и была сделана программка из этой темы http://www.compvision.ru/forum/index.php?showtopic=11


  3. Приятный текст, ваш? Почему не в вики? ;)

    Спасибо :)

    Это мой перевод куска иностранного текста с небольшими коррективами. Не в вики потому что пока руки не дошли, а в pdf потому что кроссплатформенно и просто создать из word-а :)


  4. Здравствуйте Меня очень заинтересовал , описанный метод Мне кажется это прорыв в алгоритмах сжатия данных

    А можно ли посмотреть на работу алгоритма , какоенить консольное тестовое приложени е ??? Или сравнение на стандартных последовательностях ?

    Спасибо

    Программа, использующая описанный метод здесь: http://www.compvision.ru/forum/index.php?showtopic=74


  5. Делаю первые шаги в CV и стоит вопрос, какую камеру приобрести.

    В предыдущем топике поднималась эта тема, но там с темы соскочили.

    Поэтому опять ее поднимаю. Хотелось бы, приобрести камеру не только

    для обучения, но и в дальнейшем чтобы она была полезна в работе. Я понимаю,

    что покупать железо надо для целевого назначения. Но я пока в поисках той области,

    где буду работать. Поэтому хотелось бы найти ту "золотую серединку", хотя бы по критерию

    цена-качество (до $100). Что можете посоветовать.

    Можно посмотреть что то на подобии Logitech Webcam Pro 9000 (100 $).

    Предел цены конечно, но Цейсовская оптика и разрешение 1600X1200, USB 2.0 думаю что должно хватить для большинства задач.

    Пример захваченного кадра можно посмотреть тут (с наведенной мышью - это для другой камеры): http://ghonis2.ho8.com/Pro9000a.html

    там её для самодельного телескопа применяют.


  6. > float D[] = {1, 2, 1};

    Да если поставить эти коэф-ты, то будет что-то меняться, но у меня они дробные.

    На всякий случай перевел все на float.

    //---------------------------------------------------------------------------

    void ProcessFrame( IplImage* img )

    {

    IplImage* rgb[3];

    CvMat* rgbMat;

    IplImage* dst = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_32F, 3);

    IplImage* src = cvCreateImage(cvSize(img->width, img->height), IPL_DEPTH_32F, 3);

    cvConvert(img,src);

    IplImage* dstRGB[3];

    for (int i = 0; i < 3; i++)

    {

    rgb = cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_32F, 1);

    dstRGB = cvCreateImage(cvSize(src->width, src->height), IPL_DEPTH_32F, 1);

    }

    cvSplit(src, rgb[0], rgb[1], rgb[2], NULL);

    //across

    float D[] = {0.25, 0.5, 0.25};

    rgbMat = cvCreateMat(1, 3, CV_32FC1);

    for (int x = 0; x < 3; x++)

    cvmSet(rgbMat, 0, x, D[x]);

    for ( i = 0; i < 3; i++)

    {

    cvZero(dstRGB);

    cvFilter2D(rgb, dstRGB, rgbMat);

    }

    cvReleaseMat(&rgbMat);

    //down

    rgbMat = cvCreateMat(3, 1, CV_32FC1);

    cvZero(dst);

    cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst);

    for (int y = 0; y < 3; y++)

    cvmSet(rgbMat, y, 0, D[y]);

    for ( i = 0; i < 3; i++)

    {

    // cvZero(dstRGB);

    cvFilter2D(dstRGB, dstRGB, rgbMat, cvPoint(0, 1)); // è çäåñü ïîïðàâèë (÷òîáû ôèëüòðû ïîñëåäîâàòåëüíî ïðèìåíÿëèñü)

    }

    cvReleaseMat(&rgbMat);

    cvZero(dst);

    cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst);

    //cvConvertScale( dst, dst,25000,0);

    APIDrawIpl(10,10,src,Form1->Handle);

    APIDrawIpl(400,10,dst,Form1->Handle);

    cvZero(dst);

    for ( i = 0; i < 3; i++)

    {

    cvReleaseImage(&rgb);

    cvReleaseImage(&dstRGB);

    }

    cvReleaseImage(&src);

    cvReleaseImage(&dst);

    }

    Вообще-то разница (правое немного размыто) есть:

    Filter2D.png


  7. Линк у меня не работает, можно повторить.

    Вот:

    http://blogs.mathworks.com/steve/2006/10/0...le-convolution/

    И сверху поправил.

    Кстати, ядро из примера, это размытие, его действие сложно заметить. Я переделал на оператор Собеля все работает.

    У меня посл. свертка работает (собель из статьи выше):

    //---------------------------------------------------------------------------

    void ProcessFrame( IplImage* src )

    {

    IplImage* rgb[3];

    CvMat* rgbMat;

    IplImage* dst = cvCreateImage(cvSize(src->width, src->height), src->depth, 3);

    IplImage* dstRGB[3];

    for (int i = 0; i < 3; i++)

    {

    rgb = cvCreateImage(cvSize(src->width, src->height), src->depth, 1);

    dstRGB = cvCreateImage(cvSize(src->width, src->height), src->depth, 1);

    }

    cvSplit(src, rgb[0], rgb[1], rgb[2], NULL);

    //across

    float D[] = {1, 2, 1}; // Первая часть ядра

    rgbMat = cvCreateMat(1, 3, CV_32FC1);

    for (int x = 0; x < 3; x++)

    cvmSet(rgbMat, 0, x, D[x]);

    for ( i = 0; i < 3; i++)

    {

    cvZero(dstRGB);

    cvFilter2D(rgb, dstRGB, rgbMat, cvPoint(1, 0));

    }

    cvReleaseMat(&rgbMat);

    cvZero(dst);

    cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst);

    //down

    rgbMat = cvCreateMat(3, 1, CV_32FC1);

    D[0]=-1; // Вторая часть ядра

    D[1]=0;

    D[2]=1;

    for (int y = 0; y < 3; y++)

    cvmSet(rgbMat, y, 0, D[y]);

    for ( i = 0; i < 3; i++)

    {

    // cvZero(dstRGB);

    cvFilter2D(dstRGB, dstRGB, rgbMat, cvPoint(0, 1)); // и здесь поправил (чтобы фильтры последовательно применялись)

    }

    cvReleaseMat(&rgbMat);

    cvZero(dst);

    cvMerge(dstRGB[0], dstRGB[1], dstRGB[2], NULL, dst);

    for ( i = 0; i < 3; i++)

    {

    cvReleaseImage(&rgb);

    cvReleaseImage(&dstRGB);

    }

    APIDrawIpl(10,10,src,Form1->Handle);

    APIDrawIpl(400,10,dst,Form1->Handle);

    cvReleaseImage(&dst);

    }


  8. Спасибо за инфу, помоему это единственный форум, где я нашел единомышленников.

    С градусными коэффициентами с Вашего проекта у меня все работает (в книге это предыдущее задание).

    У меня большие сомнения в моих исходных коэф-тах - [(1/16, 2/16, 1/16), (2/16, 4/16, 2/16), (1/16, 2/16, 1/16)] и

    (1/4, 2/4, 1/4). Я их тупо впихиваю в матрицу. Интуиция мне подсказывает здесь необходима дополнительная

    обработка, ведь не зря они написали "Separable kernels".

    Вот здесь статейка о разделяемых ядрах. Насколько я понял, разделяемым называется двумерное ядро свертки, которое можно представить в виде матричного произведения одномерных ядер.

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

    То есть, я предполагаю (считать лень), что квадратная матрица [(1/16, 2/16, 1/16), (2/16, 4/16, 2/16), (1/16, 2/16, 1/16)], есть матричное произведение двух одномерных матриц строки (1/4, 2/4, 1/4) и столбца (1/4, 2/4, 1/4). И результат после применения 2Д ядра свертки, и после последовательного применения 1Д ядер свертки результат должен быть одинаковый.


  9. Недавно столкнулся с такой задачей, поиск прямоугольной рамки на фотографии. Что важно это определить её углы и узнать какой это именно угол. Рамка может быть так же затемнена и на неё можно смотреть под разными углами, т.е. на некоторых изображениях она может выглядеть как ромб.

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

    Примерный вид рамки:

    i-60.jpg

    Может что то типа программы для калибровки камеры подойдет + раскраска угловых клеток. Pамку взять в виде цветной шахматной доски, там как раз и матрица поворота возвращается.

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

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


  10. Я вот провёл колибрацию. Мне написалось "ok". И что дальше? Скорее всего я просто не вкупаюсь в суть колибрации.. Поясните, пожалуйста.

    Программа показывает как калибровать камеру в других программах машинного зрения, это пример использования функций калибровки, входящих в состав библиотеки OpenCV. Она не имеет другой практической ценности, кроме демонстрационной. После успешной калибровки в окне показа видео начинает показываться исправленное изображение (как Opencv это представляет), иногда, (когда набор изображений неудачный) изображение может наоборот искривиться.

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

    То есть это не некая системная утилита, а просто пример программирования.

    ЗЫ: С программой работают так: устанавливают флажки как надо, запускают калибровку, водят шахматной доской перед камерой (программа должна распознавать доку (рисовать точки в углах)), пока калибровка не закончится, наблюдать что получится :)

    Количество образцов - это количество изображений по которым осуществляется калибровка.

    Интервал между захватом образцов - это с каким интервалом эти изображения захватываются.

    Клеток по горизонтали и Клеток по вертикали - это характеристики доски которую мы показываем программе.

    Значение флагов смотреть в руководстве.


  11. Накопал в GIMP'е такой интересный эффект "постеризации" изображения (Colors->Posterise).

    Сразу прикинул, что это можно неплохо заюзать в удалении шумов :)

    А какой алгоритм может быть у такой штуки?

    Насколько я понимаю, это сведение цветов изображения к меньшему числу цветов..

    Здесь кое что: http://en.wikipedia.org/wiki/Color_quantization

    или можно например так: Voronoi seeded colour image segmentation

    Можно еще много чего найти если в google набрать colour image segmentation.

    Или floodfill в OpenCV только начальную точку надо указать и точность заливки, то есть какой диапазон цветов считать одним цветом.


  12. Кстати, а когда работают с "бинокулярным зрением" (когда используют две и более камеры), обязательно ли нужно, чтобы эти камеры были идентичными моделями или нет? Просто я так представил человека с разными глазами.. но с другой стороны, разное зрение у глаз одного человека - бывает :)

    Лучшее изображение всегда к худшему привести можно, а дальше как обычно :)


  13. Погоди, а в OpenCV даже аудиозахват есть? Фигасе.. пошёл срочно изучать эту тему! :)

    А "mmsystem.h" для чего используется? (подключено, по крайней мере :) ). А воспроизводить и генерировать звуки оно не умеет случаем?

    mmsystem.h - это виндовый заголовок (часть winAPI), отвечающий за мультимедиа. Звуки воспроизводить он умеет тем же способом (через API). Класс нашел в инете, подробно не изучил, еще.


  14. Привет!

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

    Тут все функции рисования: http://opencv.willowgarage.com/documentati..._functions.html

    Дуги у них вроде как функцией

    void cvEllipse(CvArr* img, CvPoint center, CvSize axes, double angle, double start_angle, double end_angle, CvScalar color, int thickness=1, int line_type=8, int shift=0)

    рисуются.


  15. Поделитесь оценками в производительности =) на вашем GPU, CPU?

    Время обработки одного кадра:

    GPU Geforce8200 (встроенный) 0.05-0.06 ms

    CPU Athlon x 2 5000 примерно 10 ms

    Померять можно так:

       //До кода ставим:

    // Создаем и запускаем таймер
    unsigned int timer = 0;
    cutilCheckError(cutCreateTimer(&timer));
    cutilCheckError(cutStartTimer(timer));

    //---------------------
    // Измеряемый код
    //---------------------

    // После кода ставим:

    // Останавливаем и освобождаем таймер
    cutilCheckError(cutStopTimer(timer));
    printf("Processing time: %f (ms) \n", cutGetTimerValue(timer));
    cutilCheckError(cutDeleteTimer(timer));[/code]


  16. Все собралось и подключилось (с либами из этой темы (см. выше), часть на которые он ругался (говорил что нет dll libjasper, libjpeg, libpng и тп.) удалил).

    Поищу завтра как подключить их обратно, а пока вот :)

    Вроде и без них нормально работает :), картинки, во всяком случае грузит нормально.

    Создание проекта ничем не отличается от Builder 6.


  17. Подготовительные операции (предполагается, что VC2008 уже установлен).

    1) Установить комплект CUDA.

    2) Установить cudavswizard2.0 (лежит здесь: http://sourceforge.net/projects/cudavswizard/)

    3) Установть OpenCV (если еще не установлен)

    4) Запускаем Visual Studio 2008 и создаем новый проект типа CUDAWinApp. (File->New->New project->слева выбираем CUDA-> CUDAWinApp)

    5) Alt+F7 вызывается окошко свойств проекта. Выбрать конфигурацию Release. (Все конфигурации лучше настраивать по отдельности, а не выбирать AllConfigurations)

    6) В этом окошке слева выбрать Linker->Input .

    7) В строке с названием Additional Dependencies должно быть cudart.lib cutil32.lib cxcore.lib cv.lib highgui.lib, чего нет добавить.

    8) Открыть Linker->General,список Additional Library Directories должен содержать:

    $(CUDA_LIB_PATH)

    $(NVSDKCUDA_ROOT)\common\lib

    C:\Program Files\OpenCV\lib

    9) Открываем CUDA ->General, список Additional Include Directories должен содержать:

    $(CUDA_INC_PATH)

    $(NVSDKCUDA_ROOT)\common\inc

    C:\Program Files\OpenCV\cv\include

    C:\Program Files\OpenCV\cxcore\include

    C:\Program Files\OpenCV\otherlibs\highgui

    10) Что за фигня, в .cu файле нет подсветки!!! (однако должно компилироваться)

    11) Идем в “C:\Program Files\Microsoft Visual Studio 9.0\Common7\IDE\”.

    12) Создаем (если не существует) файл “usertype.dat”.

    13) Открываем “ Program files (или Program Data в vista)\NVIDIA Corporation\NVIDIA CUDA SDK\doc\syntax_highlighting\visual_studio_8\usertype.dat” и копируем его содержимое в недавно созданный файл.

    14) Сохраняем файл.

    15) Открываем IDE и идем Tools -> Options.

    16) Открываем Text Editor -> File Extension tab, задаем расширение “cu” как новый тип файлов.

    17) Перезапускаем IDE, наслаждаемся :).

    ЗЫ: Если у кого то стоит Касперский, то для успешной компиляции его лучше временно отключить, хотя откомпилированные программы работают нормально и с включенной защитой.

    Файл с проектом (перед открытием выполнить пункты 1,2,3, 11-17 по желанию): CUDAWinApp2.rar

    Проект просто находит границы.

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

    CUDA_OpenCV.jpg


  18. Скачал программу. Распаковал. Запускаю. Выдаёт:

    _____________________________________

    Project1.exe - Не удалось найти компонент

    ----------------------------------------------------

    Приложению не удалось запуститься, поскольку vcl60.bpl не был найден. Повторная установка приложения может исправить эту проблему.

    _____________________________________

    Как исправить?

    Не работает, так как рассчитано на то, что Builder 6 установлен (это его библиотеки).

    Можно скачать отсюда и бросить в папку с программой: http://smorodov.narod.ru/Downloads/Libs.zip

    Если чего не хватит, можно в инете найти и в папку с программой бросить.

×