打开不同格式的图形文件,彩色装灰度图像及将其存储为需求格式是图像处理的最基本的操作。如果单纯用MFC编程,是一个令人头痛的事情,有不少的代码量。可用OpenCV与MFC编程就变得相对简单。下面来详细演示这一编程操作。
一 在VS2022中创建一个MFC对话框Project
在V2022中用MFC向导创建一个对话框Project,在对话框中添加如下按钮控件:
二 设置Project属性
三 包含OpenCV 相关头文件,并定义变量
// MFCDiaologOpenCVDlg.h: 头文件
//
#pragma once
#include <opencv2/opencv.hpp>
using namespace cv;
class CMFCDiaologOpenCVDlg : public CDialogEx
{
// 构造
public:
CMFCDiaologOpenCVDlg(CWnd* pParent = nullptr); // 标准构造函数
private:
Mat src;
CWnd* pWnd;
CRect mRec;
CPoint mPoint;
CString m_Path;
CString m_strEx;
CString m_strName;
String m_str;
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_MFCDIAOLOGOPENCV_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedOpen();
afx_msg void OnBnClickedCvt();
afx_msg void OnBnClickedSaveas();
afx_msg void OnBnClickedOk();
};
四 编写程序代码
void CMFCDiaologOpenCVDlg::OnBnClickedOpen()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog fdlg(TRUE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All files(*.*)|*.*||"));
if (fdlg.DoModal() == IDOK)
{
m_Path = fdlg.GetPathName();
m_strEx = fdlg.GetFileExt();
m_strName = fdlg.GetFileName();
m_Path.ReleaseBuffer();
m_strEx.ReleaseBuffer();
m_strName.ReleaseBuffer();
}
if (m_strEx == "BMP" || m_strEx == "bmp" || m_strEx == "TIF" || m_strEx == "tif" || m_strEx == "PNG" || m_strEx == "png" || m_strEx == "jpg" || m_strEx == "JPG")
{
pWnd = GetDlgItem(IDC_PICSHOW);
pWnd->GetClientRect(&mRec);
mPoint = mRec.TopLeft();
pWnd->ClientToScreen(&mPoint);
m_str = CT2A(m_Path);
src = imread(m_str);
if(src.empty())
MessageBox(_T("打开图像文件失败!"));
else
{
m_str = CT2A(m_strName);
namedWindow(m_str, WINDOW_AUTOSIZE);
moveWindow(m_str, mPoint.x, mPoint.y);
imshow(m_str, src);
}
}
else
{
MessageBox(_T("你打开的文件不是本程序支持的图像文件!"));
}
}
void CMFCDiaologOpenCVDlg::OnBnClickedCvt()
{
// TODO: 在此添加控件通知处理程序代码
Mat des;
cvtColor(src, des, COLOR_BGR2GRAY, 0);
destroyAllWindows();
m_str = CT2A(m_strName);
namedWindow(m_str, WINDOW_AUTOSIZE);
moveWindow(m_str, mPoint.x, mPoint.y);
imshow(m_str, des);
src.release();
des.copyTo(src);
}
void CMFCDiaologOpenCVDlg::OnBnClickedSaveas()
{
// TODO: 在此添加控件通知处理程序代码
CFileDialog fdlg(FALSE, NULL, NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT, _T("All files(*.*)|*.*||"));
if (fdlg.DoModal() == IDOK)
{
m_Path = fdlg.GetPathName();
m_strEx = fdlg.GetFileExt();
m_strName = fdlg.GetFileName();
m_Path.ReleaseBuffer();
m_strEx.ReleaseBuffer();
m_strName.ReleaseBuffer();
}
if (m_strEx == "BMP" || m_strEx == "bmp" || m_strEx == "TIF" || m_strEx == "tif" || m_strEx == "PNG" || m_strEx == "png" || m_strEx == "jpg" || m_strEx == "JPG")
{
m_str = CT2A(m_Path);
imwrite(m_str, src);
src = imread(m_str);
destroyAllWindows();
m_str = CT2A(m_strName);
namedWindow(m_str, WINDOW_AUTOSIZE);
moveWindow(m_str, mPoint.x, mPoint.y);
imshow(m_str, src);
}
else
{
MessageBox(_T("你输入的文件格式不是不是本程序支持的图像文件格式,不能保存!"));
}
}
为”退出”控件添加如下响应代码:
void CMFCDiaologOpenCVDlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
//destroyAllWindows();
CDialogEx::OnOK();
}
五 程序试运行
显示的图像变成了2.png,在打开图像时看到的2.png是灰度图像,现在变成了彩色图像。
点击图像另存为,进入图像存储界面
显示的图像变成了3.tif,再点击“打开图像文件”按钮,去看一下存储的文件是否存在,进入到打开文件界面,如下:
重新按“Ctrl+F5”运行程序,再试下打开3.tif这个存储文件,看能否正常打开,打开结果,如下:
确实能打开。说明控件响应程序没有问题。几行代码就完成了图像转换的相应,可以看出OpenCV确实强化。这个程序还存在些问题,当激活别的运行程序后,再回到这个对话框程序,可能回发现打开的图片不见了,或者跑到别的地方去了,这是MFC界面编程问题,如何处理,这里这里暂不做讨论。
原文地址:https://blog.csdn.net/billliu66/article/details/134747279
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_29964.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!
声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。