Обучение каскадного классификатора

Работа с каскадным классификатором включает два этапа: обучение и детектирование. Детектирование вы можете посмотреть, к примеру, на обнаружении лиц. А здесь описано как обучать классификатор.

В OpenCV есть два приложения для тренировки каскадов: opencv_haartraining и opencv_traincascade (новая версия написанная на C++). Но главное различие между этими двумя приложениями является то, что opencv_traincascade поддерживает как Хаара[Paul Viola, Michael Jones. Rapid Object Detection using a Boosted Cascade of Simple Features. Conference on Computer Vision and Pattern Recognition (CVPR), 2001, pp. 511-518.], так и LBP [Shengcai Liao, Xiangxin Zhu, Zhen Lei, Lun Zhang and Stan Z. Li. Learning Multi-scale Block Local Binary Patterns for Face Recognition. International Conference on Biometrics (ICB), 2007, pp. 828-837.] особенности. LBP с точки зрения, как обучения, так и детектирования в несколько раз быстрее Хаара. Что касается достоверности распознавания, то все зависит от обучающей выборки. Можно обучить LBP так, что оно будет приближаться к Хаара особенностям.
opencv_traincascade и opencv_haartraining хранят обученные классификаторы в различных форматах. Новый интерфейс обнаружения (CascadeClassifier класса в objdetect модуле) поддерживают оба формата. opencv_traincascade может сохранять обучение каскада в старом формате. Но opencv_traincascade и opencv_haartraining не может загрузить классификатор в другом формате для дальнейшего обучения после перерыва.
opencv_traincascade приложение может использовать TBB для многопоточности. Чтобы использовать его в режиме многоядерных процессоров OpenCV должно быть откомпилировано с TBB.
Другие утилиты, используемые для обучения:
1. opencv_createsamples используется для подготовки учебного набора положительных и тестовых образцов в формате, который поддерживается как opencv_haartraining так и opencv_traincascade приложениями. На выходе получается файл с расширением *.vec, это двоичный формат, который содержит изображение.
2. opencv_performance может быть использовано для оценки качества классификаторов, но только для обученных opencv_haartraining. Она использует коллекцию размеченных изображений, запускает классификатор и сообщает так называемую производительность, т.е. количество найденных объектов, количество пропущенных объектов, количество ложных срабатываний и другую информацию.


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

Онлайн распознавание баркодов

с использованием библиотеки Zxing от Google. Поддержка кодов: QR code, UPC-A and UPC-E, EAN-8 and EAN-13, Code 39, Code 93, Code 128, ITF, Codabar, RSS-14, RSS Expanded.

http://intbusoft.com/online/barcode/

Особенности программирования систем распознавания образов реального времени

Системы распознавания образов (СРО) на настоящий момент находят все больше применения в промышленности, торговле, бизнесе и повседневной жизни. Огромное число компаний связывают свою деятельность с разработкой СРО реального времени (РВ) для персональных компьютеров, серверов, мобильных платформ и онлайн-сервисов. Большое количество отечественных и зарубежных ученых разрабатывают новые алгоритмы распознавания РВ, применяя при этом современные языки и среды программирования, зачастую не обращая внимания на тот факт, что система РВ – это прежде всего предсказуемая система. Поэтому в данной работе предлагается подход к программированию СРО РВ на языке C/C++ на платформе Windows XP/7.
В настоящее время при разработке сложных СРО РВ часто используют программную библиотеку OpenCV (opencv.willowgarage.com), которая может функционировать на различных платформах и операционных системах. Множество задач связано с обработкой видеопотоков, например, с web-камеры. В этом случае программный код библиотеки OpenCV выглядит следующим образом:
#include "opencv2/core/core_c.h"
#include "opencv2/imgproc/imgproc_c.h"
#include "opencv2/highgui/highgui_c.h"
int main(int argc, char** argv){
	CvCapture* capture = cvCaptureFromCAM(0);
	cvNamedWindow( "Camera", 1 );
	IplImage* frame=0;
	do{
		frame = cvQueryFrame(capture );
		…<Какая-либо функция распознавания>
		cvShowImage( "Camera", frame);
		if (cvWaitKey( 20 ) == 32 ) break;
	}while ( 1 );
	cvReleaseCapture(&capture);
	return 0;
}

