Вывод русского текста на картинку 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);


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

Удлиненные оптические маркеры Aztec Marker

И снова об оптических маркерах. Удлиненный вариант.



Подробнее...

Метод k-средних в OpenCV

k-means (метод k-средних) – алгоритм кластеризации. Суть в том, что в группе данных найти скопления («кластеры»). Пользователь устанавливает количество кластеров, а алгоритм находит лучшие места для них.
Алгоритм работает следующим образом.
1. Входные данные: (а) набор данных; (б) количество кластеров.
2. Случайно назначаем позиции кластеров.
3. Связываем каждую точку данных с ближайшим центром.
4. Перемещение центра кластера в позицию «центра тяжести».
5. Возврат к шагу 3 до тех пор, пока на шаге 4 не будет изменений.
Не смотря на то, что данный алгоритм является эффективным, у него есть три проблемы:
1. Не гарантируется, что найдется оптимальное местоположение кластеров, однако гарантируется сходимость алгоритма (нет бесконечного движения центров).
2. Метод k-средних не скажет нам, какое оптимальное количество кластеров – их необходимо устанавливать самостоятельно.
3. Метод k-средних предполагает, что ковариация в пространстве или не имеет значения, или данные уже нормализованы.

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

Цветовая сегментация изображений

Технология цветовой сегментации известна достаточно давно и описана во всех учебниках. Рассмотрим на примере метода «чистого» цвета, описанного здесь. Для того, чтобы делать сегментацию – построим карту цветов. Поскольку используем только два цвета, а яркость в расчет не берем, то у нас получается двумерная карта цвета, которую можно представить, например, в виде изображения 256 на 256 пикселей. Карту цвета построим таким образом:
for(i=0;i<img->height;i++)
	  for(j=0;j<img->width;j++)
	  {
		   k=(ptr[i*img->widthStep+j*3]+ptr[i*img->widthStep+j*3+1]+ptr[i*img->widthStep+j*3+2]);
		   if (k!=0) Color1_=int((double)256*ptr[i*img->widthStep+j*3]/k);
		   else Color1_ = 0;
		   if (Color1_>255) Color1_=255;			   
		   if (k!=0) Color2_=int((double)256*ptr[i*img->widthStep+j*3+1]/k);
		   else Color2_ = 0;
		   if (Color2_>255) Color2_=255;
		   m[Color2_+Color1_*256]++;
	  }

И выведем все это на изображение.
for(i=0;i<256;i++)
	  for(j=0;j<256;j++)
	  {
		   k=int((double)256*sqrt(sqrt((double)m[i*256+j]/max)));
		   if (k>255) k=255;
		   //if (m[i*256+j]>0) k = 255;
		   ptr2[i*Gray->widthStep+j]=k;
	  }



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

Автоматическая внешняя калибровка камер на основе анализа траекторий движений объектов

1. Введение. Всеобщей тенденцией в развитии систем видеонаблюдения является разработка алгоритмов трекинга (слежения за объектами), которые очень важны в местах скопления людей и автомобилей, таких, как аэропорты, улицы города, автопарковки и т.д. Важным вопросом при проектировании алгоритмов трекинга является внешняя калибровка камер, т.е. определение под каким углом расположены камеры в реальном пространстве. Вопросам внешней калибровки камер, уделено внимание в некоторых публикациях, например, в [1, 2]. В ряде публикаций освещены подходы к внешней калибровки камер по входному изображению и известной геометрии рассматриваемых объектов с выделением проблем: PnP, PnL, PnA [3]. Однако данные подходы невозможно использовать для автоматической внешней калибровки камер, когда направления камер определяются по мере поступления данных из окружающего мира. В данной работе предлагается подход к автоматической внешней калибровке камер, в котором участие человека сводится к минимуму.
В большинстве случаев примерное расположение (координаты) камер в пространстве известно. Приняв к сведению эту информацию, можно значительно упростить калибровку камер. Пользователям систем видеонаблюдения хотелось бы, чтобы внешняя калибровка осуществлялась автоматически, например, в процессе того, как какие-либо объекты перемещались внутри системы, а система видеонаблюдения сама корректировала и определяла направления камер.

2. Постановка задачи. Есть N > 1 камер с известными координатами в пространстве (здесь и далее будем понимать под координатами, только координаты X и Y без высоты). Камеры работают в приблизительно одинаковых режимах: частота кадров, разрешение. Области зрения M камер (2 ≤ M ≤ N) пересекаются друг с другом, например, попарно. В областях зрения камер происходит перемещение объектов, причем в системе видеонаблюдения может находиться несколько объектов. Необходимо определить углы поворота максимально возможного количества камер. На вход поступают видеопотоки с камер и их координаты в пространстве. На выходе должен быть такой результат калибровки, что для каждой камеры присутствует следующая информация:
• наиболее вероятный угол поворота (или неопределенный);
• наличие пересечений области зрения камеры с областями зрения других камер;
• возможные переходы объектов из области зрения камеры в области зрения других камер.


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