-1

顔、鼻、目の検出にスレッドを使用するトレーニングを行っています。そうしないと、カメラの動作が非常に遅くなるためです。このコードを書きました。コードに間違いが見つかりません。しかし、コンパイルすると例外が発生します

taskCollection タブで pChore->m_pFunction(pChore); エラー。

    #include <iostream>
    #include "cv.h"
    #include "highgui.h"
    #include <pthread.h>
    #include <stdio.h>

    struct parameter_t{
        IplImage* capturedImg;
        CvHaarClassifierCascade* pCascade_face;
        CvMemStorage* storage;
    };

    void* threadface_func(void* parameter){

        CvSeq * detectRect_face;
        parameter_t *p =(parameter_t*)parameter;

        detectRect_face=cvHaarDetectObjects(p->capturedImg,p->pCascade_face,p->storage,1.15, 3, 0,cvSize(50,50));

        for(int i=0;i<(detectRect_face ? detectRect_face->total:0); i++ )
            {
                CvRect* r = (CvRect*)cvGetSeqElem(detectRect_face, i); 
                CvPoint pt1 = { r->x, r->y }; 
                CvPoint pt2 = { r->x + r->width, r->y + r->height }; 
                cvRectangle(p->capturedImg, pt1, pt2, CV_RGB(255,0,0), 1,8, 0); 

            }
        return 0;
    }

    int main ()
    {
            CvCapture* capture = cvCaptureFromCAM(0);
            IplImage* capturedImg;
            int resCount = 1;
            int flags = CV_HAAR_FIND_BIGGEST_OBJECT | CV_HAAR_DO_ROUGH_SEARCH;

            CvHaarClassifierCascade * pCascade_face;
            pthread_t threadface;


            pCascade_face = (CvHaarClassifierCascade *)cvLoad("C:/Users/Furkan/Desktop/Computer Vision/Programlar/opencv/data/haarcascades/haarcascade_frontalface_alt.xml");
            cvNamedWindow("FaceDetection");

            while (true)
            {

                CvMemStorage * storage = 0;
                capturedImg = cvQueryFrame(capture);
                storage = cvCreateMemStorage(0);

                parameter_t my_parameters;
                my_parameters.capturedImg=capturedImg;
                my_parameters.storage=storage;
                my_parameters.pCascade_face=pCascade_face;

                int k=pthread_create(&threadface,0,threadface_func,(void*)&my_parameters);

                if(k!=0)
                {
                    printf("Create thread failed! error");
                    return 1;
                }

                cvShowImage("FaceDetection", capturedImg);

            }

        cvDestroyWindow("FaceDetection");

        cvReleaseCapture(&capture);
        pthread_exit(NULL);
        return 0;
    }

助けてください。

4

1 に答える 1

0
  1. キャプチャから取得した IplImages は、videodriver-memory を指しています。それらを別のスレッドで使用するには、それらを clone() する必要があります。(なるほど、あなたはそれに引き込もうとしているようです)。
  2. 途方もない高速で新しいスレッドを生成しています。スレッドが終了するのを待つことはありません
  3. コードにロック/ミューテックスが表示されません

複数のスレッドを使用することをまったく再検討してください。少なくとも、このようには機能しません

(あなたのopencvバージョンとあなたのAPIの使用もアップグレードが必要なようです..)

于 2013-03-23T10:21:23.613 に答える