Трекинг объектов.
#122
Отправлено 28 Июнь 2012 - 01:06
mrgloom (28 Июнь 2012 - 07:58 ):
а сегодня я реализовал трекер следующего плана:
1) выделяю передний план гауссиановым микшером
ПЕРВЫЙ КАДР
2) выделяю все контуры (описываю каждый из найденных ПРЯМОУГОЛЬНИКОМ)
3) регистрирую их (в первый раз), т.е. координаты центров масс сую в массив
ВТОРОЙ ПЛЮС КАДР
4) выделяю все контуры
5) если контур очень далеко находится от всех ранее зарегистрированных контуров то регистрирую его как новый контур
6) к кому ближе контур находится из ранее зарегистрированных соответственно тому я и присваиваю его новое значение (критерий наименьшего расстояния)
7) таким образом у меня есть три типа объектов
новые объекты - те у которых есть новая координата , но нет предыдущей
продолжающие - те у кого есть и старая и новая координата, получается трек
удаляемые - те у кого новой координаты нет а старая есть
на этом принципе построил трекер - и очень хорошо подходит для 1 человека который ходит туда сюда через проход. 2 человека не определит так как прямоугольники сольются и 2 разных объекта будут считаться как за один ... вот
p.s
дальнейшие планы : посмотреть трекер который мне прислал уважаемый mrgloom, и то что ранее было в этой теме.
С blob_track до сих пор как то не очень разобрался, но постараюсь.
#123
Отправлено 02 Июль 2012 - 11:25
Ну во-первых, это не трекер. Суть его программы в том, что он
1. фотографирует фон
2. вычитает из фона текущее изображение, получает передний план
3. разбивает на квадратики все изображение, и каждой компактной области дает свой порядковый номер.
И это происходит на каждом кадре, как же он определяет что
1) первая область действительно передвигается на то место а не на другое. то есть нет связи никакой между предыдущим и текущим положением
2) если два объекта в обнимку пойдут, то он их определит как за один.
Дабы не занимать много места кодом я свою программу, которую описал в предыдущем посте прикрепляю в виде текстового документа сюда (в архиве docx).
Я остановился на проблеме разделения двух объектов. Вот идут два человека в обнимку, как их разделить друг от друга. Или например шли два человека друг навстречу другу, а потом пересеклись - как понять что это два человека а не один толстый? Или один перегораживает другого...
Какие функции можно использовать?
Пример который в OpenCv blob tracks я не понимаю, кто нибудь может мне объяснить? как он работает?
Прикрепленные файлы
-
КОД2 - ТРЕКИНГ ПРЯМОУГОЛЬНИКОВ.rar (29,53К)
Количество загрузок: 16 -
1111.JPG (47,45К)
Количество загрузок: 19 -
2222.JPG (42,79К)
Количество загрузок: 17
#124
Отправлено 02 Июль 2012 - 12:02
Прикрепленные файлы
-
блобтрек.JPG (122,82К)
Количество загрузок: 10
#125
Отправлено 02 Июль 2012 - 12:46
Цитата
очевидно, что никак, если мы не знаем, что ищем людей, т.е. не определили, что такое человек и не обучили программу.
есть вроде какие то наработки по поиску людей по туловищу или отдельных частей тел.
вот тут посмотрите
http://graphics.cs.m...elearning/hough
http://www.vision.ee...rest/index.html
есть еще подход типа bag of words\bag of features, т.е. типа если мы нашли нос и руку(утрированно), то можно с какой то % вероятностью сказать, что это человек.
если такие как у вас картинки, то можно по головам.
с какой версии блобтрэк? раньше помоему простой был всего лишь по цвету.
#126
Отправлено 02 Июль 2012 - 01:09
mrgloom (02 Июль 2012 - 12:46 ):
Версия OpenCV 2.1. Первый Вопрос в том, что означают все параметры которые спрашивает данная программа? Мне бы источник какой нибудь где толково написано или чтоб вы мне пояснили каждый параметр.
mrgloom (02 Июль 2012 - 12:46 ):
mrgloom, вся проблема в том, что я не знаю пошаговый алгоритм нахождения руки или носа или головы. Вы мне функции, примеры кода покажите, короче второй вопрос скажите как это можно сделать.
#127
Отправлено 02 Июль 2012 - 02:23
http://opencv.willow...deoSurveillance
вот тут более менее описаны параметры, за остальным надо либо смотреть комментарии в коде(аля "Adaptive background mixture models for real-time tracking. CVPR1999" ) и гуглить по названиям алгоритмов и пейперов.
ну и крутить параметры-экспериментировать.
http://graphics.cs.m...elearning/hough
тут есть и датасет, сорцы, пейпер и даже видеолекция-презентация.
Цитата
возможно стоит погуглить на тему pedestrian detection\people detection
вот тут вроде есть программа http://www.vision.ee...e/code/ism.html
по этим материалам
http://www.vision.ee...apers/pubs.html
видимо есть еще вариант загорожденного за человека не считать

