mfc显示mat图片的两种方式

方式一:将opencv的窗口嵌入到mfc的窗口内

  将opencv窗口与mfc窗口绑定之后就可以通过cv::imshow("video",img)显示mat格式的img了
    cv::namedWindow("video", CV_WINDOW_NORMAL);//设置窗口名HWND m_wincv = (HWND)cvGetWindowHandle("video");//获取opencv窗口句柄HWND hParent1 = ::GetParent(m_wincv);//取窗口的父窗口句柄//IDC_VIDEO为mfc中picture control的ID号HWND hw = ::SetParent(m_wincv, GetDlgItem(IDC_VIDEO)->m_hWnd); // 设置新的父窗口句柄::ShowWindow(hParent1, SW_HIDE);   //隐葳原openCV窗口的边框CRect rect;GetDlgItem(IDC_VIDEO)->GetClientRect(rect);   //获取mfc窗口的大小//将opencv窗口设置位与mfc窗口大小移植cv::resizeWindow("video", rect.Width(), rect.Height());

方法二:将opencv中mat格式的图片数据转为CImage的类

CImage这个类可以实现mfc界面的贴图功能
void MatToCImage(cv::Mat& mat, CImage& cImage)   //将mat类型转为CImage
{//create new CImage  int width = mat.cols;int height = mat.rows;int channels = mat.channels();cImage.Destroy(); //clear  cImage.Create(width, height, 8 * channels); //默认图像像素单通道占用1个字节  //copy values  uchar* ps;uchar* pimg = (uchar*)cImage.GetBits(); //A pointer to the bitmap buffer  int step = cImage.GetPitch();for (int i = 0; i < height; ++i){ps = (mat.ptr<uchar>(i));for (int j = 0; j < width; ++j){if (channels == 1) //gray  {*(pimg + i * step + j) = ps[j];}else if (channels == 3) //color  {for (int k = 0; k < 3; ++k){*(pimg + i * step + j * 3 + k) = ps[j * 3 + k];}}}}
}
   //下面这段代码是实现mfc的贴图功能RECT m_rect;CImage cimage;GetDlgItem(IDC_VIDEO)->GetClientRect(&m_rect);CDC* pdc =GetDlgItem(IDC_VIDEO)->GetDC();int win_w = m_rect.right - m_rect.left;int win_h = m_rect.bottom - m_rect.top;MatToCImage(matImg, cimage);   //将mat转CImageSetStretchBltMode(pdc->m_hDC, STRETCH_HALFTONE); //不执行该语句会导致窗口绘制出的图片有很多噪点,严重失真cimage.Draw(pdc->m_hDC, 0, 0, win_w, win_h,0,0, matImg.cols, matImg.rows);ReleaseDC(pdc);

补充:

