マルチスレッドの顔検出器を実装しようとしています。問題は、カメラからいくつかのフレームをキャプチャして処理した後、プログラムが予期せず動作を停止することです。コードは次のとおりです。
cascadeClassifier cad;
class myThread: public QThread
{
private:
Mat threadRoi;
vector<Rect> faces;
protected:
void run()
{
cad.detectMultiScale(threadRoi,faces,1.4,4,CV_HAAR_DO_CANNY_PRUNING|CV_HAAR_FIND_BIGGEST_OBJECT,Size(30,30));
if ( !faces.empty())
rectangle(threadRoi,faces[0],Scalar(0,255,0),2);
}
public:
myThread(Mat &r)
{
threadRoi = r;
}
vector<Rect> getFaces()
{
return faces;
}
};
int main()
{
cad.load("C:/opencv/data/lbpcascades/lbpcascade_frontalface.xml");
VideoCapture cap(0);
Mat frame;
while(1)
{
if(!cap.read(frame)) break;
cvtColor(frame,frame_gray));
myThread a(frame_gray(Rect(0,0,frame.cols/2,frame.rows/2));
myThread b(frame_gray(Rect(frame.cols/4,0,frame.cols/2,frame.rows/2));
myThread c(frame_gray(Rect(frame.cols/2,0,frame.cols/2,frame.rows/2));
a.start();
b.start();
c.start();
a.wait();
b.wait();
c.wait();
}
return 0;
}
すべてのスレッドに共通の cascadeClassifier を使用すると、この問題が発生することに気付きました。各スレッドに個別の cascadeClassifiers を独自のプライベート クラス メンバーとして指定すると、正常に動作していました。しかし、スレッドが作成されるたびにメインループで、カスケードファイルをロードするたびにパフォーマンスが低下するようです。だから私の質問は、スレッドに共通のカスケードファイルがあるときにプログラムが停止するのはなぜですか?