выпуск openCV и темы - PullRequest
       1

выпуск openCV и темы

1 голос
/ 12 апреля 2011

Я пытаюсь приспособить Facedetect от openCV к моему QT-коду, все работало нормально, пока я не решил создать поток для своего openCV-кода, чтобы я мог запускать другие вещи, пока включено распознавание лица.

проблема в том, если я вызываю class-> start ();моя программа прерывается в цикле while в run (), но если я вызываю class.run ();(как обычная функция) работает как обычно!что может быть не так?

код:

faceTracker::faceTracker()
{ 

qDebug("teste1");
filename = "/Users/marcomartins/Documents/QT/DisplUM/haarcascades/haarcascade_frontalface_alt_tree.xml";

/* load the classifier
    note that I put the file in the same directory with this code */
cascade = ( CvHaarClassifierCascade* )cvLoad( filename, 0, 0, 0 );

/* setup memory buffer; needed by the face detector */
storage = cvCreateMemStorage( 0 );

/* initialize camera */
capture = cvCaptureFromCAM( 0 );

/* always check */
assert( cascade && storage && capture );

/* create a window */
cvNamedWindow( "video DisplUM", 1 );


}

void faceTracker::detectFaces( IplImage *img )
{

/* detect faces */
        faces = cvHaarDetectObjects(
        img,
        cascade,
        storage,
        1.1,
        3,
        0 /*CV_HAAR_DO_CANNY_PRUNNING*/,
        cvSize( 40, 40 ) );

/* for each face found, draw a red box */
for( i = 0 ; i < ( faces ? faces->total : 0 ) ; i++ ) {
    CvRect *r = ( CvRect* )cvGetSeqElem( faces, i );
    cvRectangle( img,
                 cvPoint( r->x, r->y ),
                 cvPoint( r->x + r->width, r->y + r->height ),
                 CV_RGB( 255, 0, 0 ), 1, 8, 0 );
    qDebug("caras: %d", faces->total);
}

/* display video */
cvShowImage( "video", img );
}


void faceTracker::run( )
{
qDebug("teste2");

while( key != 'q' ) {
    /* get a frame */
    frame = cvQueryFrame( capture );
qDebug("teste3");
    /* always check */
    if( !frame ) break;

    /* 'fix' frame */
    cvFlip( frame, frame, 1 );
    frame->origin = 0;

    /* detect faces and display video */
    detectFaces( frame );

    /* quit if user press 'q' */
    key = cvWaitKey( 10 );

}

/* free memory */
cvReleaseCapture( &capture );
cvDestroyWindow( "video" );
cvReleaseHaarClassifierCascade( &cascade );
cvReleaseMemStorage( &storage );
}

основной код:

int main(int argc, char *argv[])
{
  faceTracker * ft = new faceTracker();
  ft->start();
}

большое спасибо!

Ответы [ 3 ]

0 голосов
/ 14 апреля 2011

Решение: я не могу создать окна вне основного потока, поэтому он зависал.Если я прокомментирую создание окна, все работает хорошо (обнаружение лица включено)

0 голосов
/ 18 апреля 2011

Я столкнулся с подобной проблемой. Я обнаружил, что мне пришлось пересобрать OpenCV и включить библиотеки TBB. Это добавляет поддержку потоков в OpenCV. Как только я это сделал, я смог открыть окна в любой теме, которую я выбрал. Я проверял это на версиях 2.1 и 2.2, используя реализации как на C, так и на C ++.

0 голосов
/ 12 апреля 2011

Цикл прервется, только если cvQueryFrame() вернет кадр NULL или если пользователь нажмет q на клавиатуре.

Добавьте отладку, чтобы вы знали, когда возникла первая ситуациябывает:

frame = cvQueryFrame( capture );
if( !frame ) 
{  
  qDebug("cvQueryFrame failed!");
  break;
}

Вы уверены, что cvCaptureFromCAM(0) работает?В зависимости от ОС я должен передать -1 для него.Но дело в том, что вы никогда не узнаете, успешно ли cvCaptureFromCAM(0), потому что вы не проверяете возврат, и это может быть проблемой!

capture = cvCaptureFromCAM(0);
if (!capture)
{
  qDebug("cvCaptureFromCAM failed!");
  //exit(0); or whatever
}

РЕДАКТИРОВАТЬ:

Обратите на это огромное внимание: вы создаете окно с именем "video DisplUM", но пытаетесь отобразить кадры в другом окне с именем "video".

В любом случае, также лучше, еслиВы измените функцию создания окна, чтобы использовать соответствующее перечисление:

cvNamedWindow("video DisplUM", CV_WINDOW_AUTOSIZE);

и faceTracker::run( ) comment detectFaces() на данный момент и добавьте вызов cvShowImage ("video DisplUM", frame);

Всегда убедитесь, что ваше приложение работает с минимальными требованиями, прежде чем добавлять модные вещи, такие как распознавание лиц.Последнее предложение: напишите достаточно кода, чтобы захватить изображения из одного потока и отобразить их в окне, а затем перейти оттуда.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...