OpenCV,pthread - 在新线程中显示图像

Posted

技术标签:

【中文标题】OpenCV,pthread - 在新线程中显示图像【英文标题】:OpenCV, pthread - show image within a new thread 【发布时间】:2012-04-21 14:59:01 【问题描述】:

我有一个从某个地方获取图像的主函数,它应该显示在一个新线程中。这就是我正在做的:

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;

我找到了许多实现简单 pthread 包装类的源代码,只要我不尝试将“cv::Mat frame”图像传递给派生线程(通过其构造函数) )。

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() 处中断...知道什么会导致此问题或我该如何解决?

【问题讨论】:

你有支持c++11的编译器,或者访问boost::thread吗? 它是怎么破的?如果你在一个线程中执行它是否有效? 我用的是VS2010,不支持c++11,不喜欢用boost。编辑:它因“访问冲突”而刹车。很好地写入分辨率(frame_.cols 和 frame_.rows),然后在 imshow() 行刹车。它也可以在单个线程中工作。 【参考方案1】:

问题已解决。如果有人遇到类似的问题,那么: 整个 OpenCV 项目需要在英特尔 TBB 支持下重建。 (它与 OpenCV 2.3.1 配合得很好)

【讨论】:

以上是关于OpenCV,pthread - 在新线程中显示图像的主要内容,如果未能解决你的问题,请参考以下文章

在简单的 C++ OpenCV 项目中使用 pthread

在新线程内调用OpenCV函数Canny()会导致分段错误

如何在 LLVM 中获取函数指针

Linux_多线程(进程与线程的联系_pthread库_线程创建_线程等待_线程正常终止_线程取消_线程分离_pthread_t与LWP)

pthreads 进程未显示在 ps 输出中

ps显示线程名称