OpenCV4.1 显示图像到MFC Pictrue控件

2023-12-10 12:48

本文主要是介绍OpenCV4.1 显示图像到MFC Pictrue控件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

新版本的opencv取消了CvvImage,然而就不支持在MFC中显示了。这里介绍一种新的显示图像的方法。

环境:OpenCV4.1 +MCF 对话框 +Picture控件

方法一:直接将Mat显示在Picture窗体上

显示函数定义如下,

// MFC上Picture Control控件显示图像// src 待显示的图像 (OpenCV库Mat对象结构)// hwnd MFC显示图像的窗口句柄void CXXXDlg::ShowImage(Mat& imgSrc, HWND hwnd) {HDC hdc = ::GetDC(hwnd);CRect rect;//获取图片控件矩形框GetDlgItem(IDC_STATIC_SHOWIMAGE)->GetClientRect(&rect);//缩放Mat,以适应图片控件大小cv::resize(imgSrc, imgSrc, cv::Size(rect.Width(), rect.Height()));//cv::resize(imgSrc, imgSrc, cv::Size(300, 300));// 转换格式 ,便于获取BITMAPINFOswitch (imgSrc.channels()){case 1:cv::cvtColor(imgSrc, imgSrc, COLOR_GRAY2BGRA); // GRAY单通道break;case 3:cv::cvtColor(imgSrc, imgSrc, COLOR_BGR2BGRA);  // BGR三通道break;default:break;}// 计算一个像素多少个字节int pixelBytes = imgSrc.channels()*(imgSrc.depth() + 1);// 制作bitmapinfo(数据头)BITMAPINFO bitInfo;bitInfo.bmiHeader.biBitCount = 8 * pixelBytes;bitInfo.bmiHeader.biWidth = imgSrc.cols;bitInfo.bmiHeader.biHeight = -imgSrc.rows;   //注意"-"号(正数时倒着绘制)bitInfo.bmiHeader.biPlanes = 1;bitInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);bitInfo.bmiHeader.biCompression = BI_RGB;bitInfo.bmiHeader.biClrImportant = 0;bitInfo.bmiHeader.biClrUsed = 0;bitInfo.bmiHeader.biSizeImage = 0;bitInfo.bmiHeader.biXPelsPerMeter = 0;bitInfo.bmiHeader.biYPelsPerMeter = 0;CDC *pDC = GetDlgItem(IDC_STATIC_SHOWIMAGE)->GetDC();  //获取图片控件DC//绘图::StretchDIBits(pDC->GetSafeHdc(),0, 0, rect.Width(), rect.Height(),0, 0, imgSrc.cols, imgSrc.rows,imgSrc.data,&bitInfo,DIB_RGB_COLORS,SRCCOPY);ReleaseDC(pDC);  //释放DC}

函数调用方法:

HWND hwnd = GetDlgItem(IDC_STATIC_SHOWIMAGE)->GetSafeHwnd();
// 获取显示的图像
Mat img = imread("D:/images/11111.jpg");
// 调用显示函数
ShowImage(img, hwnd);

方法二:用Mat转CImage的方式,然后在Pictrue控件上绘制CImage

Mat转CImage

void CXXXDlg::MatToCImage(Mat &mat, CImage &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];}}}}
}

函数调用示例:


