Особенности в 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;
}



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

Вырезка части кода OpenCV для вставки в свой проект

Поскольку лицензией OpenCV является BSD, то мы можем делать с ней все, что захотим. Например, вырезать из неё какие-то части, чтобы вставлять в свой проект. Конечно, кто-то пытается сделать собственные библиотеки (этого не избежал и я – библиотека ImagePak), это помогает разобраться в предмете, но зачем изобретать велосипед и многие функции, которые на высоком уровне качества и быстродействия реализованы в свободно распространяемой библиотеке. Поставим задачу: необходимо использовать OpenCV-шные функции по переводу изображения в монохромное в своем проекте для Windows. На самом деле наверняка понадобится значительно больше, но не в этом вопрос. Я буду использовать версию 2.2 (просто лень ставить новую). Нам понадобятся поддержка модулей core и imgproc. Не долго думая, создаем папку opencv_ и копируем туда полностью эти модули. Создаем обычный консольный проект в VisualStudio и подключаем туда все файлы из этих модулей. Создаем main.cpp, в котором кроме функции main() ничего нет. Перед тем как пытаться скомпилировать перепишем пути include в файлах precomp.hpp обоих модулей и в других модулях, где происходит обращение к *.h файлам, чтобы мы уж точно с нашими файлами работали. Например, следующим образом:

#include "opencv_/modules/imgproc/include/opencv2/imgproc/imgproc.hpp"
#include "opencv_/modules/imgproc/include/opencv2/imgproc/imgproc_c.h"
#include "opencv_/modules/core/include/opencv2/core/internal.hpp"


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