MFC opencv多线程读取采集卡数据

lcx20073882 2012-06-10 07:39:04
这个真的是诡异啊,如果我写成这样
int main()
{
VideoCapture cap (0);
cout<<cap.isOpened()<<endl;
while(1)
{
int64 tt = getTickCount();
Mat image ;
cap>>image;
int64 tte = getTickCount();
cout<<"time:"<<(tte-tt)/getTickFrequency()*1000.0<<"(ms)"<<endl;
imshow("tt",image);
cvWaitKey(30);
//Sleep(40);
}
cap.release();
system("pause");
return 0 ;
}
这个程序一点问题都没有,但是如果写成mfc下多线程的形式,如下
UINT read_data_thread(LPVOID pd)
{

//这里读取视频文件
VideoCapture cap(0);

if(cap.isOpened())
{
while(1)
{
if( read_thread_is_over )
{
break;
}
Mat image;
Mat temp_image;
//先要判读storage_data是不是大于max_s_data啦
if(storage_data.size() < max_s_data )
{
cap>>image;
imshow("视频数据",image);
cvWaitKey(10);
if(image.data == NULL )
{
isend = true;
break;
}

if( !is_one_game_over)
{
image.copyTo(temp_image);
//这里将数据保存到storage_data中去啦
s_d_g_cs.Lock();
storage_data.push(temp_image);
s_d_g_cs.Unlock();
}

}
Sleep(10);
}
}
else
{
AfxMessageBox(_T("没有打开视频文件"));
}
cap.release();//释放采集接口
return NULL;
}
这就有问题了,不管怎么样,image出来的数据就是 不想要的,也就是读取不了视频采集卡内的数据,这真叫人郁闷啊!这到底是因为什么呢?望大家指点
...全文
548 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
hly100280029 2014-08-27
  • 打赏
  • 举报
回复
你的采集卡是什么型号的?opencv能直接读取?我的采集卡一直读取不成功
lcx20073882 2012-06-11
  • 打赏
  • 举报
回复
为了后者看到贴也能够解决问题,现在将解决的办法给说一下,就是要读取视频采集卡的话,将videocapture初始化与打开open都放到主线程中去,不要放到工作线程,这样就能够顺利的进行你的程序了。

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