OpenCV,pthread - 在新线程中显示图像
OpenCV, pthread - show image within a new thread
>我有一个从某处拍摄图像的主函数,它应该显示在新线程中。这就是我正在做的:
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()...知道什么会导致此问题或我该如何解决它吗?
问题已经解决。如果有人遇到类似的麻烦,那么:整个 OpenCV 项目需要在英特尔 TBB 支持下进行重建。(它与OpenCV 2.3.1配合得很好)
相关文章:
- 从不同线程使用int64的不同字节安全吗
- 主函数跳过线程并且不加入以显示所需的输出
- Apache 崩溃并显示错误 R6016 没有足够的空间来存储线程数据
- 如何在对话框编辑框中显示来自 UI 线程类 Run() 函数的字符串
- 在状态栏上显示来自不同线程中回调的消息
- C OPENCV图像在Boost线程中不显示
- 任务管理器显示的线程比我创建的线程多
- 显示Q对话框时出现QT线程问题
- 对于多线程应用程序中的显示任务,原子锁或互斥锁是必须的吗
- 线程和进程的示例来显示差异
- 尝试显示线程优先级时出现分段错误
- cv::imshow 在不同的线程上不显示 cv::mat 颜色
- 线程不刷新数据,在屏幕中显示数据时出错
- 为什么Visual Studio显示多个线程,即使我的MFC应用不是多线程的?
- 当在线程命名后附加调试器时,本地c++线程名称不会显示在visual studio线程窗口中
- 我如何在另一个线程Qt显示MessageBox
- 多线程:如何在wxthread中使显示图像的GUI线程和处理图像同步的工作线程无阻塞
- 来自回溯的堆栈跟踪未显示导致多线程环境下崩溃的方法
- 提升线程示例显示错误,它无法匹配调用"boost::线程::线程(<未解析的重载函数类型>)"的函数
- 如何从视频播放器的辅助线程在主窗口中显示