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

Smorodov

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

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

  • Посещение

  • Days Won

    346

Все публикации пользователя Smorodov

  1. vcl компонент OpenCV

    Новая версия (добавил cvAux) + компонент для отображения видео на форме с мышиными событиями OnMouseUp OnMouseDown OnMouseMove. Архив здесь (компонент + простой пример): OpenCV_VCL.rar
  2. OpenCV, по моему, и представляет контуры кодом Фримана. Для того чтобы определить похожесть контуров, можно воспользоваться моментами Ху, или использовать функцию cvMatchShapes см. пример в аттаче. Пример: ContourMatching.rar ЗЫ: Людей лучше искать Хааром (см. выше).
  3. Как прикрутить OpenCV к билдеру?

    Начнете - выкладывайте, попробую присоединиться, заодно и паскаль подучу
  4. Как прикрутить OpenCV к билдеру?

    Титанический труд (хотел сам взяться, но знания паскаля не хватает и терпения), думаю что многие Вам будут благодарны если опубликуете. Только может немного подождать, в конце месяца новую версию вроде обещали ("next major release of OpenCV is here: OpenCV 2009.06").
  5. Как прикрутить OpenCV к билдеру?

    Можете использовать вместо vector<int>& указатель на обычный массив, лучше динамический. С vector<CvPoint2D32f> pt1, pt2; аналогично. Vector здесь просто для удобства. Можно попытаться приспособить cvSeq. Если у Вас не получится, я пример, скорее всего подкину только на выходных (пока времени очень мало, студенты донимают). А Вы собираетесь заголовочные файлы OpenCV переписывать на паскаль, или каким то другим способом хотите с Делфи взаимодействовать? PS: Класс Vector еще используется в заголовочном файле C:\Program Files\OpenCV\cv\src\_cvkdtree.hpp, но вроде бы он больше никуда не включается.
  6. гистограмма изображения

    Вот проект с примером построения гистограммы. Архив с проектом: HistogramExample.rar
  7. cvCalcEigenObjects

    Ну вот так, например: Определяем макс. и мин. эл-ты: void cvMinMaxLoc( const CvArr* arr, double* min_val, double* max_val, CvPoint* min_loc=NULL, CvPoint* max_loc=NULL, const CvArr* mask=NULL ); Переводим изображеие в однослойное восьмибитное gray - тип CV_8U, одноканальная (серая). cvCvtScale( avg, gray, здесь масштаб, здесь сдвиг ); Работает так: dst(I)=src(I)*scale + shift
  8. cvCalcEigenObjects

    В avg , скорее всего, лежат слишком маленькие значения (с плавающей точкой), надо просто его привести к диапазону 0-255 и все будет хорошо видно.
  9. Находим скелет (супер :))

    Конкретно про алгоритм скелетизации тут: скелетизация.rar Про свертку тут: Свертка.pdf Оставшиеся вопросы можно задать на форуме или в комментах к статьям.
  10. Пример с которого получен снимок : blobs_example.rar Библиотека для работы с блобами, взята у итальянцев, документацию перевожу. Комментарии на английском и итальянском. Как разберусь переведу. Пока так выкладываю: cvblobslib.rar
  11. Да, это она. Пришлось чуть подправить (возникало деление на ноль при поиске моментов (не проверялось условие равенства площади нулю), и чуть подрезать, чтобы билдер съел), а так вроде неплохо работает.
  12. Может отсюда что нибудь сгодится? Distinctive Image Features from Scale-Invariant Keypoints Вроде у них по образцу на примерах очень неплохо работает.
  13. На страничке wiki OpenCV написано "Может свободно использоваться в академических и коммерческих целях — распространяется в условиях лицензии BSD" Для справки: BSD (англ. Berkeley System Distribution) — система распространения программного обеспечения в исходных кодах, созданная для обмена опытом между учебными заведениями. Особенностью пакетов ПО BSD была специальная лицензия BSD, которую кратко можно охарактеризовать так: весь исходный код — собственность BSD, все правки — собственность их авторов.
  14. Офиц. руководство

    Обидно что у иностранцев руководство есть, а у нас нет, хотя ведь русские разрабатывали По поводу руководства, я так и собираюсь сделать, промежуточные результаты выражаются в двух файлах перевода справочника команд, которые выложены на сайте, по мере перевода буду в них добавлять материал. а вообще все, нужно структурировать, руководство допереводить, разбавить примерами и вообще довести до ума. Пока все бросаю на форум, оценить степень интереса к тем или иным темам, да и самому разобраться время нужно. На след. неделе время будет попробую что нибудь предварительное, из того что есть, сворганить. Работы еще лет на 100 . Работаю пока один, еще один человек помог, это он форум поставил, правда сейчас он занят очень, проект сдает.
  15. Офиц. руководство

    Неплохая статейка по распознаванию образов. Достаточно общая, но написано понятно и по русски. Скачать здесь: Распознавание_образов.pdf
  16. Отсечение заднего фона

    Вот что нашел: Идеи для новых версий (это wiki, и мне кажется, там надо просто вписать свои предложения): Страница для новых идей внизу страницы написано "Feel free to suggest your own ideas and the mentoring team will gladly look at them. Several other ideas are in this list: " PS: Этот сайт очень молодой, и пока я просто не успел всего что хотел, ссылки обязательно появятся, если есть предложения, присылайте, что считаете интересным и полезным, буду рад разместить их на главной странице в специальный блок. PS2: Со вторым FG детектором интересное решение, я бы не подумал об этом.
  17. Отсечение заднего фона

    Может быть добавить к методу сбора статистики выделение объекта по гистограмме, собираемой с блоба вначале, пока он движется, в смысле два параллельных процесса: один статистический, другой обратная проекция, как результат будет некоторое объединение (сумма, например). Но вопрос конечно интересный.
  18. Находим скелет (супер :))

    Программка иллюстрирующая один из алгоритмов нахождения скелета изображения. Щелкаем мышкой по левой зеленой сетке (задаем исходное изображение), затем нажимаем "итерация 1", дальше "<-->", потом "итерация 2", "<-->", и сначала. Программка очень простая. Разобраться несложно. Для компиляции нужны компоненты со странички http://smorodov.narod.ru/Builder.htm. Архив с проектом: Skeletonizator.rar
  19. Вот это работает в C++Builder6. Архив с проектом: simple2.rar //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "cv.h" #include "highgui.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; CvCapture* capture = 0; IplImage *frame, *frame_copy = 0; void ProcessFrame( IplImage* image ); // Описатель шрифта (см. дальше) CvFont font; #define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4) //--------------------------------------------------------------------------- // Создание API шного битмапа из интеловского RGB изображения //--------------------------------------------------------------------------- HBITMAP CreateRGBBitmap(IplImage* _Grab) { char *App; LPBITMAPINFO lpbi = new BITMAPINFO; lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); lpbi->bmiHeader.biWidth = _Grab->width; lpbi->bmiHeader.biHeight =_Grab->height; lpbi->bmiHeader.biPlanes = 1; lpbi->bmiHeader.biBitCount = 24; lpbi->bmiHeader.biCompression = BI_RGB; lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height; lpbi->bmiHeader.biXPelsPerMeter = 0; lpbi->bmiHeader.biYPelsPerMeter = 0; lpbi->bmiHeader.biClrUsed = 0; lpbi->bmiHeader.biClrImportant = 0; void* pBits; HBITMAP hBitmap = CreateDIBSection( NULL, lpbi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0 ); delete lpbi; if ( hBitmap ) App=(char*)pBits; long int length=0; if(_Grab->nChannels==1) // Серое или бинарное { length = _Grab->width*(_Grab->height); for (int i=0;i<_Grab->height;i++) { for (int j=0;j<_Grab->width;j++) { App[_Grab->width*3*(_Grab->height-i-1)+j*3]=_Grab->imageData[_Grab->width*(i)+j]; App[_Grab->width*3*(_Grab->height-i-1)+j*3+1]=_Grab->imageData[_Grab->width*(i)+j]; App[_Grab->width*3*(_Grab->height-i-1)+j*3+2]=_Grab->imageData[_Grab->width*(i)+j]; } } } if(_Grab->nChannels==3) // Цветное { for (int i=0;i<_Grab->height;i++) { memcpy(App+_Grab->width*3*(_Grab->height-i-1),_Grab->imageData+_Grab->width*3*i,_Grab->width*3); // Копируем память } } return hBitmap; } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- // Функция вывода изображения на HANDLE оконного компонента //--------------------------------------------------------------------------- void APIDrawIpl(int x,int y,IplImage* _Grab,void *HANDLE) { HDC hMemDC,hDC; hDC=GetDC(HANDLE); hMemDC = CreateCompatibleDC(hDC); HBITMAP Bitmap=CreateRGBBitmap(_Grab); SelectObject(hMemDC,Bitmap); BitBlt(hDC,x,y,_Grab->width,_Grab->height,hMemDC,0,0,SRCCOPY); DeleteObject(Bitmap); DeleteDC(hMemDC); DeleteDC(hDC); } //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { capture = cvCaptureFromCAM(0); // Инициализация шрифта (теперь можем вывести какой-нибудь текст) cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX,0.5,0.5,0,1,8); Application->OnIdle = IdleLoop; // Поток обработки простоя cvNamedWindow( "Window", 0 ); // Здесь создаем окно cvNamedWindow } //--------------------------------------------------------------------------- void __fastcall TForm1::IdleLoop(TObject*, bool& done) { done = false;// Поток обработки простоя if( capture ) { if( !cvGrabFrame( capture )) goto skip; frame = cvRetrieveFrame( capture ); if( !frame ) goto skip; //********************************************************* // Если стерли то что ниже - это надо раскомментировать // if( !frame_copy ) // frame_copy = cvCreateImage( cvSize(frame->width,frame->height), // IPL_DEPTH_8U, frame->nChannels ); // Делаем копию кадра, иначе может пропасть. // cvCopy( frame, frame_copy, 0 ); // Если стерли то что ниже - это надо раскомментировать //********************************************************* //********************************************************* // Если не нужно подгонять размер кадра - это можно стереть // Выделяем память под копию кадра if( !frame_copy ) frame_copy = cvCreateImage( cvSize(352,280), IPL_DEPTH_8U, frame->nChannels ); // Масштабируем под заданный размер cvResize( frame, frame_copy, CV_INTER_LINEAR ); // Если не нужно подгонять размер кадра - это можно стереть //********************************************************* cvShowImage( "Window", frame_copy ); // Здесь выводим в него IplImage ProcessFrame( frame_copy ); } skip:; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action) { cvDestroyWindow( "Window" ); // Здесь его уничтожаем cvReleaseImage( &frame_copy ); cvReleaseCapture( &capture ); } //--------------------------------------------------------------------------- void ProcessFrame( IplImage* img ) { APIDrawIpl(10,10,img,Form1->Handle); }[/code]
  20. Все примеры скомпилированы на C++ Builder6 sp4 + OpenCV1.1pre1. Разрешение получаемого с моей видеокамеры изображения: 352х288 . При запуске с камерами бОльшего / меньшего разрешения получается небольшой (или большой) разъезд всего по форме. В некоторых примерах, где участвует статическая картинка возможна ошибка, связанная с несоответствием разрешения камеры этой картинке. Для решения проблемы: 1 вариант) создайте в paint-е или еще где-нибудь картинку с разрешением Вашей камеры и бросьте в директорию с программой. 2 вариант) Используйте информацию из поста о изменении размера изображения Этот пост или (лучше) ЭТОТ. Да и на всякий случай у меня программы лежат так : C:\Program Files\Borland\CBuilder6\Projects\NewCvPrograms\ внутри этой директории находятся папки с программами.
  21. Уже исправлено.
  22. Проблемы с размерами поправил (во второй редакции).
  23. Альфа версия, достаточно интересной программки. Сделано на основе примеров библиотеки. По нажатию кнопки "Снимок", начинает отслеживать изображение со снимка. Что понял - откомментировал Баги: выскакивает ошибка деления на ноль при запуске в IDE (см. try - catch). Лечится снятием флажка Tools->Debugger Options->Stop on C++ exceptions (расположен снизу) Необходимо повысить устойчивость захвата (куски текста и другие плотные рисунки узнает очень неплохо). Архив проекта:Find_object.rar
  24. Проблемы с размерами поправил.
  25. При возможных ошибках (запуск с видеокамерой с разрешением отличающимся от моего) см. Тема форума
×