#1.编辑对话框按钮,修改各个按钮窗口ID和绑定变量
picture 控件
“打开图片”按钮控件
#2.编写显示图片函数
void DrawMat(cv::Mat& img, UINT nID);
void DrawMat(cv::Mat& img, UINT nID);
.h文件进行声明
.cpp进行定义
//参数1:opencv即将读的图,
//参数2:需要展示的Picture Control的ID
void COPencv显示图片Dlg::DrawMat(cv::Mat& img, UINT nID)
{
cv::Mat imgTmp;
CRect rect;
GetDlgItem(nID)->GetClientRect(&rect); // 获取控件大小
cv::resize(img, imgTmp, cv::Size(rect.Width(), rect.Height()));// 缩放Mat并备份
// 转一下格式 ,这段可以放外面,
switch (imgTmp.channels())
{
case 1:
cv::cvtColor(imgTmp, imgTmp, CV_GRAY2BGRA); // GRAY单通道
break;
case 3:
cv::cvtColor(imgTmp, imgTmp, CV_BGR2BGRA); // BGR三通道
break;
default:
break;
}
int pixelBytes = imgTmp.channels() * (imgTmp.depth() + 1); // 计算一个像素多少个字节
// 制作bitmapinfo(数据头)
BITMAPINFO bitInfo;
bitInfo.bmiHeader.biBitCount = 8 * pixelBytes;
bitInfo.bmiHeader.biWidth = imgTmp.cols;
bitInfo.bmiHeader.biHeight = -imgTmp.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;
// Mat.data + bitmap数据头 -> MFC
CDC* pDC = GetDlgItem(nID)->GetDC();
::StretchDIBits(
pDC->GetSafeHdc(),
0, 0, rect.Width(), rect.Height(),
0, 0, rect.Width(), rect.Height(),
imgTmp.data,
&bitInfo,
DIB_RGB_COLORS,
SRCCOPY
);
ReleaseDC(pDC);
}
//————————————————
///版权声明:本文为CSDN博主「laolitou_1024」的原创文章,遵循CC 4.0 BY - SA版权协议,转载请附上原文出处链接及本声明。
//原文链接:https ://blog.csdn.net/laolitou_1024/article/details/124002068
#3.定义CString fun_LoadImg();函数
.h文件进行声明
CString fun_LoadImg();
.cpp文件进行定义
CString COPencv显示图片Dlg::fun_LoadImg()
{
// TODO: 在此添加命令处理程序代码
CString imagePath = L"";//选择的图片全路径
BOOL isOpen = TRUE; //是否打开(否则为保存)
CString defaultDir = L"E:\\"; //默认打开的文件路径
CString fileName = L""; //默认打开的文件名
CString filter = L"文件 (*.bmp; *.jpg;*.png)|*.bmp;*.jpg;*.png||"; //文件过虑的类型
CFileDialog openFileDlg(isOpen, NULL, defaultDir + fileName, OFN_HIDEREADONLY | OFN_READONLY, filter, NULL);
if (openFileDlg.DoModal() == IDOK)
{
imagePath = openFileDlg.GetPathName();
}
return imagePath;
}
#4.双击“打开图片”按钮
系统自动弹出响应函数
void COPencv显示图片Dlg::OnBnClickedBtnOpen()
{
// TODO: 在此添加控件通知处理程序代码
USES_CONVERSION;//和下一行的W2A的目的一样,是为了CString类型转const String
Mat src = imread(W2A(fun_LoadImg()), 1);
DrawMat(src, IDC_PIC_SHOW);
}
5.运行程序,显示结果
文章来源:https://www.toymoban.com/news/detail-851948.html
文章来源地址https://www.toymoban.com/news/detail-851948.html
到了这里,关于Opencv显示图片(MFC基于对话框窗口)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!