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

Smorodov

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

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

  • Посещение

  • Days Won

    346

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


  1. Загружаемое из файла изображение 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]


  2. Большое спасибо за быстрый и грамотный ответ!) "Картинку в картинке" вечером обязательно изучу, думаю это то что надо)Попиксельная обработка мне нужна для того чтобы реализовать распознавание символов, распознавание решил сделать на основе нейронной сети обратного распространения ошибки т.к. есть небольшой опыт работы с ней.... Может быть есть какие-то способы попроще организовать распознавание, средствами OpenCV ??? Использование нескольких способов распознавания мне не повредит)

    Здесь пример на OpenCV (практически Ваша задача :( ): OpenCV OCR

    Документ с задачей аналогичной Вашей здесь (нейросети): Распознавание образов (букв)

    Посмотрите вот это еще: Метод распознавания лиц, думаю что для данной задачи его можно приспособить. Не знаю насколько он применяется для этого, но думаю что должен работать.


  3. Для начала гляньте топик "Картинка в картинке". И вопрос, а для чего попиксельный доступ?

    В другом топике есть такое (не проверял): "Удобно использовать макросы: CV_IMAGE_ELEM(img, uchar, i, j) "

    И пара моих заметок:

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

    Для определения диагонали sqrt можно не брать.


  4. да ну...

    матрица пикселей жеж.... если размер матрицы не превышает кол-ва фоток то как усечь?)

    Насколько я понимаю, не нужно ничего усекать. Эта матрица ковариации имеет те-же собственные векторы, что и правильная матрица ковариации (большая). Однако, у маленькой матрицы их 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


  5. Есть более быстрый алгоритм поиска собств. значений

    потому как якоби я запустил на матрице 2500х2500 он что-то завис глухо... хотя если поставить брекпоинт то считает... т.е работает но долго(

    А откуда такая матрица?

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


  6. Напоследок, если в курсе, подскажи:

    1) я выбираю 5 векторов которым соотвествуют 5 макс собс значений.. (после сортировки)

    2) далее мне надо фотку разложить на эти вектора (как)

    3) спроектировать ее в этот базис (как?)

    я честно говоря не дружил с алгеброй... по этому сори(

    Как фотку разложить не знаю, а вот вектор по базису, например можно здесь посмотреть

    Разложение по базису

    Я думаю, что решение с фотками надо искать здесь (правда там надо вникать)

    http://www.cse.unr.edu/~bebis/MathMethods/..._study_pca1.pdf


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

    Итак, моя задача состоит в реализации алгоритма линейный дискриминантный анализ фишера..

    Т.е насколько я понял из теории это почти тот же метод главных компонент + доп. проектирование...

    Почитав теорию у меня сложился такой алгоритм:

    1) Создать Базу фоток

    2) найти ковариционную матрицу

    3) найти собственные вектора и значения

    4) спроектировать базу фотографий в пространство собс векторов (? так ли это? )

    5) найти проекцию такую, которая бы удовлетворяла идеи Фишера

    6) загнать новую фотку, спроектировать в полученное пространство и сравнить

    А теперь как я это понял и начал делать:

    1) У нас имется N фотография (серая, 8 битова) размерами WxH,

    2) Формируем матрицу X которая состоит из фотографий. Каждый ряд - вектор размерностью (WxH). Т.е если у меня 10 фоток размерами 100х100 то матрица Х = 10000х10.

    3) Необходимо найти ковариционую матрицу.

    Я ее ищу таким образом:

    3.1) Нахожу среднее по столбцам матрицы Х

    3.2) Отнимаю от каждого столбца его среднее

    3.3) Полученную матрицу транспонирую, умножаю ее на себя же и умножаю на коефициент. То есть матрица А = это матрица Х - среднее.

    C = А' * A * (1/(N-1))

    где ' - символ транспонирования

    Получаю симетричную матрицу, которая является ковариционной.

    Дальше, насколько я понял, надо найти собственные вектора, которые ищутся так:

    S = F' * C * F

    Где

    S - собственные значения

    F - собственные вектора

    C - ковариционная матрица

    (отсюда у меня возникает вопрос: Получается собственные вектора получаются из ВСЕЙ матрицы Х? Т.е из всех наборов фоток???)

    Разве не должно быть что у каждого набора фотографий - свои собственные лица?)

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

    Итерационный метод есть, вроде Мизес наз. но я не могу найти описание

    В общем я тут застрял.

    Дальше пока не могу представить как спроектировать фотки на полученные вектора

    Если кто прочел и знает как помочь - напишите, спасибо, жду.

    Возможно в openCV Есть ф-ция поиска собственных векторов и значений, мне нужны первые 5..

    спасибо(!)

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

    Reliable face recognition methods Автор: Harry Wechsler

    А здесь все по шагам расписано и скачать можно :)

    EigenFaces

    Ну и еще статейки:

    Собственные лица

    Собственные лица 2

    Faces Presentation

    Матлаб туториал по фейсам:

    Туториал

    Можете покопать код итальянца (C++Builder): 71477208Autofaro.zip

    • Like 1

  8. Я пользователь джаббера, но в настройках сервера ничего не понимаю.

    Достучаться до xmpp://compvision.ru через gtalk(в pidgin) мне не удалось, не создать комнату и, видимо, сообщение до smorodov@compvision.ru не дошло.

    Может, нужен транспорт?

    Я добавил запись cfr@compvision.ru, вроде зарегистрировался, но создать комнату и доставить сообщение всё равно не удалось :(

    UPD: хотя, себе сообщение могу отправить :)

    Вот что пишет хостинг-провайдер:

    Некоторые Jabber клиенты требуют указать этот адрес в явном виде.

    Доступен Jabber сервер, принимающий соединения на любых TCP портах (например, даже стандартный порт 80 или 443).

    Его адрес содержит в себе имя allports . Попробуйте порт 443.

    Прямые адреса серверов:

    jabber-l4.1gb.ru

    jabber1-allports.1gb.ru

    Скорее всего, с них достучаться получится.


  9. На сайте есть собственный jabber сервер.

    Подключайтесь smile.gif

    Формат адреса: ваш_ник@compvision.ru

    Рекомендуемые программы-клиенты:

    Miranda http:www.miranda-im.org

    Trillian http:www.ceruleanstudios.com

    Psi http:psi-im.org

    Gaim/Pidgin http:www.pidgin.im

    Здесь обсуждается статья: Jabber сервер на compvision.ru


  10. здесь кто-нибудь работал с кодом Фримана??? у меня задача определение контура человека, вот решил попробовать через код Фримана

    OpenCV, по моему, и представляет контуры кодом Фримана. Для того чтобы определить похожесть контуров, можно воспользоваться моментами Ху, или использовать функцию cvMatchShapes см. пример в аттаче.

    ContourMatching.png

    Пример: ContourMatching.rar

    ЗЫ: Людей лучше искать Хааром (см. выше).


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

    Начнете - выкладывайте, попробую присоединиться, заодно и паскаль подучу :(


  12. Именно так. Дамаете, что идея бредовая? Facedetect я переписал на делфи. Сейчас пробую переписать заголовочные файлы полностью - надеюсь, что терпения хватит. Могу потом выложить, что получится.

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


  13. Здравствуйте!

    У меня следующий вопрос: можно ли обойтись без использования класса VECTOR в примере Find_obj?

    P.S. Зачем это надо - нужен простейший пример для переноса на Делфи.

    Можете использовать вместо vector<int>& указатель на обычный массив, лучше динамический.

    С vector<CvPoint2D32f> pt1, pt2; аналогично. Vector здесь просто для удобства. Можно попытаться приспособить cvSeq. Если у Вас не получится, я пример, скорее всего подкину только на выходных (пока времени очень мало, студенты донимают).

    А Вы собираетесь заголовочные файлы OpenCV переписывать на паскаль, или каким то другим способом хотите с Делфи взаимодействовать?

    PS: Класс Vector еще используется в заголовочном файле C:\Program Files\OpenCV\cv\src\_cvkdtree.hpp, но вроде бы он больше никуда не включается.


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

    пробовала

    вот так:

    IplImage* planes[] = { gray}; // gray - ранее загруженное изображение

    int hist_size[] = {255};

    float s_rang[] = { 0, 255 };

    float* ranges[] = {rang};

    CvHistogram* hist;

    hist = cvCreateHist( 1, hist_size, CV_HIST_ARRAY,ranges, 1 );

    cvCalcHist( planes, hist, NULL, 0 );

    программа ошибок не выдает, но значения гистограммы все кроме одного равны "0", а одно - 255; У меня проблемы с английским, может я не правельно понимаю параметры функций cvCreateHist и cvCalcHist. Объявните что не так :(

    Вот проект с примером построения гистограммы.

    HistogramExample.jpg

    Архив с проектом: HistogramExample.rar


  15. подскажи более подробней....потому как я попытался доступится как avg[x][y] мне писало ероры...

    как вытянуть мин/макс? cvMin?

    Ну вот так, например:

    Определяем макс. и мин. эл-ты:

    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


  16. В комментариях в программе написано что описание работы процедуры скелетизации будет дано позже. Хотелось бы побольше узнать об этой процедуре. Как работает? Зачем фильтры и т.д. :(

    Конкретно про алгоритм скелетизации тут: скелетизация.rar

    Про свертку тут: Свертка.pdf

    Оставшиеся вопросы можно задать на форуме :) или в комментах к статьям.

×