вот еще какой то проект, но вроде не особо интересный.
http://code.google.c...eature-tracker/
#128
Отправлено 03 Июль 2012 - 07:26
тема на форуме "Находим в кадре лица, человеческие фигуры, и т.д. и т.п"
один маленький вопрос пока - с помощью всех вот этих классификаторов реально распознать человеческую макушку??? у меня люди под камерой ходят и весь рост у них не видно, лица не видно, только верхушку головы (см фотки в предыдущем моем посте)
#130
Отправлено 03 Июль 2012 - 10:48
http://www.vision.ee...ijcv07final.pdf
про стандартный HOG
http://www.cs.brown....s_cvpr_2005.pdf
и еще
http://www.mmp.rwth-...lter-iccv09.pdf
#131
Отправлено 03 Июль 2012 - 01:21
но хотелось бы не просто статей а кода, например может у кого есть код реализации hog с комментариями?
из всех методов которые можно использовать для проблемы разделения людей я выделил следующие
1) grab_cut алгоритм сегментации служащий для выделения одинаковых областей. недостаток в том. что у человека рубашка одного цвета а волосы другого
2) HOG или гистограммы градиента, к сожалению у меня нет примера кода который реализовывал бы это
3) HAFF and CANNY т.е преобразование хафа для окружностей для выделения макушек голов. я попробовал и как обычно преобразование хафа дало кучу окружностей, которые даже если и держались на моей голове то недолго. я пока еще ни разу не видел чтоб из обыкновенной картинки преобразования хафа чистенько без всяких левых окружностей выделили то что надо
4) метод на оптическом потоке farnerback , то есть сегментировать картинку на однородность векторов скорости. мне кажется если два человека будут идти с одной скоростью или людей будет много то метод будет давать кучу ошибок.
про классификаторы я думаю не стоит говорить в моей задаче они не подойдут потому что
1) медленные
2) я не понимаю что классифицировать кроме голов людей или их туловищ (вид сверху)
ПОЭТОМУ
давайте про hog поговорим. Я думаю это реальный способ разрешить проблему трекинга. по этой ссылке я увидел что оказывается в opencv все реализовано уже для того чтобы быстро присобачить этот метод в программу. даже класс есть
HOGDescriptor hog; hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector());
http://stackoverflow...etection-opencv
еще коды нужны или инфа где прочитать про реализацию hog в opencv
#132
Отправлено 03 Июль 2012 - 01:47
насчет блобов ВЕЛИКОЛЕПНО написано в E:\OpenCV2.1\doc\vidsurv (на всяк случай прикрепляю сюда)
все классы, че каждый класс делает, какие надо объекты и переменные сувать.
А вот и код HOG отлично !!! "ларчик просто открывался..."
https://code.ros.org...ct.cpp?rev=2314
Прикрепленные файлы
-
Blob_Tracking_Modules.doc (282,5К)
Количество загрузок: 14 -
Blob_Tracking_Tests.doc (168К)
Количество загрузок: 9
#133
Отправлено 03 Июль 2012 - 04:26
Процедура в предыдущей ссылке описана:
Цитата
Также нужно подготовить изображения на которых нет объектов интереса (отрицательные образцы)
Шаг 2) Найти HOG-признаки образцов и обучить SVM классификатор (который так-же есть в OpenCV)
Шаг 3) Использовать коэффициенты обученной SVM-ки в методе HOGDescriptor::setSVMDetector().
Вопрос - кто-нибудь это пробовал?
Что там с точностью получается?
Если никто не пробовал, то сам попробую
UPD: Еще бумажку подкину http://limin81.cn/li...amera_ready.pdf
Соорудил код, считающий дескрипторы для изображения.
Снабдил описанием, того что понял.
#include "opencv2/core/gpumat.hpp"
#include "opencv2/core/opengl_interop.hpp"
#include "opencv2/gpu/gpu.hpp"
#include "opencv2/ml/ml.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/contrib/contrib.hpp"
#include "opencv2/video/tracking.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/objdetect/objdetect.hpp"
using namespace std;
using namespace cv;
using namespace cv::gpu;
// -----------------------------------------------------------------
// MAIN
// -----------------------------------------------------------------
// http://experienceopencv.blogspot.com/2011/02/hog-descriptor.html
// Каждый вектор признаков вычисляется по содержимому скользящего по
// изображению окна размером 64x128 пикселей (128 высота 64 ширина - пропорции объекта).
// Каждый элемент вектора, это гистограмма ориентаций градиентов (9 столбцов в интервале 0-180 градусов,
// направления с разными знаками, считаются совпадающими).
// Гистограмма собирается в ячейке 8x8 пикселей.
// Контрастность нормализуется локально по блокам 2x2 ячейки (16x16 пикселей).
// Нормализация является важным этапом.
// Блок перемещается шагами по 8-пикселей (половина размера блока).
// Соответственно каждая ячейка учитывается в 4 различных блоках.
// В качестве классификатора применяется машина опрных векторов (SVM) с линейным ядром .
// Выходом обучнной SVM является множество коэффициентов для каждого элемента вектора признаков.
// 'hitThreshold' аргумент должен быть отрицательным.
// 'winStride' аргумент (по умолчанию 8x8) - как окно сканирует входное изображение (шаг по x и y).
// detectMultiScale() аргумент
// 'groupThreshold' передается в cv::groupRectangles() API - non-Max-Suppression?
// 'scale0' controls how much down-sampling is performed on the input image before calling 'detect()'.
// It is repeated for 'nlevels' number of times. Default is 64. All levels could be done in parallel.
// Описание алгоритма и таблица параметров для различных типов объектов приведена в документе:
// http://pascallin.ecs.soton.ac.uk/challenges/VOC/voc2006/slides/dalal.pdf
int main(int argc, char * argv[])
{
vector <float> desc;
Mat img;
setlocale(LC_ALL, "Russian");
// Читаем изображение
img = imread("C:\\ImagesForTest\\lena.jpg",0);
namedWindow("Image",CV_WINDOW_KEEPRATIO | CV_WINDOW_AUTOSIZE);
imshow("Image", img);
// ---------------------------------------------
//Вычислим дескрипторы
// ---------------------------------------------
// параметры - см. выше
Size winSize(64,128);
Size blockSize(16,16);
Size blockStride(8,8);
Size cellSize(8,8);
int nbins=9;
int derivAperture=1;
double winSigma=-1;
int histogramNormType=cv::HOGDescriptor::L2Hys;
double L2HysThreshold=0.2;
bool gammaCorrection=true;
int nlevels=cv::HOGDescriptor::DEFAULT_NLEVELS;
// Соорудили экземпляр класса с описанием дескрипторов
cv::HOGDescriptor HD(winSize,
blockSize,
blockStride,
cellSize,
nbins,
derivAperture,
winSigma,
histogramNormType,
L2HysThreshold,
gammaCorrection,
nlevels);
// Посчитали дескрипторы изображения
HD.compute(img,desc,Size(8,8),Size(0,0)); // шаг 8 по x и 8 по y ; отступ 0 по x и 0 по y
// Дескрипторы размером HD.getDescriptorSize() теперь хранятся в переменной desc
cout <<"Размер дескриптора:"<< HD.getDescriptorSize()<< endl;
// размер дескриптора вычисляется так:
//DescSize=(size_t)nbins*
//(blockSize.width/cellSize.width)*
//(blockSize.height/cellSize.height)*
//((winSize.width - blockSize.width)/blockStride.width + 1)*
//((winSize.height - blockSize.height)/blockStride.height + 1);
cout <<"Всего дескрипторов:"<< desc.size()/HD.getDescriptorSize() << endl;
desc.clear();
waitKey(0);
return 0;
}
#134
Отправлено 04 Июль 2012 - 02:34
http://szproxy.blogs...2/testtest.html
там есть ссылка на какую то обучающую программку svm_light.
Единственное пока не знаю какого формата нужны фотографии положительных и негативных образцов. В программе ведь надо указывать размер окна, и как я понимаю на каждой фотографии надо чтоб размер положительного образца был именно такого размера , ну например у Вас
Цитата
Как Вы считаете сколько надо фотографий и какого размера они должны быть?
#135
Отправлено 04 Июль 2012 - 03:27
По поводу пропорций и др. параметров в листинге выше есть ссылка, а по ссылке открывается документ, в котором есть интересная таблица
http://pascallin.ecs...lides/dalal.pdf
HogParameters.PNG (120,75К)
Количество загрузок: 10
По этим данным можно заключить, что при обучении HOG детектора без бубна или кроссвалидации не обойтись. Если с размерами окна (характерные пропорции объекта, стороны кратны 8 (или значению blockStride), конкретный размер определяется мощностью компа (см. размер дескриптора выше в листинге)) - более менее понятно, то с другими параметрами все не так очевидно.
Количество фотографий - чем больше, тем лучше. Обычно от несколькх сотен, до пары тысяч.
#136
Отправлено 05 Июль 2012 - 11:08
#137
Отправлено 05 Июль 2012 - 02:19
И, если поменяем размер окна, это будет уже другой детектор, т.к. изменится размер дескриптора.
Для поиска объектов разных размеров, меняется масштаб изображения.
#138
Отправлено 09 Июль 2012 - 11:36
Цитата
Таким образом по сути я возвращаюсь к анализу темы http://www.compvisio...wtopic=630&st=0 созданную пользователем ale-ivan
Сейчас опробовав следующий фильтры tophat и blackhat (спасибо теме http://www.compvisio...findpost&p=2270)
у меня к сожалению не получается выделить свою голову - дело в том что у меня на фоне светлой одежды голова темная , и контуры не выделяются, я пробовал также сделать негатив картинки (то есть вычесть каждый пиксель из 255) все равно не получается,... как же бытЬ?
Вопрос к Smorodov :
Smorodov (01 Сентябрь 2011 - 03:52 ):
Сайт проекта с картинками здесь: https://sites.google.../demonstrations
И еще, может быть оптический поток использовать?
я открыл сайт но у меня из картинок только часть открывается! Вы можете вкратце объяснить в чем суть retinaDemo ?
Приложение: мой код
cvCopy(colourImage,segment_picture,mask);
cvShowImage("segment_picture",segment_picture);
// cvZero(greyImage);
// cvConvertImage(segment_picture,greyImage);
cvMorphologyEx(segment_picture, tophat, Temp, Kern, CV_MOP_TOPHAT, iterations);
cvMorphologyEx(segment_picture, blackhat, Temp, Kern, CV_MOP_BLACKHAT, iterations);
//cvMorphologyEx(colourImage, tophat, Temp, Kern, CV_MOP_TOPHAT, iterations);
//cvMorphologyEx(colourImage, blackhat, Temp, Kern, CV_MOP_BLACKHAT, iterations);
cvShowImage("CV_MOP_TOPHAT", tophat);
cvShowImage("CV_MOP_BLACKHAT", blackhat);
//CV_SWAP(tophat,blackhat,difference);
cvZero(greyImage);
//cvConvertImage(tophat,greyImage);
cvConvertImage(segment_picture,greyImage);
cvCanny(greyImage,greyImage,50,100);
/*
for (unsigned char *ib = (unsigned char *)greyImage->imageData, *stopb = (unsigned char *)(greyImage->imageData + greyImage->imageSize); ib != stopb; ++ib)
{
*ib = 255- *ib;
}*/
cvShowImage("invert", greyImage);
{
CvMemStorage *storage = cvCreateMemStorage(0);
CvContourScanner cs = cvStartFindContours(greyImage, storage, sizeof(CvContour), CV_RETR_LIST , CV_CHAIN_APPROX_NONE);
CvSeq *mContour = 0;
for (CvSeq *contour = cvFindNextContour(cs); contour; contour = cvFindNextContour(cs))
{
if (contour->total >= 400)
{
CvBox2D box = cvFitEllipse2(contour);
CvPoint center = cvPointFrom32f(box.center);
CvSize size = cvSize(cvRound(box.size.width * 0.5), cvRound(box.size.height * 0.5));
cvEllipse(colourImage, center, size, -box.angle, 0, 360, CV_RGB(0, 0, 255), 2, CV_AA, 0);
}
}
Прикрепленные файлы
-
segment.JPG (29,99К)
Количество загрузок: 17 -
tophat.JPG (28,45К)
Количество загрузок: 16 -
blackhat.JPG (27,67К)
Количество загрузок: 14 -
contours.JPG (40,21К)
Количество загрузок: 15 -
результат.JPG (44,54К)
Количество загрузок: 16
#139
Отправлено 09 Июль 2012 - 12:31
Кстати, более полезным, вероятно будут использовать новые дескрипторы, которые появились в версии 2.4.
http://www.ivpe.com/freak.htm
#140
Отправлено 09 Июль 2012 - 01:08
получить область движения->сегментировать по цвету->выделить область округлой формы(наиболее похожую на голову)
(хотя прически\шляпы понятное дело не всё испортят)

Помощь













