Блог / Публикации vidikon / Recog.ru - Распознавание образов для программистов


FFmpeg для Windows – создание своей Dll

Для того, чтобы использовать FFmpeg для Windows необходимо создать Dll, которая будет экспортировать ваши функции. Чтобы не усложнять задачу, я взял пример decoding_encoding.c, поставляемый вместе с библиотекой, выбрал оттуда функцию декодирования видео и создал собственную Dll.
Первое, что нужно сделать, это создать файл, который будет содержать экспортируемую функцию (-и). В нашем примере out_dll.c. И его содержимое представлено ниже.


( Читать дальше )

FFmpeg для Windows – лицензия и компиляция

Использование OpenCV предусматривает работу с видео файлами. Однако, что делать, если необходимо работать еще и со звуковой дорожкой в этом файле? В этом случае такое решение не подойдет. Есть вариант использовать FFmpeg для Windows. Но в этом случае для возможности использования LGPL лицензии необходимо соблюсти следующие правила (некоторые рекомендации – например, пункт 4):
1. Компилировать FFmpeg без "--enable-gpl" и без "--enable-nonfree".
2. Использование динамического связывания (в Windows это означает использование DLL) для связи с FFmpeg библиотеками.
3. Распространение исходного кода FFmpeg, независимо от того изменили вы его или нет.
4. Убедитесь в том, что исходный код в точности соответствует бинарным файлам, которые вы используете.
5. Выполните команду «Git diff> changes.diff» в корневом каталоге исходного кода FFmpeg, чтобы создать файл только с изменениями.
6. Объясните, как вы собрали FFmpeg, например, строка конфигурации в текстовом файле, добавляется в корневом каталоге исходного кода.
7. Использование tarball или zip файла для распространения исходного кода.
8. Разместите исходный код FFmpeg на одном веб-сервере, что двоичный код.
9. Добавьте «This software uses code of FFmpeg licensed under the LGPLv2.1 and its source can be downloaded here» на все страницы, где есть ссылка на ваше приложение.
10. Упоминание «This software uses libraries from the FFmpeg project under the LGPLv2.1» в окне «О программе» вашей программы.
11. Упоминание в лицензионном соглашении, что ваша программа использует FFmpeg под LGPLv2.1.
12. Если лицензионное соглашение утверждает право собственности на код, вы должны явно сказать, что вы не владеете FFmpeg, и где соответствующие владельцы могут быть найдены.
13. Удалите любые запрещения обратного инжиниринга с вашего лицензионного соглашения.
14. Примените те же изменения во всех переводах вашего лицензионного соглашения.
15. Не допускать ошибки в названии FFmpeg (двух прописные F и строчные «mpeg»).
16. Не переименовывайте FFmpeg библиотеки dll.
17. Go through all the items again for any LGPL external library you compiled into FFmpeg (for example LAME).
18. Убедитесь, что ваша программа не использует GPL библиотеки.


( Читать дальше )

Распознавание дорожных знаков (знак ограничения скорости)

Распознавание дорожных знаков является достаточно сложной задачей, если рассматривать распознавание в целом. Однако при рассмотрении отдельных типов знаков значительно упрощается. Здесь будет описан алгоритм распознавания знаков ограничения скорости. Для тестов было использовано 2 изображения.



( Читать дальше )

Распознавание лиц в OpenCV (facerec_demo.cpp)

В новой версии OpenCV появились алгоритмы распознавания лиц, и появился пример facerec_demo.cpp:

/*
 * Copyright © 2011. Philipp Wagner <bytefish[at]gmx[dot]de>.
 * Released to public domain under terms of the BSD Simplified license.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 *   * Redistributions of source code must retain the above copyright
 *     notice, this list of conditions and the following disclaimer.
 *   * Redistributions in binary form must reproduce the above copyright
 *     notice, this list of conditions and the following disclaimer in the
 *     documentation and/or other materials provided with the distribution.
 *   * Neither the name of the organization nor the names of its contributors
 *     may be used to endorse or promote products derived from this software
 *     without specific prior written permission.
 *
 *   See <http://www.opensource.org/licenses/bsd-license>
 */

#include "opencv2/opencv.hpp"

#include <iostream>
#include <fstream>
#include <sstream>

using namespace cv;
using namespace std;

Mat toGrayscale(InputArray _src) {
    Mat src = _src.getMat();
    // only allow one channel
    if(src.channels() != 1)
        CV_Error(CV_StsBadArg, "Only Matrices with one channel are supported");
    // create and return normalized image
    Mat dst;
    cv::normalize(_src, dst, 0, 255, NORM_MINMAX, CV_8UC1);
    return dst;
}


( Читать дальше )

OpenCV 2.4.1

Обычно я не слежу за новостями по выходу новых версий, но этот раз случайно обнаружил появление нового релиза. Интересным для меня в версии 2.4 стало появление нескольких алгоритмов распознавания лиц, которые постараюсь посмотреть. Ну а другие изменения вы можете посмотреть здесь:
http://code.opencv.org/projects/opencv/wiki/ChangeLog

