2012-04-21 47 views
1

我有一個主要功能從某處拍攝圖像,並且應該在新線程中顯示圖像。這是我在做什麼:OpenCV,pthread - 在新線程中顯示圖像

int main(int argc, char** argv) 
{ 
    Mat frame = imread("img.jpg"); 

    auto_ptr<SomeClass> thread1(new SomeClass(1, frame)); 
    auto_ptr<SomeClass> thread2(new SomeClass(2, frame)); 

    thread1->Start(); 
    thread2->Start(); 

    int result1 = reinterpret_cast<int>(thread1->Join()); 
    int result2 = reinterpret_cast<int>(thread2->Join()); 

    return 0; 
} 

我發現有很多的源代碼來實現一個簡單的並行線程包裝類,哪些是行之有效的,只要我不嘗試通過「CV :: Mat框架「圖像到派生線程(通過它的構造函數)。

的並行線程包裝類:

/* ********************* THREAD.H ********************* */ 
extern "C++" class __declspec(dllexport) Thread 
{ 
public: 
    Thread(); 
    virtual ~Thread(void); 

    void Start(void); 
    void* Join(void); 

private: 
    virtual void* Run(void) = 0; 

    static void* StartThread(void* pVoid); 

    pthread_t threadID_; 
    pthread_attr_t threadAttribute_; 
    void* result_; 
}; 

/* ********************* THREAD.CPP ********************* */ 
Thread::Thread() {} 

Thread::~Thread() {} 

void* Thread::StartThread(void* pVoid) 
{ 
    Thread* aThread = static_cast<Thread*>(pVoid); 
    aThread->result_ = aThread->Run(); 
    return aThread->result_; 
} 

void Thread::Start() 
{ 
    pthread_attr_init(&threadAttribute_); 
    pthread_attr_setscope(&threadAttribute_, PTHREAD_SCOPE_SYSTEM); 

    pthread_create(&threadID_, &threadAttribute_, Thread::StartThread, (void*)this); 
    pthread_attr_destroy(&threadAttribute_); 
} 


void* Thread::Join() 
{ 
    pthread_join(threadID_, NULL); 
    return result_; 
} 

線程的子類可以看起來象下面這樣:

/* ********************* SOMECLASS.H ********************* */ 
extern "C++" class __declspec(dllexport) SomeClass : public Thread 
{ 
public: 
    SomeClass(int id, cv::Mat& frame); 
    ~SomeClass(void); 

    virtual void* Run(); 
private: 
    int id_; 
    cv::Mat frame_; 
}; 

/* ********************* SOMECLASS.CPP ********************* */ 
SomeClass::SomeClass(int id, cv::Mat& frame) : id_(id) 
{ 
    frame_ = frame.clone(); 
} 

SomeClass::~SomeClass(void) {} 

void* SomeClass::Run() 
{ 
    cout << id_ << ", " << frame_.cols << ", " << frame_.rows << endl; 

    imshow("frame " + id_, frame_); 
    waitKey(1); 

    return reinterpret_cast<void*>(id_); 
} 

執行處斷裂線imshow()...任何想法,這是什麼原因問題或我該如何解決?

+0

你有一個支持C++ 11的編譯器,還是可以訪問boost :: thread? – juanchopanza 2012-04-21 15:03:11

+0

它如何中斷?如果你在一個線程中執行它,它會工作嗎? – 2012-04-21 15:08:45

+0

我使用VS2010,哪一個不支持c + + 11,我不喜歡使用boost。 (編輯: 編輯: 它與「訪問衝突」剎車。它也可以在單線程中工作。 – Kornel 2012-04-21 15:19:05

回答

0

問題已解決。如果有人遇到類似的問題,那麼: 整個OpenCV項目需要通過英特爾®TBB支持進行重建。 (它與OpenCV 2.3.1很好地工作)