Пример iANPRcapture_motion на C# для iANPR SDK

1 О предназначении программы

Программа iANPRcapture_motion_CShrp предназначена для демонстрации возможностей iANPR SDK в вычислении траектории движения автомобильного номера и детектирования пересечения номером заранее заданных линий, т.е. для демонстрации возможности реализации функционала детектирования въезда-выезда автомобилей с помощью iANPR SDK. Эта программа написана на языке C# и является аналогом программы iANPRcapture_motion, написанной на языке С++. Эти и другие примеры использования распространяются в составе iANPR SDK.

2 Пример использования

Пример работы программы показан в следующем ролике.




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

Фильтр Калмана

Фи́льтр Ка́лмана — эффективный рекурсивный фильтр, оценивающий вектор состояния динамической системы, используя ряд неполных и зашумленных измерений. Назван в честь Рудольфа Калмана.
В процессе анализа и обработке большого количества числовых данных, непременно возникают проблемы связанные с точностью обрабатываемой информации. Это значит, что какие бы это не были данные они имеют ошибки, связанные с погрешностью прибора, с помощью которого получается данная информация, или это кратковременный сбой, который привел к получению неточных данных. Так или иначе с этими неприятностями надо как то бороться. На помощь приходит очень полезный для данной цели алгоритм фильтра, построенный на основании метода Калмана.


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

LiveCD linux дистрибутив для работы с opencv

За исходный дистрибутив был взят Mint 15 (x86).
Данный способ подойдет многим deb дистрибутивам.


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

Детектирование автомобильных номеров в OpenCV на основе контурного анализа

В Интернете встречаются статьи посвященные детектированию и распознаванию автомобильных номеров. Некоторые используют машинное обучение для того, чтобы обучить компьютер детектировать номер по типу алгоритма Виолы-Джонса. Качество и скорость работы алгоритмов оставляют желать лучшего и авторы справедливо замечают, что нужно более лучшее обучение. Несмотря на то, что машинное обучение, конечно, является важной и значимой частью распознавания образов, применять его нужно с умом. Прежде всего нужно оценить, а какие признаки характеризуют объект распознавания. Понятно, что в большинстве случаев автомобильный номер характеризуется рамкой, ограничивающей номер. Поэтому первой напрашивается идея о том, что выделить контуры-кандидаты на распознавание, которые подходят по размерам.
Для этого можно написать простейшую функцию:



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

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);


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

Детектирование Aztec кода с помощью средств OpenCV

В данном посте было показано, как детектировать QR код с помощью средств OpenCV. В данном случае речь пойдет о кодах Aztec и Small Aztec (http://recog.ru/blog/standarts/6.html). Для детектирования кода можно использовать контурный анализ.
1. Необходимо бинаризовать изображение с помощью cvThreshold или cvAdaptiveThreshold.
2. В бинаризованном изображении найти контуры:
IplImage* Temp=cvCreateImage(cvGetSize(Image),8,1);
cvCopy(Binary,Temp);
cvFindContours( Temp, storage, &contours, sizeof(CvContour),CV_RETR_LIST  , CV_CHAIN_APPROX_SIMPLE, cvPoint(0,0) );
contours = cvApproxPoly( contours, sizeof(CvContour), storage,CV_POLY_APPROX_DP, 5, 1 );
cvReleaseImage(&Temp);



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

Вырезка части кода 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"


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

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

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


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

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

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



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

Работа с XML/YAML в OpenCV

Сохранение и работа с форматами XML и YAML является одной из встроенных возможностей OpenCV.

CvFileStorage
typedef struct CvFileStorage{
… // hidden fields
} CvFileStorage;


Структура CvFileStorage – это «черный ящик», представляющий собой хранилище, связанное с файлом на диске. Есть несколько функций, которые позволяют загружать и сохранять иерархические коллекции, которые состоят из скалярных значений, стандартных CXCore объектов и объектов, определенных пользователем.
CXCore может читать и записывать данные в формате XML (http://www.w3c.org/XML) или YAML (http://www.yaml.org). Ниже представлен пример из документации OpenCV сохранения единичной матрицы 3x3 в XML и YAML.


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