Jump to content
Compvision.ru

Smorodov

Главные администраторы
  • Content count

    3,833
  • Joined

  • Last visited

  • Days Won

    343

Everything posted by Smorodov

  1. Находим скелет (супер :))

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

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

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

    Вот что нашел: Идеи для новых версий (это 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 детектором интересное решение, я бы не подумал об этом.
  9. Отсечение заднего фона

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

    Программка иллюстрирующая один из алгоритмов нахождения скелета изображения. Щелкаем мышкой по левой зеленой сетке (задаем исходное изображение), затем нажимаем "итерация 1", дальше "<-->", потом "итерация 2", "<-->", и сначала. Программка очень простая. Разобраться несложно. Для компиляции нужны компоненты со странички http://smorodov.narod.ru/Builder.htm. Архив с проектом: Skeletonizator.rar
  11. Вот это работает в 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]
  12. Все примеры скомпилированы на C++ Builder6 sp4 + OpenCV1.1pre1. Разрешение получаемого с моей видеокамеры изображения: 352х288 . При запуске с камерами бОльшего / меньшего разрешения получается небольшой (или большой) разъезд всего по форме. В некоторых примерах, где участвует статическая картинка возможна ошибка, связанная с несоответствием разрешения камеры этой картинке. Для решения проблемы: 1 вариант) создайте в paint-е или еще где-нибудь картинку с разрешением Вашей камеры и бросьте в директорию с программой. 2 вариант) Используйте информацию из поста о изменении размера изображения Этот пост или (лучше) ЭТОТ. Да и на всякий случай у меня программы лежат так : C:\Program Files\Borland\CBuilder6\Projects\NewCvPrograms\ внутри этой директории находятся папки с программами.
  13. Уже исправлено.
  14. Проблемы с размерами поправил (во второй редакции).
  15. Альфа версия, достаточно интересной программки. Сделано на основе примеров библиотеки. По нажатию кнопки "Снимок", начинает отслеживать изображение со снимка. Что понял - откомментировал Баги: выскакивает ошибка деления на ноль при запуске в IDE (см. try - catch). Лечится снятием флажка Tools->Debugger Options->Stop on C++ exceptions (расположен снизу) Необходимо повысить устойчивость захвата (куски текста и другие плотные рисунки узнает очень неплохо). Архив проекта:Find_object.rar
  16. Проблемы с размерами поправил.
  17. При возможных ошибках (запуск с видеокамерой с разрешением отличающимся от моего) см. Тема форума
  18. При возможных ошибках (запуск с видеокамерой с разрешением отличающимся от моего) см. Тема форума
  19. У меня такое компилируется. //--------------------------------------------------------------------------- #include <vcl.h> #pragma hdrstop #include "cv.h" #include "highgui.h" #include "Unit1.h" //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; IplImage* img; void ProcessFrame( IplImage* img ); #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) { } //--------------------------------------------------------------------------- void ProcessFrame( IplImage* img ) { APIDrawIpl(100,100,img,Form1->Handle); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { IplImage* gray; img = cvLoadImage("OpenCv.jpg"); gray = cvCreateImage(cvSize(img->width,img->height), IPL_DEPTH_8U, 1); cvCvtColor(img, gray, CV_BGR2GRAY); // Получаем серый цвет //**************************************************** IplImage* resize; resize = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1 /*3 - если цветное*/); // Масштабирование изображения cvResize( gray, resize, CV_INTER_LINEAR ); //**************************************************** ProcessFrame(resize); cvReleaseImage( &img ); cvReleaseImage( &gray ); cvReleaseImage( &resize ); } //---------------------------------------------------------------------------[/code]
  20. // В пример для загрузки изображения вставить. IplImage* resize; // Создаем изображение нужного размера resize = cvCreateImage(cvSize(640,480), IPL_DEPTH_8U, 1 /*3 - если цветное*/); // Масштабирование изображения - исходное изображение находится в gray cvResize( gray, resize, CV_INTER_LINEAR ); // вместо CV_LINEAR возможны другие типы интерполяции: // CV_INTER_NN - nearest-neigbor interpolation (ближайший сосед ?) // CV_INTER_LINEAR - bilinear interpolation (билинейная - используется по умолчанию) // CV_INTER_AREA - resampling using pixel area relation. It is preferred method for image decimation that gives moire-free results. In case of zooming it is similar to CV_INTER_NN method. Масштабирование с учетом отношения пиксельных площадей. Наиболее предпочтительный метод, т.к. дает изображение без муара. Результат напоминает результат метода CV_INTER_NN. // CV_INTER_CUBIC - bicubic interpolation. Бикубичестая интерполяция. // Вывод или другое использование // Очистка cvReleaseImage( &resize );
  21. Modbus Master Один из сносно работающих. Mbus.rar Modbus Parser. Очень нужная штуковина расшифровывает Modbus телеграммы Выкладываю екзешник если не будет работать поискать в инете (она бесплатная) CASModbusRTUParser.rar Написан собственноручно на базе существующих библиотек для работы с последовательным портом Исходники прилагаются (использованные компоненты на www.smorodov.narod.ru в разделе "для С++Builder") ModbusSlave.rar
  22. Как прикрутить OpenCV к билдеру?

    IPP существенно (в разы) ускоряющая работу OpenCV хреновина берется с сайта Intel. Ставим интелловский компилятор Intel C Plus Plus Compiler v10.1.025 Google рулит. IPP ставится после установки компилятора. И использует его лицензию Подключается автоматически, нужно только указать в системной переменной Path путь к директории, /bin библиотеки IPP, в самой программе ничего отдельно указывать не нужно.
  23. Небольшая модификация. Архив с проектом:HistAndBackProj.rar
  24. Офиц. руководство

    Небольшие дополнения к переводу документации там есть такие разделы, но нет описания команд. Перевод описания команды cvGoodFeaturesToTrack. GoodFeaturesToTrack.rar Перевод описания команды: FindCornerSubPix FindCornerSubPix.rar
  25. Естьеще большой каталог здесь: Большой каталог
×