我正在尝试在我的QT代码上使用openCV的facedetect,所有运行正常,直到我决定为我的openCV代码创建一个线程,这样我可以在面部检测开启时运行另一个东西。
问题是如果我打电话给class-> start();我的程序在run()中的while循环中断,但是如果我调用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();
}
非常感谢!
答案 0 :(得分:0)
只有当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( )
评论detectFaces()
并添加对cvShowImage的调用(“video DisplUM”,frame);
在添加花哨的内容(如面部检测)之前,请务必确保您的应用程序符合最低要求。我的最终建议是:编写足够的代码来捕获一个线程中的图像并将其显示在窗口上,然后从那里开始。
答案 1 :(得分:0)
解决方案: 我不能在主线程之外创建窗口,这就是它崩溃的原因。如果我评论窗口创建一切正常(包括面部检测)
答案 2 :(得分:0)
我遇到了类似的问题。我发现我必须重建OpenCV并包含TBB库。这为OpenCV增加了线程支持。一旦我这样做,我就可以在我选择的任何线程中弹出窗口。我已经使用C和C ++实现在版本2.1和2.2上测试了它。