2011-04-11 51 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