void CXXXDlg::ShowMethord4(){int cxl, cyl;Mat rgbImageL1 = imread("D:/images/11111.jpg");//opencv图片CImage  rgbImageL2;CRect   rectl, pic_rectl;int widthl, heightl;//改变图片大小适应picture控件GetDlgItem(IDC_STATIC_SHOWIMAGE)->GetClientRect(&pic_rectl);widthl = pic_rectl.right;heightl = pic_rectl.bottom;resize(rgbImageL1, rgbImageL1, Size(widthl, heightl));MatToCImage(rgbImageL1, rgbImageL2);//OpenCV中Mat对象转MFC的CImage类的函数//获取图片的宽 高度 cxl = rgbImageL2.GetWidth();cyl = rgbImageL2.GetHeight();//获取Picture Control控件的大小 GetDlgItem(IDC_STATIC_SHOWIMAGE)->GetWindowRect(&rectl);//将客户区选中到控件表示的矩形区域内 ScreenToClient(&rectl);//窗口移动到控件表示的区域 GetDlgItem(IDC_STATIC_SHOWIMAGE)->MoveWindow(rectl.left, rectl.top, cxl, cyl, TRUE);CWnd *pWnd = NULL;pWnd = GetDlgItem(IDC_STATIC_SHOWIMAGE);//获取控件句柄 pWnd->GetClientRect(&rectl);//获取句柄指向控件区域的大小 CDC *pDc = NULL;pDc = pWnd->GetDC();//获取picture的DC rgbImageL2.Draw(pDc->m_hDC, rectl);//将图片绘制到picture表示的区域内 ReleaseDC(pDc);}

 

这篇关于OpenCV4.1 显示图像到MFC Pictrue控件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/477155

相关文章

电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案

《电脑显示mfc100u.dll丢失怎么办?系统报错mfc90u.dll丢失5种修复方案》最近有不少兄弟反映,电脑突然弹出“mfc100u.dll已加载,但找不到入口点”的错误提示,导致一些程序无法正... 在计算机使用过程中,我们经常会遇到一些错误提示,其中最常见的就是“找不到指定的模块”或“缺少某个DL

使用Python实现图像LBP特征提取的操作方法

《使用Python实现图像LBP特征提取的操作方法》LBP特征叫做局部二值模式,常用于纹理特征提取,并在纹理分类中具有较强的区分能力,本文给大家介绍了如何使用Python实现图像LBP特征提取的操作方... 目录一、LBP特征介绍二、LBP特征描述三、一些改进版本的LBP1.圆形LBP算子2.旋转不变的LB

Qt中QGroupBox控件的实现

《Qt中QGroupBox控件的实现》QGroupBox是Qt框架中一个非常有用的控件,它主要用于组织和管理一组相关的控件,本文主要介绍了Qt中QGroupBox控件的实现,具有一定的参考价值,感兴趣... 目录引言一、基本属性二、常用方法2.1 构造函数 2.2 设置标题2.3 设置复选框模式2.4 是否

Qt中QUndoView控件的具体使用

《Qt中QUndoView控件的具体使用》QUndoView是Qt框架中用于可视化显示QUndoStack内容的控件,本文主要介绍了Qt中QUndoView控件的具体使用,具有一定的参考价值,感兴趣的... 目录引言一、QUndoView 的用途二、工作原理三、 如何与 QUnDOStack 配合使用四、自

OpenCV图像形态学的实现

《OpenCV图像形态学的实现》本文主要介绍了OpenCV图像形态学的实现,包括腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和黑帽运算,文中通过示例代码介绍的非常详细,需要的朋友们下面随着小编来一起... 目录一、图像形态学简介二、腐蚀(Erosion)1. 原理2. OpenCV 实现三、膨胀China编程(

Linux虚拟机不显示IP地址的解决方法(亲测有效)

《Linux虚拟机不显示IP地址的解决方法(亲测有效)》本文主要介绍了通过VMware新装的Linux系统没有IP地址的解决方法,主要步骤包括:关闭虚拟机、打开VM虚拟网络编辑器、还原VMnet8或修... 目录前言步骤0.问题情况1.关闭虚拟机2.China编程打开VM虚拟网络编辑器3.1 方法一:点击还原VM

CSS模拟 html 的 title 属性(鼠标悬浮显示提示文字效果)

《CSS模拟html的title属性(鼠标悬浮显示提示文字效果)》:本文主要介绍了如何使用CSS模拟HTML的title属性,通过鼠标悬浮显示提示文字效果,通过设置`.tipBox`和`.tipBox.tipContent`的样式,实现了提示内容的隐藏和显示,详细内容请阅读本文,希望能对你有所帮助... 效

使用Python开发一个图像标注与OCR识别工具

《使用Python开发一个图像标注与OCR识别工具》:本文主要介绍一个使用Python开发的工具,允许用户在图像上进行矩形标注,使用OCR对标注区域进行文本识别,并将结果保存为Excel文件,感兴... 目录项目简介1. 图像加载与显示2. 矩形标注3. OCR识别4. 标注的保存与加载5. 裁剪与重置图像

如何设置vim永久显示行号

《如何设置vim永久显示行号》在Linux环境下,vim默认不显示行号,这在程序编译出错时定位错误语句非常不便,通过修改vim配置文件vimrc,可以在每次打开vim时永久显示行号... 目录设置vim永久显示行号1.临时显示行号2.永www.chinasem.cn久显示行号总结设置vim永久显示行号在li

基于WinForm+Halcon实现图像缩放与交互功能

《基于WinForm+Halcon实现图像缩放与交互功能》本文主要讲述在WinForm中结合Halcon实现图像缩放、平移及实时显示灰度值等交互功能,包括初始化窗口的不同方式,以及通过特定事件添加相应... 目录前言初始化窗口添加图像缩放功能添加图像平移功能添加实时显示灰度值功能示例代码总结最后前言本文将