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

Каскады хаара

Recommended Posts

Добрый день, у меня вопрос я повторил программу 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]

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добрый день, у меня вопрос я повторил программу 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); } }

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Добавьте ключ CV_HAAR_FIND_BIGGEST_OBJECT к cvHaarDetectObjects.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

кстати говоря обученные готовые каскады только haarcascade_frontalface_alt.xml ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

спасибо параметры подкрутил вроде бы заработало быстрее конечно..

возник вопрос есть ли базы данных с обученными каскадами к примеру автомобилей, каких-то животных к примеру кошки собаки и другие

нашёл ролик по детекции автомобилей с уже обученным каскадом ссылка

повторить удалось но единственно начал проверять на других видео и оказалось, что он довольно плохо работает с автомобилями которые проезжают мимо он их будто вообще не видит к примеру когда автомобиль обгоняет вас или наоборот вы обгоняете другой автомобиль как это можно исправить

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

у меня ещё вопрос как сделать полный трекинг объекта у меня сейчас выделяются автомобили в кадрах, но они выделяются а потом хотя автомобиль и есть он не выделяется я бы хотел сделать, что бы можно было сопровождать этим выделением все автомобили пока он видим для камеры, а не только первые кадры когда есть автомобиль а потом выделение куда-то пропадает ниже код он практически не изменился


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;

}


Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну, полный трекинг все хотят :)

вот сюда посмотрите: http://www.compvision.ru/forum/index.php?showtopic=63&st=0

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

как можно сделать трекинг автомобилей если применять только каскад код был выше, то удовлетворительных результатов я пока не добился, бывает что он просто даже на кадре где есть машины не может отметить их (пишет что интересующих объектов нету)... возможно лучше будет оптический потом или что-то другое?..

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Очень нужен классификатор для локализации зрачка и радужной оболочки глаза.

Гугл к сожалению не помог... может быть есть у кого то ?

Новую тему уж создавать не стал...

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так вроде бы он стандартный есть в OpenCV.

\opencv\data\haarcascades\haarcascade_eye.xml

вполне сносно работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Как я понял, то с помощью этого каскада он локализует сам глаз, т.е. получается как тут:

FaceDetect.jpg

А мне нужно отдельно рудужную оболочку глаза и зрачок. Пример на прикрепленной картинке.

post-5742-0-44413200-1340973127_thumb.pn

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Параметры каскадов (и сами каскады) для детекта глаз.

http://yushiqi.cn/research/eyedetection

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×