2012-04-21 10 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をパスしようとしないように、ものがうまく働いているシンプルなpthreadのラッパークラスを実装するために多くのソースコードを発見した::マットフレーム "イメージを(そのコンストラクタを介して)派生スレッドに渡します。

pthreadのラッパークラス:

/* ********************* 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_; 
} 

スレッドのサブクラスは、以下のようになります:行関数imshowで

/* ********************* 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_); 
} 

実行ブレーク()...何がこれを引き起こす可能性があること任意のアイデア問題や解決方法は?

+0

C++ 11をサポートするコンパイラ、またはboost :: threadへのアクセスはありますか? – juanchopanza

+0

どのように壊れますか?あなたが1つのスレッドでそれを行うなら、それは動作しますか? –

+0

私はVS2010を使用していますが、これはC++ 11をサポートしていません。私はboostを使用したくありません。 EDIT: "アクセス違反"が発生しました。解決策(frame_.colsとframe_.rows)をうまく書き込んだ後、imshow()行でブレークします。また、単一スレッドでも動作します。 – Kornel

答えて

0

問題は解決されました。誰かに同様の問題がある場合は、 OpenCVプロジェクト全体をインテル®TBBで再構築する必要があります。 (OpenCV 2.3.1とうまくいっています)

関連する問題