mrgloom 242 Report post Posted July 16, 2012 Надо исходить из того, как человек распознает людей или подсчитывает их - Например я охранник сижу где в охранке, и смотрю на камеры - лично я смотрел бы на видео. хоп че то появилось (детектор движения) нахожу где голова у субъекта и смотрю куда она движется, а как я голову определю? по цвету! выделяется же голова у него на плечах. так и тут надо действовать. зачем от природы отделяться. не думаю что всё так просто ибо голова определяется только в контексте самого человека. небольшой офтоп про visual perception An interesting observation from the cat's LGN study is the apparent pre-processing of information prior to the visual cortex. A frame from the cat's LGN movie shows that the LGN or retina enhances cat like features of human faces. http://www.biotele.com/vision.html типа кошки видят людей как больших котов. а по делу мне кажется любой классификатор который работает с рамкой можно более менее обучить находить что то с любого ракурса, другое дело вопрос в изменчивости категорий, т.к. человек может иметь разный цвет волос, носить шляпу и т.д. Share this post Link to post Share on other sites
mrgloom 242 Report post Posted July 18, 2012 кстати говоря оказывается это называется People Counting / Human Counting / Customer Counting System /watch?v=wUORIaySoIg думаю всего лишь обученные классификаторы на рамках. оказывается есть еще всякие навороченные счетчики http://www.vcount.ru/products/ http://www.vcount.ru/products/vcount_3d/ -типа кинекта карта глубины. что то типа трекера по точкам http://www.edwardrosten.com/work/rosten_2006_thesis_presentation.pdf Share this post Link to post Share on other sites
mrgloom 242 Report post Posted August 7, 2012 http://www.vision.ee.ethz.ch/boostingTrackers/index.htm еще трекинг использует online boosting есть сорцы и бинарники http://vision.cs.utexas.edu/projects/ers/ наверно можно выделять объект на который обучено ,есть код. 1 Share this post Link to post Share on other sites
kazanOpenCV 0 Report post Posted August 14, 2012 Спасибо за отличный ресурс. еще трекинг использует online boosting есть сорцы и бинарники Share this post Link to post Share on other sites
SergeyKulakov 0 Report post Posted August 23, 2012 Здравствуйте уважаемые форумчане! Скажите пожалуйста, при использовании распознавания людей средствами openCV, и в частности, алгоритмом HOGа, какой минимальный размер фигуры человека (в пикселах) сможет распознать метод detectMultiScale? Я получаю с камеры изображение где высота человека начинается от 50-60 пикселей и больше. Share this post Link to post Share on other sites
Smorodov 578 Report post Posted September 3, 2012 Документ в тему: http://www.robots.ox.ac.uk/ActiveVision/Publications/benfold_reid_cvpr2011/benfold_reid_cvpr2011.html Видео с этой странички: Share this post Link to post Share on other sites
Predatorxxx 5 Report post Posted September 8, 2012 (edited) Я вернулся, меня месяц не было) Всем привет!) Я перешел на новую opencv 2.4 ! перевел свой проект на новые функции .. В общем в прошлый раз я остановился на предложении сделать цветную сегментацию изображения, выделить таким образом круглую, однородную по цвету область которую принимать за голову. Например, сделать это через суперпиксели. на практике еще не сделал. Меня больше заинтересовало другое... Например по этой ссылке можно увидеть видео подобно работающей системы Видно что система в общем работает все таки не на предложенном мной принципе цветовой сегментации. Для решения этой задачи надо узнать а на каком принципе работает данная система. есть вот это видео где показано что то вроде блобтрека, но там в одном блобе может быть несколько людей и я по прежнему задаюсь вопросом как решается проблема разделения людей? Готовые решения подобной задачи уже есть http://www.myaudience.com/count/overview или вот здесь - модуль подсчета посетителей http://www.macroscop.com/products/Intelligent_modules/ Короче говоря, мне до сих пор непонятен принцип подсчета посетителей / people counting ) Прошу помочь мне разобраться) UPD: http://www.youtube.com/watch?feature=player_embedded&v=EmPEqIWJgSk посмотрев видео, там говорится что предварительно надо задать прямоугольник примерного размера человека. А что если действительно - просто смотрится какое кол-во пикселей занимает движущийся объект на картинке и разделить всю получившуюсь площадь на размер прямоугольника, грубо говоря прямоугольник например размером 50*50 = 2500 выделение переднего плана показывает что на картинке есть некоторая площадь размером 6000 квадратов 6000/2500 = 2,4 , то есть у нас 2 человека на картинке... идея работать будет не? Edited September 8, 2012 by Predatorxxx Share this post Link to post Share on other sites
Predatorxxx 5 Report post Posted September 8, 2012 в описании к видео - здесь кстати показан алгоритм Background substraction, binarisation, erosion/dilatation, blob tracking, shape coefficients. собственно - выделение переднего плана ЕСТЬ!бинаризация - это пороговое преобразование,эрозия дилатация тоже понятно , поэкспериментировать с кол-вом итераций можно,а вот с блоб-трекингом у меня проблемы, поскольку я не понимаю что это такое... коэффициенты формы тоже странная вещь Share this post Link to post Share on other sites
mrgloom 242 Report post Posted September 10, 2012 как работает первое непонятно, второе похоже работает плохо т.к. группу людей считает за 1 блоб. про третье когда люди идут и держатся за руки можно просто по площади и форме блоба понять что это 2 человека.вообщем самый простой метод разделения слипшихся это просто по площади блоба, если знать примерный размер блоба для 1 человека. коэффициенты формы - скорее всего что то типа моментов Ху. Share this post Link to post Share on other sites
alex-rostov 0 Report post Posted October 2, 2012 Доброго времени суток! Подскажите пожалуйста, с помощью каких средств OpenCV можно выделить маркеры на изображении? Маркер: Примеры изображений: Share this post Link to post Share on other sites
Smorodov 578 Report post Posted October 3, 2012 Думаю это должно подойти: http://www.compvision.ru/forum/index.php?showforum=20 Share this post Link to post Share on other sites
Predatorxxx 5 Report post Posted October 4, 2012 Добрый день. В поисках решения проблемы people counting нашел на stackoverflow.com на португальском языке статью в которой рассказывается как решается (хотя бы даже примерно) данная проблема. Основывается это все, как я и догадывался, на сегментации по цвету. Но сам алгоритм сегментации по цвету мне не понятен (он описывается в статье, но без подробностей). Суть текущей версии в том, что я иду по картинке слева направо, сверху вниз. пиксель 0,0 помечаю за уровень 0. далее следующий пиксель 0,1 я должен сравнить с левым текущим и понять а близок ли он по цвету? если близок то ему присваивается такой же уровень 0, если не близок то присваивается НОВЫЙ УРОВЕНЬ 1. сравнение происходит следующим образом (R+G+B ) у текущего кадра и у того который сравниваю должны отличаться не более чем на порог. таким образом для пикселя i,j я должен R+G+B сравнить с пикселем i-1,j-1 ; i-1,j ; i-1,j+1 ; i, j-1 к сожалению картинка удручающая. цвета толком не выделяются как видно из прикрепленной картинки. ВОПРОС че делать? есть ли методы цветовой сегментации, можете ли вы рассказать о них? С нетерпением, жду ответа) #include <iostream> // for standard I/O #include <string> // for strings #include <iomanip> // for controlling float print precision #include <sstream> // string to number conversion #include <math.h> #include <opencv2/opencv.hpp> #include <opencv2/opencv_modules.hpp> using namespace std; using namespace cv; Mat reduceIm(Mat& frame) { int a,b=0; a=b=8; int rcols=floor((double)frame.cols/a); int rrows=floor((double)frame.rows/B); Mat newframe(rrows,rcols,CV_8UC3); Mat_<Vec3b> _newframe = newframe; Mat_<Vec3b> _frame = frame; int i1,j1,i,j; for ( i1=0; i1<rrows;i1++) for ( j1=0;j1<rcols;j1++) { int sr[3]={0,0,0}; for ( i=0+b*i1; i<b*(i1+1);i++) for ( j=0+a*j1; j<a*(j1+1); j++) { /* sr[0]+=frame.at<uchar>(i*3,j); sr[1]+=frame.at<uchar>(i*3+1,j); sr[2]+=frame.at<uchar>(i*3+2,j); } newframe.at<uchar>(i1*3,j1)=sr[0]/16; newframe.at<uchar>(i1*3+1,j1)=sr[1]/16; newframe.at<uchar>(i1*3+2,j1)=sr[2]/16;*/ sr[0]+=_frame(i,j)[0]; sr[1]+=_frame(i,j)[1]; sr[2]+=_frame(i,j)[2]; } _newframe(i1,j1)[0]=sr[0]/a/b; _newframe(i1,j1)[1]=sr[1]/a/b; _newframe(i1,j1)[2]=sr[2]/a/b; newframe = _newframe; } return newframe; } int color(Vec3b a) { int b = a[0]+a[1]+a[2]; return b; } Mat levelIm(Mat &im) { Mat im1 = im; int level = 0; int porog=50; int prev00,prev01,prev02,prev10 = 0; int i,j ; Mat_<Vec3b> _im1 = im1; Mat_<Vec3b> _im = im; //int levels[im1.rows][im1.cols]; //???? int levels[100][100]; levels[0][0]=level; for (i=0; i<im.rows;i++) for (j=1; j<im.cols;j++) { if (j!=0) if (abs(color(_im(i,j))- color(_im(i,j-1)))<porog) {levels[i][j]=levels[i][j-1]; continue;} if (i!=0) { if (abs(color(_im(i,j))-color(_im(i-1,j)))<porog) {levels[i][j]=levels[i-1][j]; continue;} if (abs(color(_im(i,j))-color(_im(i-1,j+1)))<porog) {levels[i][j]=levels[i-1][j+1]; continue;} } if (i!=0 && j!=0) if (abs(color(_im(i,j))-color(_im(i-1,j-1)))<porog) {levels[i][j]=levels[i-1][j-1]; continue;} level = level+1; levels[i][j]=level; } for (i=0; i<im.rows;i++) for (j=1; j<im.cols;j++) { _im1(i,j)[0] = ceil((double)levels[i][j]*255/level); _im1(i,j)[1] = ceil((double)levels[i][j]*255/level); _im1(i,j)[2] = ceil((double)levels[i][j]*255/level); } im1=_im1; cout<<"level"<<level; cvNamedWindow("2",CV_WINDOW_FREERATIO); imshow("2",im1); return im1; } int main() { namedWindow("video",CV_WINDOW_FREERATIO); Mat frame; Mat seg; frame = imread("E://T_SEG.jpg"); if(!frame.data) return -1; imshow("video",frame); blur(frame,frame,Size(3,3)); imshow("blur",frame); // imshow("seg",seg); cout<<"cols="<<frame.cols<<" rows = "<<frame.rows; Mat frame1; frame1 = reduceIm(frame); cvNamedWindow("1",CV_WINDOW_FREERATIO); imshow("1",frame1); Mat frame2; frame2 = levelIm(frame1); cvWaitKey(0); return 0; } UPD: у кого есть watershed segmentation / алгоритм сегментации по водоразделу ? киньте плизreal-time-people-couting.pdf Share this post Link to post Share on other sites
Smorodov 578 Report post Posted October 4, 2012 Ну есть еще mean-shift segmentation (в примерах opencv), k-means segmentation, суперпиксели, плюс к тому, можете еще Edison-а поковырять: http://coewww.rutgers.edu/riul/research/code/EDISON/index.html и тут: http://www.lapix.ufsc.br/sms/byalgorithm.html Share this post Link to post Share on other sites
iskees 32 Report post Posted October 5, 2012 Подскажите методы сопровождения людей в кадре. В кадре очень много движущихся объектов (не людей) поэтому вычитания фона не подходит. Использую SVM-HOG из примеров им нахожу людей и нужно сопоставить их в разных кадрах. Пробовал SURF вроди как работает но часто сбивается видимо из-за движения людей и изменения фона и вообще картина не очень качественная. также люди часто пресекаются и пропадают из виду. Вопрос быстродействия не критичен можно хоть 0,1сек потратить на это, также есть GPU. Share this post Link to post Share on other sites
ArtemBogatov 2 Report post Posted October 5, 2012 Подскажите методы сопровождения людей в кадре. В кадре очень много движущихся объектов (не людей) поэтому вычитания фона не подходит. Использую SVM-HOG из примеров им нахожу людей и нужно сопоставить их в разных кадрах. Пробовал SURF вроди как работает но часто сбивается видимо из-за движения людей и изменения фона и вообще картина не очень качественная. также люди часто пресекаются и пропадают из виду. Вопрос быстродействия не критичен можно хоть 0,1сек потратить на это, также есть GPU. Посмотрите вот эту ссылку: http://www.robots.ox.ac.uk/ActiveVision/Publications/benfold_reid_cvpr2011/benfold_reid_cvpr2011.html, как раз Ваша задача. Ещё посмотрите пример blobtrack из примеров OpenCV, там используется фильтр частиц (Particle Filter) для разруливания коллизий (столкновения объектов заслон одного другим и т.д.) Share this post Link to post Share on other sites
mrgloom 242 Report post Posted October 9, 2012 я иду по картинке слева направо, сверху вниз. пиксель 0,0 помечаю за уровень 0. далее следующий пиксель 0,1 я должен сравнить с левым текущим и понять а близок ли он по цвету? если близок то ему присваивается такой же уровень 0, если не близок то присваивается НОВЫЙ УРОВЕНЬ 1. сравнение происходит следующим образом (R+G+B ) у текущего кадра и у того который сравниваю должны отличаться не более чем на порог. таким образом для пикселя i,j я должен R+G+B сравнить с пикселем i-1,j-1 ; i-1,j ; i-1,j+1 ; i, j-1 к сожалению картинка удручающая. цвета толком не выделяются как видно из прикрепленной картинки. велосипед. если с английским нормально, то прочитайте http://en.wikipedia.org/wiki/Segmentation_(image_processing) там Region-growing methods похоже на то что вы описали. ну и про другие там прочитайте. не очень понятно что вы собрались сегментировать, если у вас вроде как должен получиться движущийся блоб от вычитания фона(или вы его еще собрались на части делить?) хорошей сегментации быть не может так же как и хорошего выделения границ(ну по крайней мере я не знаю).минимум это постоянно надо подгонять параметры или пользоваться какими либо эвристиками, а в хорошем случае это мы опять возвращаемся к обучению(или Trainable Segmentation,Model based segmentation) watershed segmentation вроде есть в опенцв. попозже еще вспомню что есть прямо в опенцв, для некоторых там требуются начальные точки (seeds). еще могу порекомендовать программу fiji(imagej) там можно попробовать быстро некоторые основные алгоритмы, а так она больше для мед. изображений, но там много чего есть. еще удобно что там можно записать макрос и применить для большого объема изображений. http://www.imagej.ru/resursi-dlya-razrabotchika/sozdanie-prosteyshego-makrosa-v-programme-imagej.html п.с. на португальском читать это мазохизм, тем более там пейпер ничего интересного, похоже как раз выделяют движущийся кусок, а потом по цвету находят голову. Share this post Link to post Share on other sites
Predatorxxx 5 Report post Posted November 11, 2012 Уже два месяца читаю статьи и не могу решить эту задачу : people counting Ищу человека, который помог бы мне решить эту задачу! https://www.free-lance.ru/projects/1355803/razrabotka-programmyi-podscheta-potoka-lyudey-.html Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted November 12, 2012 Не помню уже: ты выкладывал своё эталонное видео, на котором всё должно работать? Если нет, то выложи или дай ссылку. Share this post Link to post Share on other sites
Predatorxxx 5 Report post Posted November 12, 2012 вот мои тестовые видео: T_CAMERA_A - один человек ходит T_CAMERA_C - два человека ходят T_SEG - картинка, которую я использовал для сегментации голов, определения головы.тестовые видео.rar Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted November 12, 2012 Ага, понятно. У меня есть одна идейка: найти полный оптический поток (в OpenCV есть реализация нескольких алгоритмов, штуки 4-5), а по нему либо просто сегментировать объекты, либо построить карту глубины (deph map) и использовать для её для сегментациии. Работы по сегментации и построению карты глубины из оптического потока я видел. Но! Скорость работы может быть достаточно медленной, возможно что потребуется использовать видеокарту для ускорения. Отсюда у меня несколько вопросов: 1. Какой конфигураией в плане железа и требованиями ты располагаешь? 2. Можешь ли использовать CUDA или OpenCL для рассчётов? 3. Интересен ли тебе вообще такой подход? 4. Согласен ли поработать вдвоём со мной над этим? Результаты будем поначалу выкладывать в этот форум и как-нибудь синхронизировать. А там посмотрим. Share this post Link to post Share on other sites
Predatorxxx 5 Report post Posted November 12, 2012 вначале ответы: 1. core i3 - 2100 , 3.1GHz , 4 Gb RAM . Требования - работа в режиме реального времени, достоверность > 91% (относительно ручного подсчета) 2. Да наверное могу , раньше не работал , научиться могу! 3. Да мне интересен подход, потому что лучше что-то чем ничего 4. согласен работать хоть вшестером, лишь бы был результат. теперь соображения: 1 полный оптический поток - знаю. существуют способы лукаса-канаде, фарнебак и тд 2 сегментировать = я не знаю получится или нет, так как у человека все трясется, а когда он стоит, то у него вообще разные направления получаются 3 оптический поток вообще говоря трудоемкая операция (отсюда я понимаю что действительно придется использовать граф. процессор) 4 карта глубины? не, не слышал. что вы имеете ввиду? Александр Кручинин написал: А не пробовали пойти по более простому пути - а именно просто анализ отличий от фона, а затем ширину этого отличия. После этого посчитать горизонтальную проекцию отличий - т.е. просто свести к одномерной кривой в оси X. Если ширина олтичий от фона больше какого-то уровня, то предполагаем что два чел., если больше другого - 3 и т.п. а по Минимуму на одномерной кривой найти границы между объектами Я ответил: вот в этих видео вроде алгоритм не такой (( вот здесь одна из циферок означает как раз таки то что вы говорили В ответ получил Алгоритм конечно может быть различный. Вам нужно определить движущийся сегмент и попытаться понять - один человек он представляет или несколько, как это сделать - можно разными способами. Я к сожалению не пробовал этого делать. Надо выработать какой-то критерий, по которому разбивать область на несколько сегментов Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted November 13, 2012 Строить модель фона - это самый простой и быстрый вариант, но не очень точный и чувствительный к изменению освещения и другим неприятным вещам. Есть работы, которые некоторые из данных ограничений устраняют, однако идеального я не встречал. Теперь по оптическому потоку. Один из самых лучших на сегодняшний день - это оптический поток Брокса. В OpenCV есть реализация одного из его алгоритмов (2004-го года) на CUDA, называется BroxOpticalFlow (пример использования для 2-х изображений тоже есть). Можешь посмотреть на его страницу: Brox publications. Там есть ещё реализация довольно неплохого алгоритма SimpleFlow, но вариант Брокса лучше тем, что лучше отрабатывает тени и изменение освещения (для подсчёта посетителей это важно). если у тебя есть видеокарта Nvidia, то скомпилируй OpenCV с поддержкой CUDA и посмотри. Компилироваться будет очень долго, больше часа. Если нет, то будем думать о чём-нибудь другом. Карта глубины - это серое изображение, тёмные участки которого соответствуют дальним объектам, а светлые - ближним. Она нужна, чтобы разделять людей друг от друга. То есть головы проходящих посетителей будут отображаться как яркие белые пятна. Вообще, оптический поток - это обобщение простого вычитания фона. При нём определяется не только тот факт, что пиксель изменился, но и направление его смещения. Два самых старых алгоритма (70-х или 80-х годов): 1. Локальный Лукаса-Канаде. Довольно быстрый, но точность страдает, есть проблема апертуры. 2. Глобальный Хорна-Чанка. Очень хорош по качеству. Ну и дальше пошли всякие улучшения. В OpenCV есть эти оба, Брокса, SimpleFlow, Фарнербека. Может, ещё что-то не помню уже. И сюда ещё зайди: Kitty benchmark. Посмотри на выдаваемые результаты. Итого. Самый первый этап - это "живое созерцание" (Ф. Энгельс). Предлагаю тебе опробовать перечисленные алгоритмы, посмотреть на их скорость и выдаваемый результат в виде цветной карты или поля векторов. Тогда ты на пальцах поймёшь, что вообще можно получить, оценишь скорость работы (таймер поставь, надо засекать время). Выбирай наиболее качественный алгоритм, скорость для начала не так важна. практика подсказывает, что вариант из OpenCV всегда можно ускорить в 2 и более раз, можно уменьшить внутри обрабатываемую картинку до предела необходимой точности. С этим проблем не будет. Когда ты оценишь и поймёшь принципы работы, то приступим к написанию кода. Тестовые варианты можешь выкладывать сюда, буду помогать если что. Такой вариант пойдёт? Share this post Link to post Share on other sites
mrgloom 242 Report post Posted November 13, 2012 так как плотный оптический поток поможет разделить 2 человека? Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted November 13, 2012 По его результатам + яркость и цвет пикселя можно провести сегментацию. Или, как я уже писал, построить карту глубины и сегментировать уже её. Если первый вариант не выгорит. Share this post Link to post Share on other sites
Nuzhny 243 Report post Posted November 13, 2012 так как плотный оптический поток поможет разделить 2 человека? Кстати. Если говорить вообще, то оптический поток даёт больше информации о сцене, чем просто вычитание фона. Больше информации, следовательно можно лучше кластеризовать. Нет? Share this post Link to post Share on other sites