由于想做一个应用软件,把目前自己的算法应用出去,给给为研究者提供一丢丢便利,需要在MFC中显示视频流文件。我尝试了两种方法:opencv+MFC;openGL+MFC;这两种方法都可行。但是在使用opencv+MFC时,以为是设置双缓冲处有点问题,导致视频流闪烁严重。(实际是读取视频的问题,修改后应该可行,后面改用opengl做了,也出现了这样的问题,后来修改好了)。

1、首先需要加载一个Picture Control的控件;设置ID等
2、在CTrackingAppDlg.h(XXXDlg.h)中定义双缓冲区:

    HDC _hrenderDC; //DCHGLRC _hrenderRC; //RC

添加两个初始化函数:

bool CTrackingAppDlg::SetWindowPixelFormat(HDC hDC)
{PIXELFORMATDESCRIPTOR pixelDesc;  pixelDesc.nSize = sizeof(PIXELFORMATDESCRIPTOR);  pixelDesc.nVersion = 1;  pixelDesc.dwFlags = PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL |PFD_DOUBLEBUFFER |PFD_TYPE_RGBA;pixelDesc.iPixelType = PFD_TYPE_RGBA;pixelDesc.cColorBits = 32;pixelDesc.cRedBits = 0;  pixelDesc.cRedShift = 0;pixelDesc.cGreenBits = 0;pixelDesc.cGreenShift = 0;pixelDesc.cBlueBits = 0;pixelDesc.cBlueShift = 0;  pixelDesc.cAlphaBits = 0;  pixelDesc.cAlphaShift = 0;  pixelDesc.cAccumBits = 0;  pixelDesc.cAccumRedBits = 0;  pixelDesc.cAccumGreenBits = 0;  pixelDesc.cAccumBlueBits = 0;  pixelDesc.cAccumAlphaBits = 0;  pixelDesc.cDepthBits = 0;  pixelDesc.cStencilBits = 1;  pixelDesc.cAuxBuffers = 0;  pixelDesc.iLayerType = PFD_MAIN_PLANE;  pixelDesc.bReserved = 0;  pixelDesc.dwLayerMask = 0;  pixelDesc.dwVisibleMask = 0;  pixelDesc.dwDamageMask = 0;  _pixelFormat = ChoosePixelFormat(hDC,&pixelDesc);  if( _pixelFormat==0 ) // Choose default  {  _pixelFormat = 1;  if(DescribePixelFormat(hDC,_pixelFormat,  sizeof(PIXELFORMATDESCRIPTOR),&pixelDesc)==0)  {  return false;  }  } if(SetPixelFormat(hDC,_pixelFormat,&pixelDesc)==FALSE)  {   return false;  }  return true;
}BOOL CTrackingAppDlg::CreateViewGLContext(HDC hDC)
{  _hrenderRC = wglCreateContext(hDC);  if(_hrenderRC==NULL)  return FALSE;  if(wglMakeCurrent(hDC,_hrenderRC)==FALSE)  return FALSE; return TRUE;
}  

3、在InitDialog函数中初始化;

    //读取Picture控件的大小;CRect picRect;CWnd *wnd = GetDlgItem(IDC_PIC_RAW);wnd->GetWindowRect(&picRect);//用于设置图片显示的ViewPort窗口_app->getRawPictureView(i)->setViewPort(picRect.Width(),picRect.Height());

初始化并设置Opengl显示属性等:

_hrenderDC = ::GetDC(wnd->m_hWnd);
///////////////////////////////////////////Tian///////////////////////////if(SetWindowPixelFormat(_hrenderDC)==FALSE)  return 0;  if(CreateViewGLContext(_hrenderDC)==FALSE)  return 0;  glPolygonMode(GL_FRONT,GL_FILL);  glPolygonMode(GL_BACK,GL_FILL);  //////////////////////////////////////////////////////glEnable(GL_TEXTURE_2D);  glShadeModel(GL_SMOOTH);  //它负责把视景体截取的图像按照怎样的高和宽显示到屏幕上。//glViewport(0,0,259,231);  glMatrixMode(GL_PROJECTION);  glLoadIdentity();  /*      gluPerspective(45,1,0.1,100.0);  glMatrixMode(GL_MODELVIEW);  glLoadIdentity(); */ glShadeModel(GL_SMOOTH);       // Enable Smooth Shading  glClearColor(1.0f, 1.0f, 1.0f, 0.5f);    // Black Background  glClearDepth(1.0f);         // Depth Buffer Setup  glEnable(GL_DEPTH_TEST);       // Enables Depth Testing  glDepthFunc(GL_LEQUAL); // The Type Of Depth Testing To Do  glEnableClientState(GL_VERTEX_ARRAY);  glEnableClientState(GL_TEXTURE_COORD_ARRAY);  glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);//缓存模式SetTimer(1,10,0);//每隔10ms执行Ontimer函数一次,将Reshape放在Ontimer中可以动态更换图片   

5、OnTimer类:

void CTrackingAppDlg::OnTimer(UINT_PTR nIDEvent)
{//showImage(picView->getRawImage(),IDC_PIC_RAW);//showImage(picView->getBitImage(),IDC_PIC_BIT);wglMakeCurrent(_hrenderDC , _hrenderRC);glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);if(_app){for(int i=0;i<2;i++)_app->getRawPictureView(i)->reshape();}SwapBuffers(_hrenderDC);CDialogEx::OnTimer(nIDEvent);
}

初始化部分就这么多,其他的与opengl使用相同。不懂的自己多补一点opengl相关基础。
reshape函数如下:

