Jump to content
Compvision.ru

Smorodov

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

    3,833
  • Joined

  • Last visited

  • Days Won

    343

Everything posted by Smorodov

  1. Реализация змей на OpenCV Архив с проектом: snake.rar
  2. Корректно выводит изображения ширины не кратной 8 и изображения с типом элемента не IPL_DEPTH_8U. Думаю что должен выводить любые изображения. #define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4) //--------------------------------------------------------------------------- // Создание API шного битмапа из интеловского RGB изображения //--------------------------------------------------------------------------- HBITMAP CreateRGBBitmap(IplImage* _Grab) { char *App; IplImage *_Grab3=0,*_Grabf=0; 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; // Если глубина изображения не IPL_DEPTH_8U (однобайтовое целое), конвертируем if(_Grab->depth!=IPL_DEPTH_8U) { _Grabf=cvCloneImage(_Grab); if(_Grab) {cvReleaseImage( &_Grab);} _Grab = cvCreateImage( cvSize(_Grabf->width,_Grabf->height),IPL_DEPTH_8U,_Grabf->nChannels); cvConvert(_Grabf,_Grab); if(_Grabf) {cvReleaseImage( &_Grabf);} } // Если изображение содержит один канал, создаем трехканальное изображение // Серое или бинарное if(_Grab->nChannels==1) { _Grab3 = cvCreateImage( cvSize(_Grab->width,_Grab->height),IPL_DEPTH_8U,3); cvMerge(_Grab,_Grab,_Grab,NULL,_Grab3); } // Если входное изображение трехканальное, просто копируем указатель на него // Цветное if(_Grab->nChannels==3) { _Grab3=_Grab; } // Получаем указатель на данные unsigned char* data; cvGetRawData(_Grab3, (uchar**)&data); // Копируем данные if(_Grab3) { for (int i=0;i<_Grab->height;i++) { memcpy(App+_Grab3->widthStep*(_Grab3->height-i-1),data+_Grab3->widthStep*i,_Grab3->width*3); } } // Очищаем память если создавали изображение, а не копировали указатель if(_Grab->nChannels==1) {cvReleaseImage( &_Grab3);} 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); } //--------------------------------------------------------------------------- //---------------------------------------------------------------------------[/code]
  3. Идея, положенная в основу проекта: Wiki Сама библиотека здесь: http://www.kavrakilab.org/OOPSMP/index.html
  4. Загружаемое из файла изображение 3х канальное I(x,y)blue ~ CV_IMAGE_ELEM( img, uchar, y, x*3); I(x,y)green ~ CV_IMAGE_ELEM( img, uchar, y, x*3+1); I(x,y)red ~ CV_IMAGE_ELEM( img, uchar, y, x*3+2); Если не заработает, то так: I(x,y)blue ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3] I(x,y)green ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+1] I(x,y)red ~ ((uchar*)(img->imageData + img->widthStep*y))[x*3+2] или так: uchar *data; cvGetRawData(img, (uchar**)&data); I(x, y) = data[x*img->Width + y]
  5. Здесь пример на OpenCV (практически Ваша задача ): OpenCV OCR Документ с задачей аналогичной Вашей здесь (нейросети): Распознавание образов (букв) Посмотрите вот это еще: Метод распознавания лиц, думаю что для данной задачи его можно приспособить. Не знаю насколько он применяется для этого, но думаю что должен работать.
  6. Для начала гляньте топик "Картинка в картинке". И вопрос, а для чего попиксельный доступ? В другом топике есть такое (не проверял): "Удобно использовать макросы: CV_IMAGE_ELEM(img, uchar, i, j) " И пара моих заметок: Лучше координаты точек перед вычислением диагоналей присвоить переменным типа double, а не приводить типы, во всяком случае, не так как у Вас (может быть переполнение). Для определения диагонали sqrt можно не брать.
  7. Собственные вектора и значения

    Насколько я понимаю, не нужно ничего усекать. Эта матрица ковариации имеет те-же собственные векторы, что и правильная матрица ковариации (большая). Однако, у маленькой матрицы их N, а у большой N^2, но те N собственных векторов маленькой матрицы содержат все собственные векторы с максимальными собственными значениями из множества собственных векторов большой матрицы. Выбираем из этого количества K векторов, с самыми большими собственными значениями u1,u2,...uK. Нормируем их (приводим длины к единице). Дальше каждая фотка представляется как линейная комбинация этих самых K собственных векторов w1,w2,..wK. Fi: i-тое лицо (вектор (N^2)x1) (в pdf см. ниже это обозначено как Г ) mean: "среднее лицо" Найдем W =(w1,w2,...,wK), где wi=ui(это строка) * (Fi-mean)(это столбец) (Результат одно число для каждого wi) где u1,u2,...uK - это векторы базиса А i-тое лицо будет представлено вектором W=(w1,w2,w2,...wK) Получили векторы с которыми будем сравнивать поступающие на вход лица. Далее рассчитываем wi для поступившего лица. См выше. и сравниваем векторы (находим Евклидову дистанцию или можно (лучше) по Маханоблису). ЗЫ: Если где заглючился, прошу делать скидку на то что писал ночью Подробнее тут, см. стр.5. из http://www.cse.unr.edu/~bebis/MathMethods/..._study_pca1.pdf
  8. Собственные вектора и значения

    А откуда такая матрица? Там ведь при вычислении матрицы ковариации используется переставленное транспонирование, то есть размер матрицы не должен превышать количества фотографий, насколько я понял. Смотри опция OpenCV: CV_COVAR_SCRAMBLED - Fast PCA “scrambled” covariance.
  9. Собственные вектора и значения

    Там несколько проектов часть на с++, а часть на матлаб
  10. Собственные вектора и значения

    Вот китайцы понаписали, не сильно радуйтесь, но поковырять можно: Fisher.rar Самый толковый файл, по моему - FisherfaceCore.m из 5956440FLD-Face-Recognition.rar
  11. Собственные вектора и значения

    Ага, вот здесь: PCA Functions
  12. Собственные вектора и значения

    Как фотку разложить не знаю, а вот вектор по базису, например можно здесь посмотреть Разложение по базису Я думаю, что решение с фотками надо искать здесь (правда там надо вникать) http://www.cse.unr.edu/~bebis/MathMethods/..._study_pca1.pdf
  13. Тут материальчик от Intel: OpenCV Object Detection: Theory and Practice И это посмотрите: Виола-Джонс Faces Presentation
  14. Собственные вектора и значения

    Попалась на глаза книжечка, может чем нибудь поможет (там ограничение по количеству просмотренных страниц) Reliable face recognition methods Автор: Harry Wechsler А здесь все по шагам расписано и скачать можно EigenFaces Ну и еще статейки: Собственные лица Собственные лица 2 Faces Presentation Матлаб туториал по фейсам: Туториал Можете покопать код итальянца (C++Builder): 71477208Autofaro.zip
  15. Вот что пишет хостинг-провайдер: Некоторые Jabber клиенты требуют указать этот адрес в явном виде. Доступен Jabber сервер, принимающий соединения на любых TCP портах (например, даже стандартный порт 80 или 443). Его адрес содержит в себе имя allports . Попробуйте порт 443. Прямые адреса серверов: jabber-l4.1gb.ru jabber1-allports.1gb.ru Скорее всего, с них достучаться получится.
  16. vcl компонент OpenCV

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

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

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

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

    Вот проект с примером построения гистограммы. Архив с проектом: HistogramExample.rar
  22. 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
  23. cvCalcEigenObjects

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