在MFC的picture控件中如何显示Mat图

2023-05-16

  1.  
  2. 首先,要进行输入检查,看Mat数据是否是有效的,如下图中所示

    在MFC的picture控件中如何显示Mat图

  3. 定义位图数据结构,用以方便在图形设备接口(GraphicsDeviceInterface)上显示,也就是windows上的GDI

    在MFC的picture控件中如何显示Mat图

  4. 开发内存空间,并初始化,按下图中所示那样即可

    在MFC的picture控件中如何显示Mat图

  5. 定义位图相关信息,并和输入数据Mat图联系起来

    在MFC的picture控件中如何显示Mat图

    在MFC的picture控件中如何显示Mat图

  6. 在获取控件的客户区,并设置图像的显示模式,SetStretchBltMode是Windows GDI函数,功能为该函数可以设置指定设备环境中的位图拉伸模式。COLORONCOLOR:删除像素。该模式删除所有消除的像素行,不保留其信息。

    在MFC的picture控件中如何显示Mat图

  7. 完成上述后,将内存中的图像数据拷贝到屏幕上,执行如下图中所示

    在MFC的picture控件中如何显示Mat图

  8. 上面写了显示的关键步骤,下面贴上详细源码,以方便大家理解:

    void showMatImgToWnd(CWnd* pWnd, const cv::Mat& img)

        if(img.empty()) 

            return; 

     static BITMAPINFO *bitMapinfo = NULL;

     static bool First=TRUE;

     if(First)

     {  

      BYTE *bitBuffer = new BYTE[40+4*256];//开辟一个内存区域

      if(bitBuffer == NULL)

      { 

       return;

      }

      First=FALSE;

      memset(bitBuffer, 0, 40+4*256);

      bitMapinfo = (BITMAPINFO *)bitBuffer;

      bitMapinfo->bmiHeader.biSize   = sizeof(BITMAPINFOHEADER);

      bitMapinfo->bmiHeader.biPlanes   = 1;   

      for(int i=0; i<256; i++)

      { //颜色的取值范围 (0-255)

       bitMapinfo->bmiColors[i].rgbBlue  =bitMapinfo->bmiColors[i].rgbGreen =bitMapinfo->bmiColors[i].rgbRed   =(BYTE) i;

      } 

      }

      bitMapinfo->bmiHeader.biHeight = -img.rows;   

           bitMapinfo->bmiHeader.biWidth = img.cols;

     bitMapinfo->bmiHeader.biBitCount= img.channels() *8;    

     

     CRect drect;       

     pWnd->GetClientRect(drect);    //pWnd指向CWnd类的一个指针 

     CClientDC dc(pWnd);

     HDC hDC =dc.GetSafeHdc();                  //HDC是Windows的一种数据类型,是设备描述句柄;

     SetStretchBltMode(hDC, COLORONCOLOR);    

                                              StretchDIBits(hDC,

         0,

         0,

         drect.right,  //显示窗口宽度

         drect.bottom,  //显示窗口高度

         0,

         0,

         img.cols,     //图像宽度

         img.rows,     //图像高度

         img.data,   

         bitMapinfo,   

         DIB_RGB_COLORS, 

         SRCCOPY

          );

    }

     

     

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在MFC的picture控件中如何显示Mat图 的相关文章

  • 如何将 unicode 字符变成小写字母

    我在 VC MFC 中将 unicode 字符转换为小写字母时遇到问题 我在 CString 变量中有 unicode 字符 所以 使用英语 MakeLower 工作正常 我得到小写字母 但它无法将 unicode 字符转换为小写 我确实尝
  • 如何向现有 Win32 C++ 项目添加 MFC 支持?

    我正在创建一个 C 应用程序 它使用 Qt 创建 GUI 但是 我需要使用依赖于 MFC 的第三方库 用于 CString 等 无论如何 是否可以将 MFC 添加到我的应用程序中以允许我使用这个库 或者我需要自己重写它 I saw 这个问题
  • 从不同操作系统检索到的故障转储指向消息循环。如何从那里到达故障位置? (TeamViewer 使我的进程崩溃。)

    我们软件的一位客户抱怨说 该软件在他的 Windows XP 计算机上崩溃了 我让他下载ProcDump https technet microsoft com en us sysinternals dd996900 aspx并按如下方式运
  • 如何最好地避免 C++/CLI 本机类型中的双重转换

    传统上 我一直使用 MFC 扩展 dll 并使用 dllimport dllexport 导入 导出 但是 当 dll 更改为使用 clr 时 此方法的成本会变得很高 因为调用可能会导致双重转换 我现在的性能受到了巨大的打击 需要停止双重重
  • MFC:如何减少OnInitialUpdate()滚动的时间成本?

    我需要打印多行数据 每行都可以进行文本换行 因此高度会有所不同 要进行滚动 我需要导出总高度 由于每条线可能有不同的高度 我只能遍历每条线来累加高度 如下所示 void CMyScrollView OnInitialUpdate for a
  • 如何发光最小。最大和关闭按钮?

    我按照以下指南使用 DWM API 创建自定义 Aero 框架 My work void CMainFrame OnActivate UINT nState CWnd pWndOther BOOL bMinimized CFrameWnd
  • 在Linux上运行MFC程序

    我有一个相当大的基于 MFC 的程序 我的任务是让它在 Linux 上运行 我已经解释过 这需要将程序重新编写为带有 STL 的直接 C 更多工作 或者重新编写为 Qt C 更少工作 现在我被告知 我需要编写包装器以使每个 MFC 类在 L
  • 将 vec3b 转换为 mat

    我有彩色图像im 我想使用以下代码使用 vec3b 获取 3 通道图像的像素值 for int i 0 i lt im rows i for int j 0 j lt im cols j for int k 0 k lt nChannels
  • 如何通过单击 MainFrame 内的按钮来更改 MFC 视图

    我想通过单击窗口内的按钮来更改呈现的视图像这样 https i stack imgur com 3IA2o png 我的项目设置 我制作了一个没有文档 视图支持的 MFC 项目 SDI 我在设计器中又创建了两个视图并向它们添加了类 新的视图
  • MinGW支持MFC吗?

    我已经使用 MinGW 开发了 WinAPI 应用程序 没有出现任何问题 现在 我可以用 MFC 做同样的事情吗 我只是在这里猜测 但我认为您需要购买 Visual Studio 的副本才能获得使用 MFC 的许可证 MFC 也不因其对 C
  • C++ 检查 unicode 字符是否为全角

    如何检查unicode字符是否是全角 我使用Win32 MFC 例如 中是全宽 A不是全角 是全宽 F不是全宽 你需要的是检索东亚宽度 http www unicode org reports tr11 的角色 您可以通过解析来做到这一点东
  • 发送WM_SETTEXT时如何避免EN_CHANGE通知?

    我有一个 CEdit 派生控件 当基本数据为空时 该控件显示字符串 N A 我最近添加了代码 以在控件获得焦点时清空控件 SetWindowText 并在用户离开焦点时将其设置回 N A SetWindowText N A 控空 唯一的问题
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • 如何将十六进制字符串转换为无符号长整型?

    我有以下十六进制值 CString str str T FFF000 如何将其转换为unsigned long 您可以使用strtol作用于常规 C 字符串的函数 它使用指定的基数将字符串转换为 long long l strtol str
  • 更改 GLUT 调用以与 MFC/C++ 一起使用

    我有一个使用 GLUT 进行 OpenGL 渲染的程序 现在我需要它位于 MFC 项目内部 以便它可以与另一个程序组件一起使用 我已经按照这个教程进行操作 http www codeguru com cpp g m opengl openf
  • 如何在 VC++ CString 中验证有效的整数和浮点数

    有人可以告诉我一种有效的方法来验证 CString 对象中存在的数字是有效整数还是浮点数吗 Use tcstol http msdn microsoft com en us library w4z2wdyc aspx and tcstod
  • 如何中止使用 wininet 发送的请求?

    我有一个 MFC 应用程序 用于向相应的服务器发送 post 请求 这是一个http请求 用于上传文件 但有要求中止发送的请求 就像用户正在发送一个大文件一样 用户应该能够在请求完成之前取消请求 我正在使用 wininet api Http
  • 通过 MFC 对话框中的代码更改 Tab 顺序

    我在 OnInitDialog 中通过代码创建了一个控件 但我找不到任何方法通过代码更改对话框的选项卡顺序 有人知道如何做到这一点吗 First Option use ctrl d on resource view in visual st
  • 在 MFC 中获取现有但非活动视图

    假设我想访问 MFC MDI 应用程序中文档类中的特定视图 如果它已打开 该视图当前可以是活动的 也可以是非活动的 如果我可以假设视图始终处于活动状态 我可以按照此说明进行操作 http support microsoft com kb 1
  • MFC:从另一个线程调用 CWnd 方法安全吗?

    其实我有两个问题 打电话安全吗SendMessage来自工作线程 Do CWnd方法 比如MessageBox 调用API函数SendMessage幕后 根据我的理解 当工作线程调用时SendMessage 它将消息推送到UI线程的消息队列

随机推荐