1

どこかから画像を取得する主な機能があり、新しいスレッド内に表示する必要があります。これは私がやっていることです:

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 フレーム」イメージを (そのコンストラクターを介して) 派生スレッドに渡そうとしない限り、単純な 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_;
}

Thread のサブクラスは次のようになります。

/* ********************* 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() で実行が中断されます...この問題の原因や解決方法について何か考えはありますか?

4

1 に答える 1

0

問題は解決しました。誰かが同様の問題を抱えている場合は、OpenCV プロジェクト全体を Intel TBB サポートで再構築する必要があります。(OpenCV 2.3.1 では問題なく動作しています)

于 2012-04-22T09:24:51.047 に答える