ProgRoman 9 Жалоба Опубликовано May 29, 2012 Добрый день, у меня вопрос я повторил программу cascade-classifier вообщем то всё работает ниже приведён текст программы, но она очень сильно тормозит т.е. каждый кадр обрабатывается долго, в программе по ссылке я так понимаю программа работает в реальном времени.. в моей же версии она очень сильно тормозит... // testdetect.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> #include <opencv2\ml\ml.hpp> #include <opencv2\features2d\features2d.hpp> #include <opencv2\objdetect\objdetect.hpp> #include <opencv2\video\tracking.hpp> #include <Windows.h> #include <string.h> #include <iostream> #include <stdio.h> #include <math.h> using namespace cv; using namespace std; #define MAX(a, ((a< ? b : a); #define MIN(a, ((a< ? a : ; String face_cascade_name = "haarcascade_frontalface_alt.xml"; String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; String window_name = "tracing face"; CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; void detectAndDisplay( Mat frame ) { vector<Rect> faces; Mat frame_gray; cvtColor( frame, frame_gray, CV_BGR2GRAY ); equalizeHist( frame_gray, frame_gray ); //-- Detect faces face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); for( int i = 0; i < faces.size(); i++ ) { Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 ); ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 ); Mat faceROI = frame_gray( faces[i] ); std::vector<Rect> eyes; //-- In each face, detect eyes eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) ); for( int j = 0; j < eyes.size(); j++ ) { Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 ); int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 ); circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 ); } } //-- Show what you got imshow( window_name, frame ); } int _tmain(int argc, char** argv) { VideoCapture cap; cap.open("video.mp4"); face_cascade.load(face_cascade_name); eyes_cascade.load(eyes_cascade_name); if(!cap.isOpened()) return -1; while(true) { Mat frame; cap >> frame; if(frame.empty()) break; detectAndDisplay( frame ); //imshow("video",frame); char c = waitKey(10); if(c==27) break; } return 0; } [/code] Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
JoQeR 0 Жалоба Опубликовано May 29, 2012 Добрый день, у меня вопрос я повторил программу cascade-classifier вообщем то всё работает ниже приведён текст программы, но она очень сильно тормозит т.е. каждый кадр обрабатывается долго, в программе по ссылке я так понимаю программа работает в реальном времени.. в моей же версии она очень сильно тормозит... // testdetect.cpp: определяет точку входа для консольного приложения. // #include "stdafx.h" #include <opencv2\core\core.hpp> #include <opencv2\highgui\highgui.hpp> #include <opencv2\imgproc\imgproc.hpp> #include <opencv2\ml\ml.hpp> #include <opencv2\features2d\features2d.hpp> #include <opencv2\objdetect\objdetect.hpp> #include <opencv2\video\tracking.hpp> #include <Windows.h> #include <string.h> #include <iostream> #include <stdio.h> #include <math.h> using namespace cv; using namespace std; #define MAX(a, ((a< ? b : a); #define MIN(a, ((a< ? a : ; String face_cascade_name = "haarcascade_frontalface_alt.xml"; String eyes_cascade_name = "haarcascade_eye_tree_eyeglasses.xml"; String window_name = "tracing face"; CascadeClassifier face_cascade; CascadeClassifier eyes_cascade; void detectAndDisplay( Mat frame ) { vector<Rect> faces; Mat frame_gray; cvtColor( frame, frame_gray, CV_BGR2GRAY ); equalizeHist( frame_gray, frame_gray ); //-- Detect faces face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); for( int i = 0; i < faces.size(); i++ ) { Point center( faces[i].x + faces[i].width*0.5, faces[i].y + faces[i].height*0.5 ); ellipse( frame, center, Size( faces[i].width*0.5, faces[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 ); Mat faceROI = frame_gray( faces[i] ); std::vector<Rect> eyes; //-- In each face, detect eyes eyes_cascade.detectMultiScale( faceROI, eyes, 1.1, 2, 0 |CV_HAAR_SCALE_IMAGE, Size(30, 30) ); for( int j = 0; j < eyes.size(); j++ ) { Point center( faces[i].x + eyes[j].x + eyes[j].width*0.5, faces[i].y + eyes[j].y + eyes[j].height*0.5 ); int radius = cvRound( (eyes[j].width + eyes[j].height)*0.25 ); circle( frame, center, radius, Scalar( 255, 0, 0 ), 4, 8, 0 ); } } //-- Show what you got imshow( window_name, frame ); } int _tmain(int argc, char** argv) { VideoCapture cap; cap.open("video.mp4"); face_cascade.load(face_cascade_name); eyes_cascade.load(eyes_cascade_name); if(!cap.isOpened()) return -1; while(true) { Mat frame; cap >> frame; if(frame.empty()) break; detectAndDisplay( frame ); //imshow("video",frame); char c = waitKey(10); if(c==27) break; } return 0; } [/code] Значительно повысить производительность поможет подбор параметров, но скорее снизит качество детектирования. Нужно найти оптимальный оптимум. Здесь поувеличивай масштаб "1,1" или окошко скана не 30х30, а примерно 60х60. //-- Detect faces face_cascade.detectMultiScale( frame_gray, faces, 1.1, 2, 0|CV_HAAR_SCALE_IMAGE, Size(30, 30) ); Привожу пример подобного кода, только с выделением лица, без глаз. [code] // FaceDetectAndTrack.cpp #include <stdafx.h> #include <cv.h> #include <highgui.h> #include <stdlib.h> #include <stdio.h> #include <string> #include <iostream> using namespace std; using namespace cv; void detectFace(IplImage *FaceIm); //Глобальные переменные CvSeq * pFaceRectSeq; // list of detected faces CvHaarClassifierCascade * pCascade; // каскад для нахождения лиц CvMemStorage * pStorage; // хранилище памяти int main( int argc, const char** argv ){ IplImage * pInpImg; const char* cascade_name = "haarcascade_frontalface_alt.xml"; pStorage = cvCreateMemStorage(0); pCascade = (CvHaarClassifierCascade *)cvLoad(cascade_name, 0, 0, 0 ); // initializations //* filename = argc == 2 ? argv[1] : "d:/StudentDetect1.jpg"; //IplImage * pInpImg = cvLoadImage(filename,1); //Проверка инициализируемых данных if( !pInpImg || !pStorage || !pCascade ){ printf("Initialization failed: %s \n", (!pInpImg)? "didn't load image file" : (!pCascade)? "didn't load Haar cascade -- " "make sure path is correct" : "failed to allocate memory for data storage"); exit(-1); } CvCapture *capture = cvCreateCameraCapture(CV_CAP_ANY); //CvCapture *capture = cvCreateCameraCapture(1); assert(capture); while(true){ pInpImg = cvQueryFrame( capture ); //Применяем функцию детектирования к каждому кадру detectFace(pInpImg); // показываем cvShowImage("Haar Window", pInpImg); char c = cvWaitKey(33); if (c == 27) { // нажата ESC break; } } // display face detections //cvShowImage("Haar Window", pInpImg); //cvWaitKey(0); //показываем результат в окне cvDestroyWindow("Haar Window"); //освобождаем все ресурсы cvReleaseImage(&pInpImg); if(pCascade) cvReleaseHaarClassifierCascade(&pCascade); if(pStorage) cvReleaseMemStorage(&pStorage); return 0; } void detectFace(IplImage *FaceIm){ int i; // Применяем функцию детектирования с заданными параметрами pFaceRectSeq = cvHaarDetectObjects (FaceIm, pCascade, pStorage, 1.2, // increase search scale by 10% each pass 6, // drop groups of fewer than three detections //CV_HAAR_DO_ROUGH_SEARCH //|CV_HAAR_SCALE_IMAGE CV_HAAR_DO_CANNY_PRUNING, // skip regions unlikely to contain a face cvSize(50,50)); // use XML default for smallest search scale // create a window to display detected faces cvNamedWindow("Haar Window", CV_WINDOW_AUTOSIZE); // draw a rectangular outline around each detection for(i=0;i<(pFaceRectSeq? pFaceRectSeq->total:0); i++ ){ CvRect * r = (CvRect*)cvGetSeqElem(pFaceRectSeq, i); CvPoint pt1 = { r->x, r->y }; CvPoint pt2 = { r->x + r->width, r->y + r->height }; cvRectangle(FaceIm, pt1, pt2, CV_RGB(0,255,0), 3, 4, 0); } } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 29, 2012 Добавьте ключ CV_HAAR_FIND_BIGGEST_OBJECT к cvHaarDetectObjects. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано May 30, 2012 кстати говоря обученные готовые каскады только haarcascade_frontalface_alt.xml ? Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано May 30, 2012 спасибо параметры подкрутил вроде бы заработало быстрее конечно.. возник вопрос есть ли базы данных с обученными каскадами к примеру автомобилей, каких-то животных к примеру кошки собаки и другие нашёл ролик по детекции автомобилей с уже обученным каскадом ссылка повторить удалось но единственно начал проверять на других видео и оказалось, что он довольно плохо работает с автомобилями которые проезжают мимо он их будто вообще не видит к примеру когда автомобиль обгоняет вас или наоборот вы обгоняете другой автомобиль как это можно исправить Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано May 30, 2012 у меня ещё вопрос как сделать полный трекинг объекта у меня сейчас выделяются автомобили в кадрах, но они выделяются а потом хотя автомобиль и есть он не выделяется я бы хотел сделать, что бы можно было сопровождать этим выделением все автомобили пока он видим для камеры, а не только первые кадры когда есть автомобиль а потом выделение куда-то пропадает ниже код он практически не изменился String cascade_name1 = "haarcascade_car_1.xml"; String cascade_name2 = "cars3.xml"; String window_name = "tracing objects"; CascadeClassifier cascade1; CascadeClassifier cascade2; void detectAndDisplay(Mat frame) { vector<Rect> objects1; vector<Rect> objects2; Mat frame_gray; cvtColor(frame, frame_gray, CV_BGR2GRAY); equalizeHist(frame_gray, frame_gray); //-- Detect cascade1.detectMultiScale(frame_gray, objects1, 1.2, 2, 0|CV_HAAR_SCALE_IMAGE, Size(60, 60)); cascade2.detectMultiScale(frame_gray, objects2, 1.2, 2, 0|CV_HAAR_SCALE_IMAGE, Size(60, 60)); for( int i = 0; i < objects1.size(); i++ ) { Point center( objects1[i].x + objects1[i].width*0.5, objects1[i].y + objects1[i].height*0.5 ); ellipse( frame, center, Size( objects1[i].width*0.5, objects1[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 ); Mat objROI = frame_gray( objects1[i] ); } for( int i = 0; i < objects2.size(); i++ ) { Point center( objects2[i].x + objects2[i].width*0.5, objects2[i].y + objects2[i].height*0.5 ); ellipse( frame, center, Size( objects2[i].width*0.5, objects2[i].height*0.5), 0, 0, 360, Scalar( 255, 0, 255 ), 4, 8, 0 ); Mat objROI = frame_gray( objects2[i] ); } //-- Show what you got imshow( window_name, frame ); } int _tmain(int argc, char** argv) { VideoCapture cap; cap.open("racing.mp4"); if( !cascade1.load( cascade_name1 ) ){ printf("--(!)Error loading cascad!\n"); return -1; }; if( !cascade2.load( cascade_name2 ) ){ printf("--(!)Error loading cascad!\n"); return -1; }; if(!cap.isOpened()) return -1; while(true) { Mat frame; cap >> frame; if(frame.empty()) break; detectAndDisplay(frame); //imshow("video",frame); char c = waitKey(1); if(c==27) break; } return 0; } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано May 30, 2012 Ну, полный трекинг все хотят вот сюда посмотрите: http://www.compvision.ru/forum/index.php?showtopic=63&st=0 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
ProgRoman 9 Жалоба Опубликовано June 3, 2012 как можно сделать трекинг автомобилей если применять только каскад код был выше, то удовлетворительных результатов я пока не добился, бывает что он просто даже на кадре где есть машины не может отметить их (пишет что интересующих объектов нету)... возможно лучше будет оптический потом или что-то другое?.. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
AnDrOiD 0 Жалоба Опубликовано June 28, 2012 Очень нужен классификатор для локализации зрачка и радужной оболочки глаза. Гугл к сожалению не помог... может быть есть у кого то ? Новую тему уж создавать не стал... Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано June 28, 2012 Так вроде бы он стандартный есть в OpenCV. \opencv\data\haarcascades\haarcascade_eye.xml вполне сносно работает. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
AnDrOiD 0 Жалоба Опубликовано June 29, 2012 Как я понял, то с помощью этого каскада он локализует сам глаз, т.е. получается как тут: А мне нужно отдельно рудужную оболочку глаза и зрачок. Пример на прикрепленной картинке. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mrgloom 242 Жалоба Опубликовано June 29, 2012 называется iris detection, на форуме вроде бы уже обсуждалось. на вскидку http://code.google.com/query/#q=iris%20detection https://github.com/search?q=iris+detection&type=Everything&repo=&langOverride=&start_value=1 http://en.pudn.com/search_db.asp?keyword=iris+detection http://www.codesworks.com/soft/search.asp?act=content&keyword=iris%20detection http://www.codeforge.com/s/0/iris-detection http://stackoverflow.com/search?q=iris+detection http://www.mathworks.com/matlabcentral/fileexchange/?term=iris+detection 1 Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Smorodov 579 Жалоба Опубликовано July 13, 2012 Параметры каскадов (и сами каскады) для детекта глаз. http://yushiqi.cn/research/eyedetection Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах