Перейти к содержимому
Compvision.ru

Predatorxxx

Пользователи
  • Количество публикаций

    46
  • Зарегистрирован

  • Посещение

  • Days Won

    3

Predatorxxx last won the day on July 4 2012

Predatorxxx had the most liked content!

Репутация

5 Новичек

О Predatorxxx

  • Звание
    Эксперт
  1. Трекинг объектов.

    Nuzhny, у меня к сожалению нет на рабочем компьютере NVIDIA. Мне хотелось бы как получить это оптический поток Брокса в реальном времени. Я даже зашел на simple_flow, скачал код и не смог разобраться в нем. Конкретно: там написано чтобы запустить прогу надо два изображения, и какую то дату которая получается из матлаба. а хотелось бы чтобы опт.поток в реальном времени рассчитывался. я бы с удовольствием изменил код, но я не могу понять где он вообще? Бог с ним, с simple flow, давайте Брокса хотя бы попробуем сделать... в opencv нет такой функции - я не могу найти... Карта глубины тоже хорошая вещь, но вначале надо разобраться может с опт потоком.
  2. Трекинг объектов.

    вначале ответы: 1. core i3 - 2100 , 3.1GHz , 4 Gb RAM . Требования - работа в режиме реального времени, достоверность > 91% (относительно ручного подсчета) 2. Да наверное могу , раньше не работал , научиться могу! 3. Да мне интересен подход, потому что лучше что-то чем ничего 4. согласен работать хоть вшестером, лишь бы был результат. теперь соображения: 1 полный оптический поток - знаю. существуют способы лукаса-канаде, фарнебак и тд 2 сегментировать = я не знаю получится или нет, так как у человека все трясется, а когда он стоит, то у него вообще разные направления получаются 3 оптический поток вообще говоря трудоемкая операция (отсюда я понимаю что действительно придется использовать граф. процессор) 4 карта глубины? не, не слышал. что вы имеете ввиду? Александр Кручинин написал: А не пробовали пойти по более простому пути - а именно просто анализ отличий от фона, а затем ширину этого отличия. После этого посчитать горизонтальную проекцию отличий - т.е. просто свести к одномерной кривой в оси X. Если ширина олтичий от фона больше какого-то уровня, то предполагаем что два чел., если больше другого - 3 и т.п. а по Минимуму на одномерной кривой найти границы между объектами Я ответил: вот в этих видео вроде алгоритм не такой (( вот здесь одна из циферок означает как раз таки то что вы говорили В ответ получил Алгоритм конечно может быть различный. Вам нужно определить движущийся сегмент и попытаться понять - один человек он представляет или несколько, как это сделать - можно разными способами. Я к сожалению не пробовал этого делать. Надо выработать какой-то критерий, по которому разбивать область на несколько сегментов
  3. Трекинг объектов.

    вот мои тестовые видео: T_CAMERA_A - один человек ходит T_CAMERA_C - два человека ходят T_SEG - картинка, которую я использовал для сегментации голов, определения головы. тестовые видео.rar
  4. Трекинг объектов.

    Уже два месяца читаю статьи и не могу решить эту задачу : people counting Ищу человека, который помог бы мне решить эту задачу! https://www.free-lance.ru/projects/1355803/razrabotka-programmyi-podscheta-potoka-lyudey-.html
  5. Трекинг объектов.

    Добрый день. В поисках решения проблемы 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
  6. Трекинг объектов.

    в описании к видео - здесь кстати показан алгоритм собственно - выделение переднего плана ЕСТЬ! бинаризация - это пороговое преобразование, эрозия дилатация тоже понятно , поэкспериментировать с кол-вом итераций можно, а вот с блоб-трекингом у меня проблемы, поскольку я не понимаю что это такое... коэффициенты формы тоже странная вещь
  7. Трекинг объектов.

    Я вернулся, меня месяц не было) Всем привет!) Я перешел на новую 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 человека на картинке... идея работать будет не?
  8. Трекинг объектов.

    вот это пробую ! насчет симметрии тоже не очень понимаю - просто по сути edges становится выделеннее чем оriginal. но явного выделения головы все равно не происходит.
  9. Трекинг объектов.

    я не очень понимаю как выделить голову и плечи - они же разных цветов - а контур когда два человека идут впритык рядом, сложно определить - у меня cvFindContours совместно с canny вообще почему то голову не может выделить как контур, если бы выделил я бы его на моментные характеристики или просто на окружность проверил (см код). тут надо именно по цвету хотя бы волосы выделить, вы можете подсказать какой функцией это можно осуществить? Вот я что то нашел - давно читал, но я никогда не пробовал ее в действии - может поможете с примерчиком?) void cvWatershed( const CvArr* image, CvArr* markers ); коврик контрастный не всегда есть возможность положить) код cvConvertImage(segment_picture,greyImage); cvCanny(greyImage,mask3,10,200,3); cvShowImage("canny",mask3); { CvMemStorage *storage = cvCreateMemStorage(0); CvContourScanner cs = cvStartFindContours(mask3, storage, sizeof(CvContour), CV_RETR_TREE , CV_CHAIN_APPROX_SIMPLE); CvSeq *mContour = 0; for (CvSeq *contour = cvFindNextContour(cs); contour; contour = cvFindNextContour(cs)) { if (cvContourArea(contour)>600 ) { double area = fabs(cvContourArea(contour)); double perim = cvContourPerimeter(contour); // 1/4*CV_PI = 0,079577 if ( area / (perim * perim) > 0.06 && area / (perim * perim)< 0.1 ){ // нарисуем контур cvDrawContours(colourImage,contour, CV_RGB(255,216,0), CV_RGB(0,0,250),10,2,8); } //cvShowImage("222",frame); //cvWaitKey(0); } } cvEndFindContours(&cs); cvReleaseMemStorage(&storage); }
  10. Трекинг объектов.

    Попробовал сделать следующее - мою картинку в оттенках серого я дискретизирую по слоям с одинаковой яркостью. Каждый слой содержит разброс в три пункта яркости как это видно из цикла. на каждом слое я нахожу контуры и выделяю их на моем основном изображении - colour image . Картинки я прикрепляю. Но это недоработанный код , тут надо реально делать не по яркости а по цвету сегментацию делать! У меня потому что когда тень падает от человека то выделяет контуром. может моментные характеристики у контуров скажете чтоб выделялись только круглые области? или Как по цвету сделать? какой функцией? UPD: попробовал хафом делать на каждом слое, и ... понял что это слишком долгий процесс для одного кадра, а эффект вобщем то дурацкий получился... cvConvertImage(segment_picture,greyImage); for(int thresh=5;thresh<255;thresh+=3) { cvThreshold(greyImage,mask2,thresh,255,CV_THRESH_BINARY); cvThreshold(greyImage,mask1,thresh-3,255,CV_THRESH_BINARY); cvAbsDiff(mask2,mask1,mask3); //cvAnd(mask1,mask2,mask3); cvShowImage("mask",mask); { CvMemStorage *storage = cvCreateMemStorage(0); CvContourScanner cs = cvStartFindContours(mask3, 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 &&contour->total <= 4000) { 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); } } cvEndFindContours(&cs); cvReleaseMemStorage(&storage); } // cvShowImage("thresh",mask3); // cvWaitKey(1); } cvShowImage("result", colourImage);
  11. Трекинг объектов.

    окей, мне нравится этот план! По поводу сегментации по цвету - можете сказать какой функцией это делатЬ?)
  12. Трекинг объектов.

    Уважаемые форумчане, мне кажется в моей проблеме трекинга голов я повернул тему не в то русло. Пообщавшись с автором сайта http://recog.ru/ , видеоаналитиком и просто хорошим человеком Александром Кручининым, хотелось бы вставить его цитату: Таким образом по сути я возвращаюсь к анализу темы http://www.compvision.ru/forum/index.php?showtopic=630&st=0 созданную пользователем ale-ivan Сейчас опробовав следующий фильтры tophat и blackhat (спасибо теме http://www.compvision.ru/forum/index.php?showtopic=411&view=findpost&p=2270) у меня к сожалению не получается выделить свою голову - дело в том что у меня на фоне светлой одежды голова темная , и контуры не выделяются, я пробовал также сделать негатив картинки (то есть вычесть каждый пиксель из 255) все равно не получается,... как же бытЬ? Вопрос к Smorodov : я открыл сайт но у меня из картинок только часть открывается! Вы можете вкратце объяснить в чем суть 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); } }
  13. Трекинг объектов.

    Smorodov, все необходимые программы и действия также описаны вот по этой ссылке http://szproxy.blogspot.com/2010/12/testtest.html там есть ссылка на какую то обучающую программку svm_light. Единственное пока не знаю какого формата нужны фотографии положительных и негативных образцов. В программе ведь надо указывать размер окна, и как я понимаю на каждой фотографии надо чтоб размер положительного образца был именно такого размера , ну например у Вас Как Вы считаете сколько надо фотографий и какого размера они должны быть?
  14. Трекинг объектов.

    p.s. насчет блобов ВЕЛИКОЛЕПНО написано в E:\OpenCV2.1\doc\vidsurv (на всяк случай прикрепляю сюда) все классы, че каждый класс делает, какие надо объекты и переменные сувать. А вот и код HOG отлично !!! "ларчик просто открывался..." https://code.ros.org/trac/opencv/browser/trunk/opencv/samples/c/peopledetect.cpp?rev=2314 Blob_Tracking_Modules.doc Blob_Tracking_Tests.doc
  15. Трекинг объектов.

    читаю... но хотелось бы не просто статей а кода, например может у кого есть код реализации hog с комментариями? из всех методов которые можно использовать для проблемы разделения людей я выделил следующие 1) grab_cut алгоритм сегментации служащий для выделения одинаковых областей. недостаток в том. что у человека рубашка одного цвета а волосы другого 2) HOG или гистограммы градиента, к сожалению у меня нет примера кода который реализовывал бы это 3) HAFF and CANNY т.е преобразование хафа для окружностей для выделения макушек голов. я попробовал и как обычно преобразование хафа дало кучу окружностей, которые даже если и держались на моей голове то недолго. я пока еще ни разу не видел чтоб из обыкновенной картинки преобразования хафа чистенько без всяких левых окружностей выделили то что надо 4) метод на оптическом потоке farnerback , то есть сегментировать картинку на однородность векторов скорости. мне кажется если два человека будут идти с одной скоростью или людей будет много то метод будет давать кучу ошибок. про классификаторы я думаю не стоит говорить в моей задаче они не подойдут потому что 1) медленные 2) я не понимаю что классифицировать кроме голов людей или их туловищ (вид сверху) ПОЭТОМУ давайте про hog поговорим. Я думаю это реальный способ разрешить проблему трекинга. по этой ссылке я увидел что оказывается в opencv все реализовано уже для того чтобы быстро присобачить этот метод в программу. даже класс есть HOGDescriptor hog; hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); http://stackoverflow.com/questions/10769519/hog-object-detection-opencv еще коды нужны или инфа где прочитать про реализацию hog в opencv
×