void RawPicView::reshape()
{glMatrixMode(GL_PROJECTION);glLoadIdentity();glOrtho( -1.0, 1.0, -1.0, 1.0, -40.0, 40.0 );//  glMatrixMode(GL_MODELVIEW);if(_ChannelId == 0)glViewport(0,0,_rectWight/2-5,_rectHight);elseglViewport(_rectWight/2+5,0,_rectWight/2-5,_rectHight);glLoadIdentity();glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);if(!_initialized)initlize();glDisable(GL_LIGHTING);glEnable(GL_TEXTURE_2D);glBindTexture(GL_TEXTURE_2D, _textureId );if( !_valid )replaceTexture();glColor3f( 1.0, 1.0, 1.0 );glBegin(GL_QUADS); // Drawing Using Triangles  ////////////////////////Tian//////////////////////////////////////////////glTexCoord2f( 0.0, 0.0 );glVertex2f( -1.0, 1.0f );glTexCoord2f( 0.0, 1.0 );glVertex2f( -1.0, -1.0);    glTexCoord2f( 1.0, 1.0 );glVertex2f( 1.0, -1.0);glTexCoord2f( 1.0, 0.0 );glVertex2f( 1.0, 1.0 ); //////////////////////////////////////////////////////////////////////////glEnd();}

当然还是给个结果比较好:
效果如下:

MFC+OpenGL显示视频流图片相关推荐

  1. MFC上显示GIF图片(使用 GIF Animation Control控件)

    昨晚到现在一直寻思着在MFC的Dialog上显示个GIF图片,无奈如此的有难度,经过寻找找到个好用的控件,拿来用了,但是官网给的不是很好使.也缺乏一个文件,我这里一起整理出来了.说个过程 1:一共需要 ...

  2. QOpenGLWidget显示视频流数据

    使用QOpenGLWidget显示 QT中的QOpenGLWidget底层是使用opengl库,是对opengl的再封装.使用QOpenGLWidget类时,我们仅需继承QOpenGLWidget,仅 ...

  3. MFC使用滚动条显示大图片

    本文提供两种方法来解决MFC中使用滚动条来显示大图片的问题. 方法1: 直接使用MFC中的滚动条控件,关键代码如下 void CScrollPicDlg::OnHScroll(UINT nSBCode ...

  4. MFC显示Mat图片

    Opencv在1.0时代,在MFC框架上显示图片可以通过Cvvimage类里的DrawPicToHDC( IplImage *img, UINT ID)方法方便的显示出来,当然当时使用的还是IpIIm ...

  5. vs2015+opencv3.2+mfc读取摄像头显示在图片控件Picture Control

    vs2015 + opencv3.3 + mfc读取摄像头显示在图片控件Picture Control 要开始做一个行人检测的小项目,首先读取出摄像头显示,参考了这位博主的教程:http : //bl ...

  6. C语言用句柄显示bmp图片,VC编程之VC MFC界面上显示BMP图片

    本文主要向大家介绍了VC编程之VC MFC界面上显示BMP图片,通过具体的内容向大家展示,希望对大家学习VC编程有所帮助. 1.通过点击界面浏览按钮选择BMP图像文件. 点击浏览按钮打开文件对话框选择 ...

  7. 调用opencv3.x 库,在MFC中显示图片

    调用opencv3.x 库,在MFC中显示图片 使用opencv和MFC显示图片的方法大致分为以下几种: 1:将opencv的显示对话框嵌入到MFC窗口. 2:使用CvvImage类显示图片. 3:将 ...

  8. opencv在mfc窗口显示图片

    mfc显示mat图片的两种方式 方式一:将opencv的窗口嵌入到mfc的窗口内 将opencv窗口与mfc窗口绑定之后就可以通过cv::imshow("video",img)显示 ...

  9. MFC对话框显示图片(使用Picture控件)

    //************************************************************************************************** ...

最新文章

  1. 更新不了_一个作者在起点中文网写小说,半年更新38万字,还是没签约成功
  2. iOS开发-NSString去掉所有换行及空格
  3. CentOS中安装git
  4. MATLAB数字信号处理函数
  5. Chrome浏览器查看cookie
  6. MySQL - InnoDB特性 - Buffer Pool漫谈
  7. 随便选一张扑克牌_教大家怎么快速记忆扑克牌?一学就会
  8. Under the Hoods of Cache Fusion, GES, GRD and GCS
  9. 计算机word艺术字形状设置,4.11 Word 2016 自定义艺术字的形状效果,制作漂亮的艺术字...
  10. Mac如何设置允许和iCloud之间使用接力功能?
  11. 【bzoj1593-预定旅馆】线段树维护连续区间
  12. 深度优先搜索 - 最短路径
  13. 反向题在测试问卷信效度_问卷信度效度检验
  14. c# wia摄像_使用WIA捕获网络摄像机的视频-不可能吗?
  15. html正方形符号,HTML特殊字符显示
  16. 科学防疫宣传实践总结报告
  17. JAVA教材(推荐新手学习)
  18. excel自动计算体育成绩
  19. rd,pe,ae,fae,marketing,sales都是干嘛的?
  20. “喜茶Go”微信小程序新零售商业实战案例经验分享-概述

热门文章

  1. Docker容器 Dead 状态分析
  2. vs2010 LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
  3. 英文学习20180410
  4. Android--微信支付
  5. 配置网卡和修改ip地址
  6. python CNKI知网论文数据爬取
  7. 最新哔哩哔哩视频弹幕播放器源码+带后台/亲测无错误
  8. python爬取微博数据词云_用Python爬取微博数据生成词云图片
  9. 一般空间曲线的旋转曲面、椭球面、单叶双曲面,双叶曲面
  10. python自动化测试简历模板_自动化测试工程师简历封面模板下载