我有一个关于MFC中使用opencv
的线程的问题。让我先描述一下我的问题。我有一个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;
当然,您可以在线程中创建线程。你的问题是:工作线程不应该直接在UI线程中访问UI对象,细节在这里解释
在工作线程中,后台作业完成后,可以使用SendMessage向GUI发送消息,并让它更新。