-
Количество публикаций
3 873 -
Зарегистрирован
-
Посещение
-
Days Won
346
Все публикации пользователя Smorodov
-
Новая версия (добавил cvAux) + компонент для отображения видео на форме с мышиными событиями OnMouseUp OnMouseDown OnMouseMove. Архив здесь (компонент + простой пример): OpenCV_VCL.rar
-
Находим в кадре лица, человеческие фигуры, и т.д. и т.п
Smorodov replied to Smorodov's topic in Обсуждение общих вопросов
OpenCV, по моему, и представляет контуры кодом Фримана. Для того чтобы определить похожесть контуров, можно воспользоваться моментами Ху, или использовать функцию cvMatchShapes см. пример в аттаче. Пример: ContourMatching.rar ЗЫ: Людей лучше искать Хааром (см. выше). -
Начнете - выкладывайте, попробую присоединиться, заодно и паскаль подучу
-
Титанический труд (хотел сам взяться, но знания паскаля не хватает и терпения), думаю что многие Вам будут благодарны если опубликуете. Только может немного подождать, в конце месяца новую версию вроде обещали ("next major release of OpenCV is here: OpenCV 2009.06").
-
Можете использовать вместо vector<int>& указатель на обычный массив, лучше динамический. С vector<CvPoint2D32f> pt1, pt2; аналогично. Vector здесь просто для удобства. Можно попытаться приспособить cvSeq. Если у Вас не получится, я пример, скорее всего подкину только на выходных (пока времени очень мало, студенты донимают). А Вы собираетесь заголовочные файлы OpenCV переписывать на паскаль, или каким то другим способом хотите с Делфи взаимодействовать? PS: Класс Vector еще используется в заголовочном файле C:\Program Files\OpenCV\cv\src\_cvkdtree.hpp, но вроде бы он больше никуда не включается.
-
Вот проект с примером построения гистограммы. Архив с проектом: HistogramExample.rar
-
Ну вот так, например: Определяем макс. и мин. эл-ты: 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
-
В avg , скорее всего, лежат слишком маленькие значения (с плавающей точкой), надо просто его привести к диапазону 0-255 и все будет хорошо видно.
-
Конкретно про алгоритм скелетизации тут: скелетизация.rar Про свертку тут: Свертка.pdf Оставшиеся вопросы можно задать на форуме или в комментах к статьям.
-
Пример с которого получен снимок : blobs_example.rar Библиотека для работы с блобами, взята у итальянцев, документацию перевожу. Комментарии на английском и итальянском. Как разберусь переведу. Пока так выкладываю: cvblobslib.rar
-
Да, это она. Пришлось чуть подправить (возникало деление на ноль при поиске моментов (не проверялось условие равенства площади нулю), и чуть подрезать, чтобы билдер съел), а так вроде неплохо работает.
-
Находим в кадре лица, человеческие фигуры, и т.д. и т.п
Smorodov replied to Smorodov's topic in Обсуждение общих вопросов
Может отсюда что нибудь сгодится? Distinctive Image Features from Scale-Invariant Keypoints Вроде у них по образцу на примерах очень неплохо работает. -
На страничке wiki OpenCV написано "Может свободно использоваться в академических и коммерческих целях — распространяется в условиях лицензии BSD" Для справки: BSD (англ. Berkeley System Distribution) — система распространения программного обеспечения в исходных кодах, созданная для обмена опытом между учебными заведениями. Особенностью пакетов ПО BSD была специальная лицензия BSD, которую кратко можно охарактеризовать так: весь исходный код — собственность BSD, все правки — собственность их авторов.
-
Обидно что у иностранцев руководство есть, а у нас нет, хотя ведь русские разрабатывали По поводу руководства, я так и собираюсь сделать, промежуточные результаты выражаются в двух файлах перевода справочника команд, которые выложены на сайте, по мере перевода буду в них добавлять материал. а вообще все, нужно структурировать, руководство допереводить, разбавить примерами и вообще довести до ума. Пока все бросаю на форум, оценить степень интереса к тем или иным темам, да и самому разобраться время нужно. На след. неделе время будет попробую что нибудь предварительное, из того что есть, сворганить. Работы еще лет на 100 . Работаю пока один, еще один человек помог, это он форум поставил, правда сейчас он занят очень, проект сдает.
-
Неплохая статейка по распознаванию образов. Достаточно общая, но написано понятно и по русски. Скачать здесь: Распознавание_образов.pdf
-
Вот что нашел: Идеи для новых версий (это 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 детектором интересное решение, я бы не подумал об этом.
-
Может быть добавить к методу сбора статистики выделение объекта по гистограмме, собираемой с блоба вначале, пока он движется, в смысле два параллельных процесса: один статистический, другой обратная проекция, как результат будет некоторое объединение (сумма, например). Но вопрос конечно интересный.
-
Программка иллюстрирующая один из алгоритмов нахождения скелета изображения. Щелкаем мышкой по левой зеленой сетке (задаем исходное изображение), затем нажимаем "итерация 1", дальше "<-->", потом "итерация 2", "<-->", и сначала. Программка очень простая. Разобраться несложно. Для компиляции нужны компоненты со странички http://smorodov.narod.ru/Builder.htm. Архив с проектом: Skeletonizator.rar
-
преобразовать загружаемую картинку к требуемому разрешению?
Smorodov replied to ak-86's topic in OpenCV
Вот это работает в 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] -
Все примеры скомпилированы на C++ Builder6 sp4 + OpenCV1.1pre1. Разрешение получаемого с моей видеокамеры изображения: 352х288 . При запуске с камерами бОльшего / меньшего разрешения получается небольшой (или большой) разъезд всего по форме. В некоторых примерах, где участвует статическая картинка возможна ошибка, связанная с несоответствием разрешения камеры этой картинке. Для решения проблемы: 1 вариант) создайте в paint-е или еще где-нибудь картинку с разрешением Вашей камеры и бросьте в директорию с программой. 2 вариант) Используйте информацию из поста о изменении размера изображения Этот пост или (лучше) ЭТОТ. Да и на всякий случай у меня программы лежат так : C:\Program Files\Borland\CBuilder6\Projects\NewCvPrograms\ внутри этой директории находятся папки с программами.
-
Уже исправлено.
-
Проблемы с размерами поправил (во второй редакции).
-
Альфа версия, достаточно интересной программки. Сделано на основе примеров библиотеки. По нажатию кнопки "Снимок", начинает отслеживать изображение со снимка. Что понял - откомментировал Баги: выскакивает ошибка деления на ноль при запуске в IDE (см. try - catch). Лечится снятием флажка Tools->Debugger Options->Stop on C++ exceptions (расположен снизу) Необходимо повысить устойчивость захвата (куски текста и другие плотные рисунки узнает очень неплохо). Архив проекта:Find_object.rar
-
Проблемы с размерами поправил.
-
При возможных ошибках (запуск с видеокамерой с разрешением отличающимся от моего) см. Тема форума