-
Количество публикаций
3 873 -
Зарегистрирован
-
Посещение
-
Days Won
346
Все публикации пользователя Smorodov
-
Поиск цветного фрагмента на полутоновом изображении
Smorodov replied to CornersKir's topic in OpenCV
Посмотрите еще этот документ: http://www.compvision.ru/forum/index.php?a...=post&id=95 Не самый простой способ, но его часто используют при OCR. -
Приводить понадобилось, чтобы получть float, а CvPoint определена так: typedef struct CvPoint { int x; int y; } CvPoint;[/code] То есть там 8 байт (два int-а по 4 байта), на два float-а не тянет (отсюда ошибка). Скорее всего это Integer по дельфофски (два четырехбайтовых числа). ЗЫ: С делфофскими форматами данных знаком поверхностно, могу ошибаться.
-
Использование нейросетевой библиотеки FANN
Smorodov replied to Smorodov's topic in Вопросы по нейросетям и ИИ
Есть Fann Tool (утилитка с графическим интерфейсом) можете попробовать, преобразуем изображение в файл входов-выходов (формат простой, описан в документации) и погонять с разными настройками. ЗЫ: Нейросеть тренировать долго, считает она на порядки быстрее чем тренируется. -
Написал програмку, позволяющую поэкспериментировать с cvMatchTemplate. Программа строит зависимости максимального и минимального отклика от угла поворота шаблона. Если открывать изображения больше чем 100х100 график строится корректно, но само изображение не помещается на панельки, масштабирование не делал умышленно, если кому нужно что то переделать, исходники в архиве. Слева отображается само изображение, справа отклик, графики нормированы, для того чтобы посмотреть значения нужно навести мышь на график. MatchTemplTool.rar ЗЫ: С большими изображениями работает медленно (в процессе поворота ни на что не отвечает), так что лучше работать с маленькими (до 100 на 100) изображениями.
-
Если вычислить моменты можно найти главные оси , зная главные оси находим наклон (если требуемая ось повернута и (или смещена), измеряем смещение (линейное или угловое) и корректируем). Вот кусок кода: double M00=moments.m00; double M20=moments.m20; double M02=moments.m02; double M11=moments.m11; double A=(M20/M00)-xc*xc; double B=2*((M11/M00)-xc*yc); double C=(M02/M00)-yc*yc; double LL=sqrt( ( (A+C)+sqrt(B*B+(A-C)*(A-C)) )/2)*2; double LW=sqrt( ( (A+C)-sqrt(B*B+(A-C)*(A-C)) )/2)*2; // Для вычисления угла нужны центральные моменты инерции M20=moments.mu20; M02=moments.mu02; M11=moments.mu11; double theta=(atan2(2*M11,(M02-M20))/2)*(180/M_PI);[/code] где xc и yc ищется так: [code]float xc=(moments.m10/moments.m00); float yc=(moments.m01/moments.m00); PS: квадрант может скакать.
-
Можно сделать шаблон, включающий не весь искомый объект, а какую-нибудь его характерную часть.
-
В документации написано вот что: After the function finishes the comparison, the best matches can be found as global minimums (CV_TM_SQDIFF) or maximums (CV_TM_CCORR and CV_TM_CCOEFF) using the MinMaxLoc function. что буквально значит: После того, как функция завершит сравнение, наилучшие совпадения могут быть найдены как глобальные минимумы (метод поиска CV_TM_SQDIFF) или максимумы (методы поиска CV_TM_CCORR и CV_TM_CCOEFF) при помощи функции MinMaxLoc. Скорее всего Вы используете метод CV_TM_SQDIFF. подробнее здесь: http://opencv.willowgarage.com/documentati...cvMatchTemplate
-
Вот здесь есть код: http://dasl.mem.drexel.edu/~noahKuntz/openCVTut6.html
-
По поводу выравнивания, там где это нужно знать (например IplImage) есть параметр widthStep, определяющий сколько байт выделено на строку (что может не совпадать с размером фактических данных), есть параметр отвечающий за выравнивание данных изображения, но он не используется, видимо этим заведует интелловская библиотека Ipl. ЗЫ: У меня изображение выравнивалось по 8 байтам, но это вполне может зависеть от машины и операционки.
-
Находим в кадре лица, человеческие фигуры, и т.д. и т.п
Smorodov replied to Smorodov's topic in Обсуждение общих вопросов
Если Вы про AAM-Library то библиотека использует двухмерные модели (контур + текстура). Я немного переделал (несколько строчек), и у меня работает при частоте кадров от нескольких кадров в сек. до кадров 10-15 в сек, в зависимости от количества итераций приближения. Я думаю что возможно ускорить еще больше, если: 1) Брать приближение из предыдущего кадра (20-30 итераций делать только на первом кадре), тогда на каждый кадр 1-2 итерация, это должно работать достаточно быстро и точно. 2) Как вариант, можно использовать для действий с текстурой OpenGL или DirectX. Если про FRAV, то я дал ссылку как на базу моделей,ведь из трехмерных получить двумерные несложно. Я предполагал, что эта база будет полезна при использовании AAM-library, так как содержит аннотированные изображения (изображения с отмеченными характерными точками лица). -
Находим в кадре лица, человеческие фигуры, и т.д. и т.п
Smorodov replied to Smorodov's topic in Обсуждение общих вопросов
База трехмерных моделей лица VRML с текстурой. http://www.frav.es/research/facerecognition/FRAV3D/ -
Насколько я знаю, cvMatchTemplate сохраняет работоспособность при углах поворота плюс-минус 15 градусов, можно делать несколько прогонов. Можно, для сокращения области поиска использовать ROI вычисленную по бинаризованному изображению, которое у Вас уже имеется. Можно попробовать (к бинарному изображению) применить функцию cvDistTransform. Тем самым получите центры объектов. А после этого, по максимальному отклику cvMatchTemplate найти и поворот.
-
Может лучше сегментировать изображение (при помощи cvFloodfill, например получить маски для каждого цветового пятна) а потом определять контуры? Контуры можно конечно распутать, если они обладают свойством гладкости и не имеют разрывов в производных, но это сложный путь, лучше поработать с изображением до выделения контуров.
-
Сохранение контура: CvFileStorage* fs = cvOpenFileStorage( "example.yml", 0, CV_STORAGE_WRITE ); cvWrite( fs, "result", result, cvAttrList(0,0) ); cvReleaseFileStorage( &fs ); Считывание контура: CvFileStorage* fs = cvOpenFileStorage( "example.yml", 0, CV_STORAGE_READ ); CvFileNode* fn= cvGetFileNodeByName( fs, cvGetRootFileNode(fs), "result" ); result=(CvSeq*)cvRead( fs, fn ); //----------------------- // работа с контуром // - - - - - - - - - - - - // - - - - - - - - -- - - - //----------------------- // освобождение хранилища cvReleaseFileStorage( &fs ); Что Вы имеете ввиду под сегментацией контура? Разбить на отрезки (точки), или что то другое ?
-
Это приведение не к типу float а к указателю на данные типа float. PChar это указатель на данные типа char или BYTE .
-
cvCircle ничего не считает, эта команда рисует окружности, это всего лишь вывод результата. Координаты кругов: x=p[0] ; y=p[1] ; радиус = p[2].
-
Находим в кадре лица, человеческие фигуры, и т.д. и т.п
Smorodov replied to Smorodov's topic in Обсуждение общих вопросов
Посмотрите OpenTL (надстройка над OpenCV). Там есть инструменты для трекинга. Судя по постановке задачи нужен какой-то фильтр, Particles (Condensation) или фильтр Кальмана. Если не лень поковыряйте этот проект. -
На сайте NVidia есть ссылка на пример реализации SURF на CUDA + OpenCV 2.0, можно его покопать еще для общего развития : http://www.mis.tu-darmstadt.de/surf И еще, в SVN версии OpenCV появились намеки на то, что в следующей версии появится поддержка GPU (CUDA). См. директорию opencv/modules/gpu/. Полезно будет посмотреть библиотеку для трекинга OpenTL (судя по всему, на базе OpenCV) : http://www.opentl.org/index.html
-
Я бы попробовал собрать классификатор из слабых признаков, например: параметры контура (площадь, отношение длины к ширине, построить гистограмму контура cvCalcPGH(const CvSeq* contour, CvHistogram* hist) т.д. ), параметры цвета (если есть), вероятные места появления объекта, параметры симметрии. Как вариант, можно попробовать натренировать каскады Хаара. Можете еще посмотреть здесь: http://code.google.com/p/aam-library/ ориентировано на лица, но можно переделать под любые объекты.
-
В Squares, можно предварительно отсеивать контуры по площади, и убрать клоны (близкие по форме и положению), применить cvPyrDown - тогда будет быстрее. Есть еще пара советов: 1) На форуме был пример нахождения угловых точек, может его приспособить? 2) Использовать поиск на основе преобразования Хафа http://www.inf.ufrgs.br/~crjung/research_a.../paper_1125.pdf Как работает читать здесь: http://www.massey.ac.nz/~mjjohnso/notes/59318/l11.html ЗЫ: Не факт что преобразование Хафа будет работать быстрее.
-
OpenCv- шные примеры тоже выводят черный экран?
-
Хотя-бы какую то обработку данных сделать нужно, чтобы уменьшить нагрузку на ресурсоемкие методы обработки думаю что стохастические фильтры здесь подходят.
-
У меня, например, параметры камеры устанавливаются Logitech-овской прогой в трее, через OpenCv не пробовал, и думаю что не получится , я постоянно использую максимальное разрешение, потом масштабирую (уменьшаю в основном): cvResize(frame, frame_resized, CV_INTER_LINEAR); где: frame - кадр с камеры, frame_resized - изображение нужного размера. ЗЫ: мне кажется, что камера у Вас не поддерживает запрашиваемое разрешение (см. документацию).
-
Есть ссылка на фильтр "FFT3DFilter - частотный 3D фильтр для сильного понижения шума и умеренного повышения резкости."
-
На вскидку видится вот что: 1) нейросеть, или другой классификатор, все равно нужно обучить, для этого все равно придется включать узлы по отдельности, либо менять режимы работы узлов (тоже по отдельности). 2) не обязательно использовать нейросеть, мне кажется что тут даже лучше пойдет какой нибудь статистический метод, например particle filter. Ведь можно использовать методику, аналогичную той, что используется для отделения фона. (можно почитать тут, например: http://www.cgm.computergraphics.ru/content/view/67 ) Собираем статистику спектра нормально работающей машины, затем смотрим, изменения, и потом можно применить классификатор (четкий, или нечеткий).