彻底解决MFC/C#中在控件上播放opencv的Mat类型帧视频-亲测满足实时性要求
来源:互联网 发布:嘉兴职业技术学院网络 编辑:程序博客网 时间:2024/06/06 00:51
做MFC+opencv项目时,对于我来说,将视频显示到相应控件上(static或者picture)这个问题一直存在,虽然之前写个一个帖子,介绍了一种将opencv的显示window贴到相应控件上的方法,代码很少,使用简单。但或多或少感觉这种方法总是欠缺点什么。今天无聊时翻知乎,看到几年前几个大神的讨论,地址:https://www.zhihu.com/question/29611790,感觉很不错,总结了BrightGuo老师的方法,自己写代码跑了一下,确实不错,贴出来亮一亮!
/* *显示视频 HWND Mat */void ShowMat(Mat img, HWND hWndDisplay){if (img.channels() == 1){//调整图片与显示控件大小一致RECT rect;GetClientRect(hWndDisplay, &rect);Mat imgShow(abs(rect.top - rect.bottom), abs(rect.right - rect.left), CV_8UC1);resize(img, imgShow, imgShow.size());ATL::CImage CI;int w = imgShow.cols;//宽 int h = imgShow.rows;//高 int channels = imgShow.channels();//通道数 CI.Destroy();//防止重复创建导致程序崩溃CI.Create(w, h, 8 * channels);RGBQUAD* ColorTable;int MaxColors = 256;ColorTable = new RGBQUAD[MaxColors];CI.GetColorTable(0, MaxColors, ColorTable);//这里是取得指针 for (int i = 0; i < MaxColors; i++){ColorTable->rgbBlue = (BYTE)i;ColorTable->rgbGreen = (BYTE)i;ColorTable->rgbRed = (BYTE)i;}CI.SetColorTable(0, MaxColors, ColorTable);delete[] ColorTable;uchar *pS;uchar *pImg = (uchar*)CI.GetBits();int step = CI.GetPitch();for (int i = 0; i < h; i++){pS = img.ptr<uchar>(i);for (int j = 0; j < w; j++){*(pImg + i*step + j) = pS[j];}}HDC dc = GetDC(hWndDisplay);CI.Draw(dc, 0, 0);ReleaseDC(hWndDisplay, dc);CI.Destroy();}if(img.channels() == 3){//调整图片与显示控件大小一致RECT rect;GetClientRect(hWndDisplay, &rect);cv::Mat imgShow(abs(rect.top - rect.bottom), abs(rect.right - rect.left), CV_8UC3);resize(img, imgShow, imgShow.size());ATL::CImage CI;int w = imgShow.cols;//宽 int h = imgShow.rows;//高 int channels = imgShow.channels();//通道数 CI.Destroy();//防止重复创建导致程序崩溃CI.Create(w, h, 8 * channels);uchar *pS;//图片数据类型:uchar; value range:0~255uchar *pImg = (uchar *)CI.GetBits();//得到CImage数据区地址 int step = CI.GetPitch();for (int i = 0; i < h; i++){pS = imgShow.ptr<uchar>(i);for (int j = 0; j < w; j++){for (int k = 0; k < 3; k++)*(pImg + i*step + j * 3 + k) = pS[j * 3 + k];}}HDC dc = GetDC(hWndDisplay);CI.Draw(dc, 0, 0);ReleaseDC(hWndDisplay, dc);CI.Destroy();}}理论上用到CImage类,需要include <atlImage.h>,但我在我的工程里没有添加编译仍然通过,不知道什么原因,具体不深究了。
总之,显示视频功能实现了,自己玩去吧!
阅读全文
1 0
- 彻底解决MFC/C#中在控件上播放opencv的Mat类型帧视频-亲测满足实时性要求
- 用OpenCV在MFC Dialog中Picture控件上显示摄像头采集实时视频
- opencv Mat图像显示在MFC控件上,亲测有效。为原作者点赞!
- MFC/C# 中显示 OpenCV 的 Mat
- MFC/C# 中显示 OpenCV 的 Mat
- 在MFC图像控件上显示opencv Mat格式图片
- (转载)MFC中使用OpenCV捕捉摄像头视频并在Image控件中播放
- 彻底解决显示Opencv中Mat图像到Mfc窗口问题
- OpenCV中Mat、IplImage格式的图片,显示到MFC中的picture控件上
- 在MFC中如何显示OpenCV的图像Mat
- opencv2在MFC对话框控件中显示图片播放视频
- MFC中利用OpenCV实现视频播放
- 在VC的MFC中使用控件,显示OpenCv取得的视频
- 在MFC控件中显示opencv库中的图像或者视频用的CvvImage
- 在MFC控件中显示opencv库中的图像或者视频用的CvvImage
- 基于opencv与MFC的视频播放。
- opencv [c++版] 学习笔记(2) 在MFC基于对话框界面上播放视频
- OpenCV中CvMat或Mat的类型
- java HashCode
- Linux系统下如何判断apache是否处于监听状态?
- 欢迎使用CSDN-markdown编辑器
- 【Linux学习笔记】6:文件搜索命令locate
- Matlab fig文件另存为的eps图片 Helvetica Times-Roman字体不能嵌入
- 彻底解决MFC/C#中在控件上播放opencv的Mat类型帧视频-亲测满足实时性要求
- 安装配置 flannel
- 第三课511遇见易语言大漠文字识别游戏角色坐标
- 为什么要做TDD?
- 盒子模型(一)——block box
- GB28181对接中遇到的问题总结
- 【图论经典题】NOIP2013 普及组 T4 车站分级(两种方法)
- Jmeter Control Http Request Rate
- matlab改为黑色背景