Особенности в 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. Вычисляется матрица ковариаций производных от соседства следующим образом:



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

DataMatrix PC Scanner for Windows

Программа распознает DataMatrix код и с интервалом в 5 секунд эмулирует нажатие клавиш клавиатуры, передавая декодированную информацию (с символом конца строки в конце) в находящееся в фокусе окне. Ниже приведен пример работы программы с записью в «Блокнот», но это может быть и любая ваша программа, например, 1С.



Подробнее о программе вы можете почитать здесь:
http://intbusoft.com/rus/solutions/barcode/DataMatrixPCScanner/

Функция сравнения регионов изображения 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». Там расставлялись точки, называемые «щупами», которые сдвигались к лицу, пока не находился подходящий цвет лица, и движение не останавливалось. Расстановка «щупов» выглядела так:

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



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

Создание контура из точек

Однажды мне понадобилось создать контур из точек, но к сожалению обычно добавление к последовательности cvSeqPush здесь не сработало. После некоторого использования Google решение было найдено, привожу его, дабы другие не тратили время на подобные вещи:
CvPoint * Points;  
Points = new CvPoint[<Количество элементов>]; 
...Заполнение точек
CvContour contour;   
CvSeqBlock contour_block;  
cvMakeSeqHeaderForArray(CV_SEQ_POLYGON, sizeof(CvContour),sizeof(CvPoint),
                        Points, <Количество элементов>, (CvSeq*)&contour, &contour_block); 
CvSeq* seq = (CvSeq*)&contour;

После это с seq можно работать как с обычным контуром.

Новый тип оптических маркеров Aztec Marker

Использование оптических маркеров для трекинга не является чем-то новым, и на настоящий момент существует ряд разработок в этой области. Наиболее известные технологии – это ARToolKit и ARTag. Однако у данных технологий есть определенные недостатки, например обязательное отсутствие шума по краям. У многих разработчиков возникала идея: «а может использовать в качестве маркеров хорошо детектируемые и хорошо зарекомендовавшие себя коды, ну, например, QR Code или Aztec (Small Aztec) Code». Пример такого маркера получил название Aztec Marker, о его структуре подробнее можно почитать здесь.
Там же вы можете скачать исходный код для кодирования и декодирования маркеров.


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

Бесплатная библиотека для кодирования кодов DataMatrix

Бесплатную библиотеку для кодирования кодов DataMatrix в ОС Windows можно скачать здесь: http://intbusoft.com/download/products/DataMatrixEncodeSDK.zip
Пользоваться ей очень просто. Динамически подключаем к программе и распространяем (БЕСПЛАТНО) со своим программным продуктом.
Пример использования функции:
long s=10000000;
BYTE* out_bitmap=new BYTE[s];
lstrcpy(buf,"Hello World!!! And 1234567890");
if (EncodeDataMatrix(buf,strlen(buf),out_bitmap,&s,4,0,5,0)!=0)
{
    printf("Encoding error!");
    delete out_bitmap;
    return 5;
}



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