【发布时间】:2015-06-25 17:25:06
【问题描述】:
我在使用 opencv 的 MFC 中遇到一个关于线程的问题。让我先描述一下我的问题。我有一个用于显示来自摄像机的视频帧的 GUI。因此,我必须使用一个线程从摄像头获取视频并将其显示到GUI。它完成了。但是,我想扩展我的问题,例如:当视频显示时,我想通过命令在 opencv 的其他窗口中显示该视频
IplImage* image2=cvCloneImage(&(IplImage)original);
cvShowImage("Raw Image", image2);
cvReleaseImage(&image2);
据我所知,我需要在从摄像头获取视频的线程中创建一个新线程。有可能做到吗?看看我的代码,你能给我一些解决方案或建议来完成这项任务吗?非常感谢
这是我的代码
THREADSTRUCT *_param = new THREADSTRUCT;
_param->_this = this;
CWinThread* m_hThread;
m_hThread = AfxBeginThread (StartThread, _param);
在 StartThread 函数中,我将调用从摄像头加载视频,例如
UINT Main_MFCDlg::StartThread (LPVOID param)
{
THREADSTRUCT* ts = (THREADSTRUCT*)param;
cv::VideoCapture cap;
cap.open(0);
while (true)
{
Mat frame;
Mat original;
cap >> frame;
if (!frame.empty()){
original = frame.clone();
//Display video in GUI
CDC* vDC_VIDEO;
vDC_VIDEO=ts->_this->GetDlgItem(IDC_VIDEO)->GetDC();
CRect rect_VIDEO;
ts->_this->GetDlgItem(IDC_VIDEO)->GetClientRect(&rect_VIDEO);
//Is it possible to create a thread in here to show video with other
//delay time such as 1000ms
//To call the function cv::imshow("Second window", original);
}
if (waitKey(30) >= 0) break;// Delay 30ms for first window
}
}
注意线程结构看起来像
//structure for passing to the controlling function
typedef struct THREADSTRUCT
{
Main_MFCDlg* _this;
} THREADSTRUCT;
【问题讨论】:
-
当然可以在线程中创建线程。当你创建你的第一个线程时,你认为你在做什么?你的程序在它自己的线程中运行,而你又派生出另一个线程来做其他事情。
-
@NathanOliver:实际上,我必须控制每秒不同帧的视频显示。因为图像处理需要一些时间,因此我需要显示一个窗口是原始帧(看起来像实时由于没有图像处理),第二个窗口是图像处理,它可以有一些延迟。因此,第一个窗口看起来像真实的图像帧。第二个窗口是图像处理。
-
你必须小心不要从创建它的线程访问一个窗口,这有点禁忌。
-
我认为您不需要线程(或者更确切地说,另一个线程)来从相机获取图像。不过,在后台线程中执行一些操作可能是有意义的。无论如何,您的假设可能是错误的,这就引出了您的实际问题是什么的问题。
-
个人我不喜欢你的线程永远循环,它让我担心如何优雅地终止,(即从你的主线程)我也不喜欢 MFC 的线程自动删除,但这可能只是我太……
标签: c++ multithreading opencv visual-studio-2012 mfc