Recog.ru - Распознавание образов для программистов


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

Встроенные возможности 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"


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

cvDecodeImage

Предположим у вас есть загруженный в память каким-то образом графический файл, например, формата JPEG. И вам его надо открыть в OpenCV, однако документирована только функция cvLoadImage, которая позволяет загружать из файла. Можно конечно создать файл в памяти, но это не нужно, поскольку в OpenCV есть полезная недокументированная функция cvDecodeImage. На ряде Интернет-ресурсов, в том числе и на русских, уже есть достаточно давно описание использования этой функции, но я решил привести здесь пример использования этой функции, поскольку мне например не сразу стало понятно, как ее использовать и безопасно ли делать это, раз она недокументирована.

IplImage* cvDecodeImage( const CvMat* _buf, int iscolor );

Формат такой же, как у cvLoadImage, за исключением того, что передается не имя файла, а указатель на данные в памяти. Однако перед тем, как использовать данную функцию я решил посмотреть ее в исходниках.


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

VidikonReader 1.11

Новая версия доступна для скачивания. Добавлена консоль.


Перейти к странице загрузки

Определение неправомерной вставки дополнительных кадров в видеопоток

Предположим, вы разрабатываете какую-нибудь технологию обработки видео информации, поступающей с видеокамеры в реальном времени. Технология готова, но как защитить ее? Вы хотите, чтобы пользователь мог выбрать варианты покупки вашего SDK для одной камеры, двух, трех и т.д. Конечно, нет проблем, если взаимодействие с видео вы встраиваете в SDK, но если такой возможности нет? В таком случае можно анализировать последовательность кадров, чтобы определить, принадлежат ли кадры текущему видеопотоку или нет. Данную возможность можно реализовать, используя реализованную в OpenCV технологию отличий. При реализации примера будем иметь в виду, что камера неподвижна и однонаправлена.
Поскольку неизвестно, как будет подделываться видеопоток (после каждого кадра или после последовательности кадров), то нельзя заниматься сравнением только последовательных кадров. Но можно чередовать сравнения, например один кадр – сравниваем с предыдущем, второй – с 5 кадром перед этим и т.п. После нахождения отличий можно посчитать процент измененного изображения и суммировать результат в единицу времени.


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