Обработка одномерных сигналов в 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);


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

Удлиненные оптические маркеры 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;
	  }



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