Однако здесь возникают вопросы: Как контролировать время выполнения функции распознавания? Что делать, если модуль распознавания образов ненадежен – а это часто бывает из-за высокой сложности алгоритмов распознавания. В этом случае можно использовать подход к выбору структуры СРО РВ, описанный в работе [Кручинин, А.Ю. Особенности разработки программных систем распознавания образов реального времени / А.Ю. Кручинин // Автоматизация в промышленности. – 2011. — №7. – С. 53-56.].


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

Обработка одномерных сигналов в OpenCV (Smooth, Dilate, Morphology)

При использовании OpenCV в основном дело имеется с двумерными сигналами – т.е. изображениями. Однако функции OpenCV не меньше помогут и при анализе одномерных сигналов. Пусть есть следующий сигнал:

Необходимо вычислить края впадины.


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

Вывод русского текста на картинку OpenCV в Windows при помощи HBITMAP

Если мы хотим вывести русский текст с произвольным шрифтом на картинку OpenCV или воспользоваться другими функциями GDI, то можно использовать для этого HBITMAP. Ниже рассмотрен пример вывода текста на русском языке, результат которого дает следующее:



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

Направление и сила смещения изображения с помощью OpenCV

Когда камера движется на каком-либо объекте, то важно определить направление движения. В этом случае можно использовать следующую функцию в OpenCV.

phaseCorrelate
Функция используется для определения сдвигов между двумя изображениями (массивами). Теорию по данному вопросу можно взять здесь http://en.wikipedia.org/wiki/Phase_correlation. C++ синтаксис:
Point2d phaseCorrelate(
InputArray src1, 
InputArray src2, 
InputArray window=noArray(), 
double* response=0
)

Параметры:


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

Распознавание дорожных знаков

Тест с распознаванием знака скорости и пешеходного перехода

Компиляция GD под Windows только для работы с GIF

OpenCV не поддерживает GIF файлы, поэтому если вы хотите добавить поддержку, то можно подключить другую библиотеку, например GD (https://bitbucket.org/pierrejoye/gd-libgd). Поставим условия: необходимо откомпилировать библиотеку только с поддержкой GIF с минимальным размером.
1. Качаем последнюю версию библиотеку (у меня было от 17.06.2011).
2. Запускаем CMake версии не ниже 2.4. и конфигурируем.



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

Новое видео с примером трекинга лица

Трекинг лица — тесты с детектированием бровей и рта

kmeans сегментация в OpenCV

Известен подход к сегментации с использованием алгоритма kmeans, и я тоже решил его попробовать. Материал нашел здесь.
Переделал код под версию 2.4.1, который вы можете видеть ниже
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/core/core.hpp"
#include "opencv2/imgproc/imgproc.hpp"

#include <iostream>

using namespace cv;
using namespace std;

int main() 
{
    Mat src = imread("lena.jpg");
    imshow("original", src);

    // Размытие
    blur(src, src, Size(15,15));	
    imshow("blurred", src);

    Mat p = Mat::zeros(src.cols*src.rows, 5, CV_32F);
    Mat bestLabels, centers, clustered;

    // Перевод в нужный формат
    vector<Mat> bgr(3);
    split(src, bgr);    
    for(int i=0; i<src.cols*src.rows; i++) {
        p.at<float>(i,0) = (i/src.cols) / src.rows;
        p.at<float>(i,1) = (i%src.cols) / src.cols;
        p.at<float>(i,2) = bgr[0].data[i] / 255.0;
        p.at<float>(i,3) = bgr[1].data[i] / 255.0;
        p.at<float>(i,4) = bgr[2].data[i] / 255.0;
    }

    // Kmeans в действии
    int K = 8;
    cv::kmeans(p, K, bestLabels,
            TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0),
            3, KMEANS_PP_CENTERS);


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