在MFC中显示用OpenCV获得的摄像头视频

wendy425 2010-02-26 11:30:16
主要在两个函数里进行了操作:
void CDemoDoc::OnBegin() //我自己做的一个按钮,在DOC类中通过测试没问题
{
// TODO: Add your command handler code here

capture = cvCreateCameraCapture(0);//capture是IplImage类型

if(!capture)
{
AfxMessageBox("error");
}

while(1){

m_img = cvQueryFrame(capture);//m_img 是IplImage类型
UpdateAllViews(NULL);//去更新View的OnDraw函数

}
}

void CDemoView::OnDraw(CDC* pDC)
{
CDemoDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

CImage img;
img.CopyOf(pDoc->m_img, 1);

CRect rect;
GetClientRect (&rect);
rect.right=img.Width();
rect.bottom=img.Height();
img.DrawToHDC(pDC->GetSafeHdc(), rect);
}


有几点声明:
1.凡是你看不到声明的变量我都设成了成员变量;
2.如果我在Doc类里用IplImage格式加载一幅静态图片,通过UpdateAllViews(NULL)使得它在View类中的OnDraw把它拷贝(img.CopyOf)到CImage可以顺利在View类里面显示出来;
3.于是,我就把在While循环把摄像头获得的每一帧IplImage,通过UpdateAllViews到OnDraw中去转换显示,程序如上,可是就是出来不了图像。摄像头没问题,因为我在Win32 Console程序中可以获得摄像头的视频,OpenCV 的库函数头文件都没有问题。

所以在此请教大家,这是怎么回事?我觉得思路没错啊!

...全文
1625 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
newmyxin 2012-05-06
  • 打赏
  • 举报
回复
楼主,小弟也在学习在MFC中如何应用OpenCV,能不能也给我发一下你的源码?在此不胜感激,
QQ:812979280谢谢了
ydzhaoguoli 2010-09-19
  • 打赏
  • 举报
回复
楼主,小弟也是刚刚学opencv最近正在为,怎样用MFC中的对话框显示摄像头的视频,看到你的帖子,估计已经解决,能不能给小弟发一份源代码,供小弟研习呀!在此不胜感激,QQ:568006120谢谢了
wendy425 2010-03-05
  • 打赏
  • 举报
回复
谢谢。
我的程序最开始就是用的UpdateAllViews(NULL)它会执行很多函数并且发送WM_PAINT消息,是可以更新的。
我现在想问:
怎样在Doc类里面用SendMessage()或者PostMessage()来发送WM_PAINT消息给View。只能用UpdateAllViews(NULL)这个函数?
黎大 2010-03-04
  • 打赏
  • 举报
回复
pDoc->updateallview似乎有这个函数吧?
我的程序里面没有用到按钮,但是能够播放图像
admirxue 2010-03-03
  • 打赏
  • 举报
回复
在dialog里用一个static 就能显示!
wendy425 2010-03-03
  • 打赏
  • 举报
回复
引用 4 楼 dirdirdir3 的回复:
引用 3 楼 tiantangxingkong 的回复:while(1){ m_img = cvQueryFrame(capture);//m_img 是IplImage类型 UpdateAllViews(NULL);//去更新View的OnDraw函数   } 你程序这样都不死掉!!!! 这东西是需要线程干的


UpdateAllViews最好不要在线程里用,线程里发消息就好了


我是在Doc类的一个函数里做的:
SendMessage(AfxGetApp()->GetMainWnd()->m_hWnd,WM_PAINT,0,0);
这样写有问题吗?怎么没反应?(现在还没有用线程,只是在测试怎样发送消息)
wendy425 2010-03-03
  • 打赏
  • 举报
回复
现在再请教一个问题:
怎样在Doc类里面用发送消息的方式给View类,让它重绘。

SendMessage(AfxGetApp()->GetMainWnd()->GetActiveWindow()->m_hWnd,WM_PAINT,0,0);
我在Doc类的某个函数里用上述语句做怎么OnPaint函数或者OnDraw函数没有反应啊?
wendy425 2010-03-03
  • 打赏
  • 举报
回复
哈哈,靓女,谢谢。我最先做的就是基于Dialog ,用Static或者Picture控件我都可以做成功,不过只是用定时器做了一下测试,没有用到线程。现在我就是想在SDI中做一下测试,遇到了上述问题。
dirdirdir3 2010-03-02
  • 打赏
  • 举报
回复
引用 3 楼 tiantangxingkong 的回复:
while(1){

m_img = cvQueryFrame(capture);//m_img 是IplImage类型
UpdateAllViews(NULL);//去更新View的OnDraw函数

  }
你程序这样都不死掉!!!!
这东西是需要线程干的



UpdateAllViews最好不要在线程里用,线程里发消息就好了
tiantangxingkong 2010-03-02
  • 打赏
  • 举报
回复
while(1){

m_img = cvQueryFrame(capture);//m_img 是IplImage类型
UpdateAllViews(NULL);//去更新View的OnDraw函数

}
你程序这样都不死掉!!!!
这东西是需要线程干的
solon2003 2010-02-28
  • 打赏
  • 举报
回复
你试着用按钮来启动线程来获取图像,而不是在按钮函数里做while(1),简单一点就是启动个定时器,在定时器里m_img = cvQueryFrame(capture);//m_img 是IplImage类型
UpdateAllViews(NULL);//去更新View的OnDraw函数
wendy425 2010-02-27
  • 打赏
  • 举报
回复
"capture = cvCreateCameraCapture(0);//capture是IplImage类型 "
我说错了,“//capture是cvCapture类型”

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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