Я скачал себе Windows версию http://sourceforge.net/projects/opencvlibrary/files/opencv-win/
Одним из первых визуальных отличий — это большой объем установки на жестком диске (почти 2.5 Гб). Это обусловлено тем, что разработчикам надоело нытье о необходимости перекомпиляций для 32-64 битных платформ, и различных версий компиляторов, поэтому сразу разместили *.lib и *.dll для всех версий. Причем динамические и статические. (Впрочем это возможно было и в 2.3 версии OpenCV, я ее не смотрел).
Для подключения библиотеки необходимо указать пути к нужной версии, например:
opencv\build\x86\vc9\lib\
opencv\build\x86\vc9\bin\
Ну, а если вы используете Debug Mode, то еще один путь:
opencv\build\common\tbb\ia32\vc9\

Особенности в OpenCV (cvFindCornerSubPix, cvGoodFeaturesToTrack, cvPreCornerDetect)

Описание нескольких функций, имеющих отношение к особенностям.

cvFindCornerSubPix
Уточняет местоположение углов.
void cvFindCornerSubPix(
	const CvArr* image,
	CvPoint2D32f* corners,
	int count,
	CvSize win,
	CvSize zero zone,
	CvTermCriteria criteria 
);

Параметры:
image – входное изображение;
corners – начальные координаты входных углов;
count – количество углов;
win – половина длины стороны окна поиск. Например, для win (5,5) окно поиска будет (5*2+1, 5*2+1) = (11, 11);
zone — половина размера мертвых регион в середине зоны поиска, над которой суммирование в формуле ниже не делается. Это иногда используется, чтобы избежать возможных особенностей автокорреляционной матрицы. Значение (-1, -1) означает, что нет такого размера.
criteria – критерий прекращения итерационного процесса утончения угла. Процесс прекращается или после достижения определенного количества итераций, или после достижения определенной точности. Можно использовать оба критерия.


( Читать дальше )

Особенности в OpenCV (cvCornerEigenValsAndVecs, cvCornerHarris, cvCornerMinEigenVal)

cvCornerEigenValsAndVecs

Вычисление собственных значений и собственных векторов блоков изображения для детектирования углов.
void cvCornerEigenValsAndVecs(
	const CvArr* image,
	CvArr* eigenvv,
	int blockSize,
	int aperture_size=3 
);


Параметры:
image – входное изображение;
eigenvv – изображение для хранения результатов. Оно должен быть в 6 раз шире, чем исходное изображение;
blockSize – размер соседства;
aperture_size – размер ядра в операторе Собела (подробнее смотрите cvSobel).

Для каждого пикселя функция считает соседство размером blockSize*blockSize. Вычисляется матрица ковариаций производных от соседства следующим образом:



( Читать дальше )

Функция сравнения регионов изображения cvMatchTemplate

void cvMatchTemplate(
	const CvArr* image,
	const CvArr* templ,
	CvArr* result,
	int method 
);

Параметры:
image – изображение, где будет осуществляться поиск (8 битное или 32-битное floating-point);
templ – искомый шаблон изображения, не больше чем image и того же типа;
result — карта результатов сравнения, одноканальный 32-битный массив с плавающей точкой. Если размеры image WxH, а templ wxh, то размер result (W-w+1)x(H-h+1);
method – метод сравнения шаблона.

Эта функция аналогична cvCalcBackProjectPatch. Она скользит по изображению, сравнивая перекрывающиеся участки размеров wxh с templ используя метод method, сохраняя результат в result. Ниже описаны формулы для сравнения (I – image, T – templ, R – result). Суммирование проводится по шаблону и/или по региону изображения по следующему пути: x' = 0..w-1, y' = 0..h-1.


( Читать дальше )

Выделение цвета кожи человека

Прочитал статью «A Real-Time Face Tracker» (http://www-prima.inrialpes.fr/perso/Tran/Documents/Articles/Divers/RTFaceTracker.pdf).
Вообще статья посвящена трекингу лица, однако меня она заинтересовала по другой причине – в ней представлена модель описания цвета кожи. Поэтому я опишу смысл этой модели.

Основная идея в том, что человек адаптируется к яркости изображения, и для того, чтобы распознать необходимо отбросить информацию о яркости. Используется понятие «чистого» цвета (хроматический), описанного в работе [G. Wyszecki and W.S. Styles. Color Science: Concepts and Methods, Quantitative Data and Formulae, Second Edition, John Wiley & Sons, New York, 1982].

«Чистый» цвет получается следующим образом:
r = R / (R + G + B),
g = G / (R + G + B).
Синий цвет лишний, поскольку после нормализации r+g+b =1.

При этом в данной работе было показано, что при использовании «чистого» цвета было определено, что кожа людей даже разной национальности находится в очень небольшом диапазоне по сравнению с ненормализованным цветом.


( Читать дальше )

Выделение контура лица после детектирования

Встроенные возможности OpenCV позволяют детектировать лицо, но при распознавании лиц может потребоваться более точное определение его границ. Метод выделения границ лица описан в проекте «Face detection and swap». Там расставлялись точки, называемые «щупами», которые сдвигались к лицу, пока не находился подходящий цвет лица, и движение не останавливалось. Расстановка «щупов» выглядела так:

Однако в данном примере у нас фон лица темный, что значительно облегчает задачу. Мы рассмотрим примеры с более недружелюбным фоном:



( Читать дальше )