//在mfc窗口绘制矩形框
void   DrawRect(CDC* pDC, int x1, int y1, int x2, int y2, int color)
{// 在鼠标点击窗体的位置、且以该位置为中心绘制一个非填充的红色方框 //CRect rect;int i = 0;switch (color){case 0:{CPen NewPen(PS_SOLID, 1, RGB(255, 0, 0)); // 定义一个红色的画笔pDC->SelectObject(&NewPen);pDC->SelectObject(GetStockObject(NULL_BRUSH)); // 选择画刷(空的画刷,不对矩形框进行填充)pDC->Rectangle(x1, y1, x2, y2);break;}case 1:{CPen NewPen(PS_SOLID, 1, RGB(0, 255, 0)); // 定义一个绿色的画笔pDC->SelectObject(&NewPen);pDC->SelectObject(GetStockObject(NULL_BRUSH)); // 选择画刷(空的画刷,不对矩形框进行填充)pDC->Rectangle(x1, y1, x2, y2);break;}case 2:{CPen NewPen(PS_SOLID, 1, RGB(0, 0, 255)); // 定义一个蓝色的画笔pDC->SelectObject(&NewPen);pDC->SelectObject(GetStockObject(NULL_BRUSH)); // 选择画刷(空的画刷,不对矩形框进行填充)pDC->Rectangle(x1, y1, x2, y2);break;}case 3:{CPen NewPen(PS_SOLID, 1, RGB(255, 255, 0)); // 定义一个红绿色的画笔pDC->SelectObject(&NewPen);pDC->SelectObject(GetStockObject(NULL_BRUSH)); // 选择画刷(空的画刷,不对矩形框进行填充)pDC->Rectangle(x1, y1, x2, y2);break;}case 4:{CPen NewPen(PS_SOLID, 1, RGB(255, 0, 255)); // 定义一个红蓝色的画笔pDC->SelectObject(&NewPen);pDC->SelectObject(GetStockObject(NULL_BRUSH)); // 选择画刷(空的画刷,不对矩形框进行填充)pDC->Rectangle(x1, y1, x2, y2);break;}case 5:{CPen NewPen(PS_SOLID, 1, RGB(0, 255, 255)); // 定义一个蓝绿色的画笔pDC->SelectObject(&NewPen);pDC->SelectObject(GetStockObject(NULL_BRUSH)); // 选择画刷(空的画刷,不对矩形框进行填充)pDC->Rectangle(x1, y1, x2, y2);break;}case 6:{CPen NewPen(PS_SOLID, 1, RGB(255, 255, 255)); // 定义一个红绿蓝色的画笔pDC->SelectObject(&NewPen);pDC->SelectObject(GetStockObject(NULL_BRUSH)); // 选择画刷(空的画刷,不对矩形框进行填充)pDC->Rectangle(x1, y1, x2, y2);break;}}}

参考:

MFC OpenCV:显示图片的3种方法(详细)

opencv在mfc窗口显示图片相关推荐

  1. 【数字图像处理】 二.MFC单文档分割窗口显示图片

    本文是讲述<数字图像处理>系列文章,继上篇讲述BMP格式图片和显示后,该篇讲述如何对单文档进行分割.主要是采用CSplitterWnd静态分割窗口显示图片等相关知识.本文主要结合自己的课程 ...

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

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

  3. python截取图片的ROI+OpenCV 在坐标中显示图片+鼠标点击图片显示点坐标

    又来做下笔记了.现在我的毕业设计进行到数据处理的阶段,要在乳腺图像上截取4张相同大小的1024*1024图片,并且每张图片都必须覆盖微钙化点,以下是我现在用到的一些简单程序. 1.首先是截图程序如下: ...

  4. opencv 采用 matplot 显示图片

    opencv 采用 matplot 显示图片 import numpy as np import cv2 from matplotlib import pyplot as pltimg=cv2.imr ...

  5. 利用opencv+QT打开并显示图片

    ``` // 利用opencv+QT打开并显示图片// 头文件在添加 #include "qlabel.h" // opencv #include <opencv2\core ...

  6. 模式识别第二课 建立MFC窗口+插入图片+处理+显示图片

    vs2010 + OpenCV2.4.11 上的模式识别第二课,老师建了一个MFC程序,插入图片,处理,显示图片.这只是一种技术,很容易模仿,难学的是如何对图片处理.数字信号处理课程要学好. 1.新建 ...

  7. python窗口显示图片imread() imshow()_Python-OpenCV:cv2.imread(),cv2.imshow(),cv2.imwrite()

    为什么使用Python-OpenCV? 虽然python 很强大,而且也有自己的图像处理库PIL,但是相对于OpenCV 来讲,它还是弱小很多.跟很多开源软件一样OpenCV 也提供了完善的pytho ...

  8. OpenCv创建读取,显示图片与灰度,透明图片,控制图片窗口大小

    首先构建读取,与创建显示窗口一共需要两个函数imread与imshow,调整图像大小需要一个函数namedWindow 创建读取,显示图片,控制图片窗口大小 创建读取并显示图片 控制图片窗口大小 创建 ...

  9. Qt 入门 ---- 如何在程序窗口显示图片?

    步骤: 1. 选择资源(准备图片) 2. 加载资源(导入图片) 3. 使用资源(显示图片) 具体操作流程: ① 从网上寻找合适的图片素材,下载到本地,在项目根目录下创建一个images文件夹存储程序中 ...

最新文章

  1. Oracle用户管理
  2. main 函数解析(二)—— Linux-0.11 学习笔记(六)
  3. 转载:KOF97八神攻防战
  4. libevent源码学习----io多路复用的封装和使用
  5. gulp+PC前端静态页面项目开发
  6. 计算机网络学习笔记(27. Email应用概述)
  7. 为什么物联网与云计算是天作之合
  8. imagej软件分析划痕实验(计算划痕面积及伤口愈合百分比)
  9. nyoj 643intersection set
  10. 深度学习之MAML笔记
  11. python TCP服务器v1.4 - 客户端连接服务器异常(异常情况分类)处理
  12. 阿里云mysql导出表,mysql导出数据库表数据
  13. Android进阶之路 - keyStore、jks签名证书相互转换
  14. 有奖体验 CODING 产品,iPad Pro、HHKB 键盘等超级礼包等你来!
  15. excel隔行填充颜色的三种方法
  16. lol手游账号服务器,英雄联盟手游
  17. java压缩文件或文件夹并返回流给前端
  18. java获取一定距离以内的经纬度值_java 根据经纬度计算两地间的距离
  19. java培训记录Day06 2022/3/19星期六(网页布局:grid)
  20. 一方库、二方库、三方库 概念

热门文章

  1. LAMP环境部署物联网项目
  2. 用python爬取快手评论(烂活新整)
  3. iOS8.0新特性 autoLayout应用
  4. Java工程师培训课(十二)
  5. 2021年是做安卓开发人员的绝佳时机,知乎上已获万赞
  6. 分治算法解决大整数乘法问题
  7. dell 笔记本 ubuntu 安装 无线网卡驱动(Qualcomm Atheros QCA9565 / AR9565 Wireless Network Adapter)
  8. 171103 Matlab subplot 用法
  9. CNN推理时opencv图像Mat数组从HWC转换到CHW方法
  10. 为什么火车站旁边的肯德基能挤死中餐馆?