2011-04-11 61 views
1

我使用两个线程:清爽问题,使用的OpenCV线程

线程1是一个从相机拍摄的帧并处理它们 线程2是使用cvshowimage

它们显示在一个

在我使用cvWaitKey(200)的第二个线程中; (我也试过其他值..)

问题是,第一个图像显示,但一段时间后,他们不再是(当你尝试移动窗口时发生相同的情况 它冻结,有时图像变为空白..

任何想法如何,我可以解决这个问题

编辑:?? 当我告诉在线程图片我失去帧它应该是正常

EDIT2: 我试着也可以在线程中直观显示2个较旧的帧在新的,但相同的输出..

EDIT3的: 这是我在做什么或多或少:

void *showImages(void *ptr) 
{ 
    bool showit = false; 
    while (!MainThreadHasFinished) 
    { 

    pthread_mutex_lock(&mutex1); 
    if(ImageGenerated = true) 
     showit = true; 
    else 
     showit = false; 
    pthread_mutex_unlock(&mutex1); 

    showit = true; 

    if(showit == true) 
    cvShowImage("RGB Image", RGBImage); 

    cvWaitKey(500); 
}} 


IplImage *RGBImage; 
pthread_mutex_t mutex1 = PTHREAD_MUTEX_INITIALIZER; 
bool ImageGenerated; 

int main(int argc, char** argv) 
{ 
//init camera and other stuff 
    int frameCounter=0; 
    RGBImage = cvCreateImage(cvSize(RGB_RES_X,RGB_RES_Y),8,3); 
    int iret1 = pthread_create(&showImagesThread, NULL, showImages, (void*) message1); 

    for (;;) { 
    pthread_mutex_lock(&mutex1); 
    ImageGenerated = false; 
    pthread_mutex_unlock(&mutex1); 

     //get frame here in showImg 

    frameCounter++; 
    if(frameCounter == 10) frameCounter=0; 

    if(frameCounter == 2) 
     cvCopy(&showImg,RGBImage); 
    pthread_mutex_lock(&mutex1); 
    ImageGenerated = true; 
    pthread_mutex_unlock(&mutex1); 

//other stuff 
} 

} 

干杯

+0

怎么了这条线“if(ImageGenerated = true)”?你想要“==”而不是“=”? – johnnycrash 2011-04-12 04:38:56

+0

这是在Win平台上吗?你用过pthreads-win32吗? – coder9 2011-11-16 20:22:09

回答

0

我不知道,试图上显示的东西来自另一个线程的GUI是一个非常好的主意。除非我误解了你的意思,否则你应该直接从GUI线程调用cvshowimage

+0

问题是,cvshowimage需要cvWaitKey(X),然后如果我在主线程中显示图像,我会松开框架,因为X使我松散ms(框架可能到达) – nanz 2011-04-11 10:46:51

+0

在代码中发布代码,无需代码,它是很难。 – 2011-04-11 10:48:45

+0

它是整个代码的一千行,我打算发布一个案例基本代码来解释更好的确定 – nanz 2011-04-11 10:51:19