gpt4 book ai didi

c++ - openCV 和线程问题

转载 作者:太空宇宙 更新时间:2023-11-04 14:23:48 25 4
gpt4 key购买 nike

我正在尝试在我的 QT 代码上安装来自 openCV 的面部检测,一切运行良好,直到我决定为我的 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();
}

非常感谢!

最佳答案

只有当 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 ); 的调用;

在添加面部检测等花哨的东西之前,请始终确保您的应用程序满足最低要求。我的最终建议是:编写足够多的代码来从一个线程捕获图像并将它们显示在窗口上,然后再从那里开始。

关于c++ - openCV 和线程问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5638934/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com