nhr
-
Количество публикаций
30 -
Зарегистрирован
-
Посещение
Сообщения, опубликованные пользователем nhr
-
-
using namespace std; using namespace cv; void drawOptFlowMap(const Mat& flow, Mat& cflowmap, int step, double scale, const Scalar& color) { for (int y = 0; y < cflowmap.rows; y += step) for (int x = 0; x < cflowmap.cols; x += step) { const Point2f& fxy = flow.at<Point2f>(y, x); line(cflowmap, Point(x, y), Point(cvRound(x + fxy.x), cvRound(y + fxy.y)), color); circle(cflowmap, Point(x, y), 2, color, -1); } } int main(int argc, char** argv) { int s = 2; // масштабирующий коэффициент Mat frame, flow, cflow; Mat prvs, next, gray; Mat framepoints; cv::flann::KMeansIndexParams fln_idx = cv::flann::KMeansIndexParams(); cvNamedWindow("Testing", 1); char fname[100] = "miting_Kharkov.mp4"; VideoCapture cam(fname); if (!(cam.read(frame))) return 0; resize(frame, prvs, Size(frame.size().width / s, frame.size().height / s)); cvtColor(prvs, prvs, CV_BGR2GRAY); while (1) { if (!(cam.read(frame))) break; resize(frame, next, Size(frame.size().width / s, frame.size().height / s)); cvtColor(next, next, CV_BGR2GRAY); calcOpticalFlowFarneback( prvs, next, flow, 0.5, //Определяет масштаб изображения.0.5 означает классическую пирамиду 5, //Количество уровней пирамиды, включая начальное изображение 15, //Средний размер окна 3, //Количество итераций алгоритма на каждом уровне пирамиды 7, //Размер окрестностей пикселей для нахождения расширенного полиномиала(polyN) 1.5, //Стандартное отклонение Гауссиана, которое используется для сглаживания в polyN. Для polyN=5 - polySigma=1.1, для polyN=7 - polySigma=1.5 0 ); cvtColor(prvs, cflow, CV_GRAY2BGR); drawOptFlowMap(flow, cflow, 8, 2, CV_RGB(0, 255, 0)); imshow("Testing", cflow); imshow("prvs", prvs); imshow("next", next); Mat centers(flow.size(), 4, CV_32FC1); int count; count = cv::flann::hierarchicalClustering(flow, ceners, fln_idx); //Ожидание нажатия ESCAPE char c = cvWaitKey(10); if (c == 27) break; prvs = next.clone(); } }
Вот на данный момент код выглядит так. Функция cv::flann::hierarchicalClustering выделена красным и написано, что что-то не так с параметрами, кстати вот ошибкa:
Error 1 error C2783: 'int cv::flann::hierarchicalClustering(const cv::Mat &,cv::Mat &,const cvflann::KMeansIndexParams &)' : could not deduce template argument for 'ELEM_TYPE' D:\Visual Studio 2013\Projects\opticalflow\ConsoleApplication2\Source.cpp 130 1 ConsoleApplication2и так для каждого аргументаЧто надо подкорректировать?
-
Алгоритм к-means подойдет в данном случае?
-
Подскажите, а можно как-нибудь сгруппировать данные снятые оптическим потоком и определить, куда движется объект?
-
Спасибо за столь быстрый ответ.
Вот только
UMat gray, prevgray, uflow;
у меня нет такого оператора
-
Такс, одну ошибку исправил, добавил библиотеку video.hpp и calcOpticalFlowFarneback теперь воспринимается программой.
-
Пишу программу для определения траекторий движения. Ниже представлен код программы. Проблема в следующем, она написана на С, у меня многие функции просто не воспринимаются. Переписываю под синтаксис С++, что мог, то исправил, помогите исправить оставшееся. Проблема в resize(frame, frame1, Size(200, 200)); не воспринимает frame
#include "opencv/cv.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/imgproc/imgproc.hpp" #include <iostream> #include "opencv2/objdetect/objdetect.hpp" #include <fstream> #include <math.h> #include <stdlib.h> #include <stdio.h> using namespace std; using namespace cv; CvCapture* g_capture = NULL; //IplImage* frame; //IplImage* frame1 = 0; int main(int argc, char** argv) { Mat video, gray, frame, prevgray, flow, cflow; bool frame1 = true; cvNamedWindow("Testing", CV_WINDOW_AUTOSIZE); string fname = "D:/miting_Kharkov.mp4"; // получение следующего кадра while (1) { // получаем следующий кадр VideoCapture cam(fname); cam >> frame; // показываем кадр imshow("Testing", frame); // уменьшаем размер изображения для убыстрения работы if (frame1) { //CvSize c = cvGetSize(frame); //аналоги ли это frame.size() CvSize c = frame.size(); c.height = c.height / 2; c.width = c.width / 2; frame1 = cvCreateImage(c, 8, 3); // серое изображение } resize(frame, frame1, Size(200, 200)); cvtColor(frame1, gray, CV_BGR2GRAY); // вычисление оптического потока if (prevgray.data) { calcOpticalFlowFarneback(prevgray, gray, flow, 0.5, 3, 15, 3, 5, 1.2,0); cvtColor(prevgray, cflow, CV_GRAY2BGR); //drawOptFlowMap(flow, cflow, 16, 1.5, CV_RGB(0, 255, 0)); imshow("flow", cflow); } //Ожидание нажатия ESCAPE char c = cvWaitKey(10); if (c == 27) break; //i++; //onTrackbarSlide(i); swap(prevgray, gray); } cvReleaseCapture(&g_capture); cvDestroyWindow("Testing"); return 0; }
При отладке выскакивают следующие ошибки:
1>Source.cpp(58): warning C4800: 'IplImage *' : forcing value to bool 'true' or 'false' (performance warning)
1>Source.cpp(62): error C2664: 'void cv::resize(cv::InputArray,cv::OutputArray,cv::Size,double,double,int)' : cannot convert argument 2 from 'bool' to 'cv::OutputArray'
1> Reason: cannot convert from 'bool' to 'const cv::_OutputArray'
1> No constructor could take the source type, or constructor overload resolution was ambiguous
1>Source.cpp(68): error C3861: 'calcOpticalFlowFarneback': identifier not found
-
Ну не знаю, в программке, где я писал классификатор он работает, вот ниже ссылка на него
Я так понимаю, что проблему можно избежать, если накидать больше примеров в классификатор?
оттуда и взял txt. А как еще можно классификатор создать, покидайте ссылки
-
Ошибка вылетает.
а именно ругается на 89 строку в hog.cpp: CV_Assert( checkDetectorSize() );
-
параметры были следующие: winsize 32*32, blockStride 4*4, blocksize 8*8, cellsize 8*8, hit 0.9,scale 1.03, thresh 4.0
все остальные стандартные параметры, ничего не менял.
Возможно все дело в классификаторе. я его делал через программку, которую isseks написал, здесь на форуме есть ссылка на нее.
Вот результат работы:
-
вот классификатор
https://www.dropbox.com/s/3tk7g1u2e160tyc/1.txt
и изображение
https://www.dropbox.com/s/40p5ccqskqfrzbm/15.jpg
а вто оптимальные характеристики
hit 0.9
scale 1.03
win 4*4
pad 32*32
thresh 4
blockStride 4*4
blocksize 8*8
cellsize 8*8
Nbins 9
winsigma -1
Detiv Aperature 1
-
Написал код, по инструкции Nuzhny. Все компилится, но людей не находит, хотя в правильности классификатора уверен
std::ifstream clas ("1.txt", std::ifstream::binary); //if (clas) //{ //узнаем длину фаила clas.seekg(0, clas.end); int length = clas.tellg(); clas.seekg(0, clas.beg); char * buffer = new char[length]; cout << "Reading " << length << " characters... "; //считывание данных в виде блока clas.read(buffer, length); if (clas) std::cout << "all characters read successfully.\n"; else std::cout << "error: only " << clas.gcount() << " could be read"; //clas.close(); // текст ХОГа HOGDescriptor hog; //записываем 1.txt в вектор found vector<Rect> found, found_filtered; vector<int> vec; //copy(istream_iterator<Rect>(clas), istream_iterator<Rect> (),back_inserter(found)); std::copy( std::istream_iterator<int>(clas), std::istream_iterator<int>(), std::inserter(vec,vec.begin())); hog.setSVMDetector(vec); fflush(stdout); double t = (double)getTickCount(); Size padding(Size(32, 32)); Size winStride(Size(4, 4)); hog.detectMultiScale(gray, found, 0.9, winStride, padding, 1.03, 4); delete[] buffer; t = (double)getTickCount() - t; printf("tdetection time = %gms\n", t*1000. / cv::getTickFrequency()); std::cout << "found: " << found.size() << std::endl; size_t i, j; for (i = 0; i < found.size(); i++) { Rect r = found[i]; for (j = 0; j < found.size(); j++) if (j != i && (r & found[j]) == r) break; if (j == found.size()) found_filtered.push_back(r); } for (i = 0; i < found_filtered.size(); i++) { Rect r = found_filtered[i]; r.x += cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y += cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); rectangle(gray, r.tl(), r.br(), cv::Scalar(0, 255, 0), 3); } imshow("people detector", gray);
-
С помощью данной программы написал классификатор, пишу н плюсах, как теперь его скормить HOG ??
Пробовал с помощью svmlight, не получилось. Есть у кого-нибудь наглядные примеры?
-
А нет ни у кого наглядного примера, как свой классификатор добавить в Hog ну или в каскад Хаара?
-
Написал я свои классификатор для HOG - 1.txt. Мне его теперь нужно поместить в код, пишу на с++, для с# есть функция ReadAllText().
Какая аналогичная функция есть для с++ ? Лучше всего наглядный пример.
Вот код:
HOGDescriptor hog; //поиск объекта на изображении метод hog+svm hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); namedWindow("people detector",1 );//CV_WINDOW_AUTOSIZE fflush(stdout); vector<Rect> found, found_filtered; double t = (double)getTickCount(); // детекрирование объектов с параметрами по умолчанию hog.detectMultiScale(gray, found, 0, Size(8, 8), Size(160,160), 1.001, 1.01);
-
все, разобрался с ошибкой.
-
Вообщем при попытке скомпилировать приложение, у меня вылезает ошибка, т.е. исключение. Покурив проблему, был найден выход:
Для подключения оперативной (JIT) отладки файл .config данногоприложения или компьютера (machine.config) должен иметь
значение jitDebugging, установленное в секции system.windows.forms.
Приложение также должно быть скомпилировано с включенной
отладкой.
Например:
<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>
При включенной отладке JIT любое необрабатываемое исключение
пересылается отладчику JIT, зарегистрированному на данном компьютере,
вместо того чтобы обрабатываться данным диалоговым окном.
Нашел я этот конфиг, написал, но без изменений:
<?xml version="1.0"?> <configuration> <startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/></startup> <startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0"/> </startup> <configuration> <system.windows.forms jitDebugging="false" /> </configuration> </configuration>
-
Появился вопрос, в классификатор добавлять фотографии одинакового размера в плане ширины/высоты ??
-
Ну что же, сначала попробую написать классификатор как можно более полный, результат выложу, как напишу!
-
Если на естественном фоне, то тогда разве программа не станет рабочей только под одну фотографию? Грубо говоря, если шаблоны сделаны с фотографии одной толпы людей, то на данной толпе все будет отлично работать, а если, например, окружающая обстановка сменится, тогда как быть?
-
Я правильно понимаю, что лучше всего, в качестве, шаблонов людей использовать человека на белом фоне?
-
Да, это Невский(:
Как переучить, это я понимаю, вот только не совсем понял фразу :"И подавать на классиифиикатор вместо вызова getDefaultPeopleDetector()"
Сюда : hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); ???
Т.е. hog.setSVMDetector("мой классификатор")
-
-
В предыдущей теме мне подсказали, что лучше всего для поиска людей в толпе поможет метод HOG
Кое-как написал я его, но возникает проблема, что на нужных мне снимках не находит он людей или находит 1 из скажем 20.
Что нужно изменить в коде, а то свой собственный классификатор писать не охота.
int main(int argc, char** argv) { Mat img, gray, locations, weights; img = imread("image3.jpg", CV_LOAD_IMAGE_UNCHANGED); if (img.empty()) { cout << "Error : Image cannot be loaded..!!" << endl; system("pause"); //wait for a key press return -1; } cvtColor(img, gray, CV_BGR2GRAY);//hog работает только с gray HOGDescriptor hog; //поиск объекта на изображении метод hog+svm hog.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); namedWindow("people detector", CV_WINDOW_AUTOSIZE); fflush(stdout); vector<Rect> found, found_filtered; double t = (double)getTickCount(); // детектирование объектов с параметрами по умолчанию hog.detectMultiScale(gray, found, 0, Size(8, 8), Size(32, 32), 1.05, 2); t = (double)getTickCount() - t; printf("tdetection time = %gms\n", t*1000. / cv::getTickFrequency()); std::cout << "found: " << found.size() << std::endl; size_t i, j; for (i = 0; i < found.size(); i++) { Rect r = found[i]; for (j = 0; j < found.size(); j++) if (j != i && (r & found[j]) == r) break; if (j == found.size()) found_filtered.push_back(r); } for (i = 0; i < found_filtered.size(); i++) { Rect r = found_filtered[i]; // the HOG detector returns slightly larger rectangles than the real objects. // so we slightly shrink the rectangles to get a nicer output. // сокращение выводимых прямоугольников r.x += cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y += cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); rectangle(gray, r.tl(), r.br(), cv::Scalar(0, 255, 0), 3); } imshow("people detector", gray); waitKey(5000); system("pause"); destroyAllWindows(); return 0; }
Картинка, например, такая вот:
-
https://www.dropbox.com/s/u4x5r1m81g7imz0/2014-03-30-14-09-02.jpg
https://www.dropbox.com/s/ry7exxjhncr8rea/2014-03-30-14-09-01.jpg
https://www.dropbox.com/s/kn134v8hb92773i/2014-03-30-14-08-45.jpg
https://www.dropbox.com/s/atduq50p4cbcw4b/2014-03-30-14-08-50.jpg
https://www.dropbox.com/s/cf9y9wjkkd5rsqm/2014-03-30-14-08-57.jpg
Оптический поток
в OpenCV
Опубликовано · Report reply
В общем мне сказали, что надо использовать кластеризацию к-means. Проблема в том, что при реализации, которая представлена ниже выводится только один кадр. Как сделать, чтобы шел непрерывный видеопоток?