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


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) пересекаются друг с другом, например, попарно. В областях зрения камер происходит перемещение объектов, причем в системе видеонаблюдения может находиться несколько объектов. Необходимо определить углы поворота максимально возможного количества камер. На вход поступают видеопотоки с камер и их координаты в пространстве. На выходе должен быть такой результат калибровки, что для каждой камеры присутствует следующая информация:
• наиболее вероятный угол поворота (или неопределенный);
• наличие пересечений области зрения камеры с областями зрения других камер;
• возможные переходы объектов из области зрения камеры в области зрения других камер.


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

OpenCV 2.4.2


Новая версия, изменения:
1. Новая модель распространения библиотеки для Android
2. Новые особенности FREAK, которые по утверждению разработчиков превосходят ORB и SURF.
3. Улучшенное распознавание лиц и его описание.
4. opencv2.framework для iOS.
5. Исправлено 50 багов предыдущей версии.
6. Новый сайт для пользователей http://opencv.org
7. Оптимизация модулей для CUDA GPU.
http://code.opencv.org/projects/opencv/wiki/ChangeLog

Чтение и запись видеофреймов с помощью Dll FFmpeg

Пользуясь описанием http://recog.ru/blog/ffmpeg/67.html и http://recog.ru/blog/ffmpeg/66.html можно создать библиотеку Dll с нужными функциями. Для начала мы попробуем как записывать и читать видеофреймы, а для этого используем наработки из OpenCV. Для этого при компиляции нам необходимо будет включить код из файлов OpenCV:
cap_ffmpeg_impl.hpp
cap_ffmpeg_api.hpp
ffmpeg_codecs.hpp
А откомпилировать можно примерно так:
set path=C:\MinGW\bin;%path% & gcc -Wall -shared -o ffmpeg.dll -O2 -x c++ -I../include out_dll.c -L../lib -lavformat -lavcodec -lavdevice -lswscale -lavutil -lwsock32


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

Детектирование 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);



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

FFmpeg для Windows – создание своей Dll

Для того, чтобы использовать FFmpeg для Windows необходимо создать Dll, которая будет экспортировать ваши функции. Чтобы не усложнять задачу, я взял пример decoding_encoding.c, поставляемый вместе с библиотекой, выбрал оттуда функцию декодирования видео и создал собственную Dll.
Первое, что нужно сделать, это создать файл, который будет содержать экспортируемую функцию (-и). В нашем примере out_dll.c. И его содержимое представлено ниже.


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

FFmpeg для Windows – лицензия и компиляция

Использование OpenCV предусматривает работу с видео файлами. Однако, что делать, если необходимо работать еще и со звуковой дорожкой в этом файле? В этом случае такое решение не подойдет. Есть вариант использовать FFmpeg для Windows. Но в этом случае для возможности использования LGPL лицензии необходимо соблюсти следующие правила (некоторые рекомендации – например, пункт 4):
1. Компилировать FFmpeg без "--enable-gpl" и без "--enable-nonfree".
2. Использование динамического связывания (в Windows это означает использование DLL) для связи с FFmpeg библиотеками.
3. Распространение исходного кода FFmpeg, независимо от того изменили вы его или нет.
4. Убедитесь в том, что исходный код в точности соответствует бинарным файлам, которые вы используете.
5. Выполните команду «Git diff> changes.diff» в корневом каталоге исходного кода FFmpeg, чтобы создать файл только с изменениями.
6. Объясните, как вы собрали FFmpeg, например, строка конфигурации в текстовом файле, добавляется в корневом каталоге исходного кода.
7. Использование tarball или zip файла для распространения исходного кода.
8. Разместите исходный код FFmpeg на одном веб-сервере, что двоичный код.
9. Добавьте «This software uses code of FFmpeg licensed under the LGPLv2.1 and its source can be downloaded here» на все страницы, где есть ссылка на ваше приложение.
10. Упоминание «This software uses libraries from the FFmpeg project under the LGPLv2.1» в окне «О программе» вашей программы.
11. Упоминание в лицензионном соглашении, что ваша программа использует FFmpeg под LGPLv2.1.
12. Если лицензионное соглашение утверждает право собственности на код, вы должны явно сказать, что вы не владеете FFmpeg, и где соответствующие владельцы могут быть найдены.
13. Удалите любые запрещения обратного инжиниринга с вашего лицензионного соглашения.
14. Примените те же изменения во всех переводах вашего лицензионного соглашения.
15. Не допускать ошибки в названии FFmpeg (двух прописные F и строчные «mpeg»).
16. Не переименовывайте FFmpeg библиотеки dll.
17. Go through all the items again for any LGPL external library you compiled into FFmpeg (for example LAME).
18. Убедитесь, что ваша программа не использует GPL библиотеки.


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