openCV4.2+MFC制作多页图片浏览器(无CvvImage)

这篇博客介绍了如何使用openCV4.2和MFC框架开发一个能浏览多页图片的应用。作者在VC环境下,面对MFC的陈旧和openCV的新特性,通过解决兼容问题,实现了点击按钮导入图片,点击图片翻页查看原图的功能。主要难点在于事件处理和控件交互,通过绑定同一事件处理函数并根据鼠标坐标判断点击位置,实现图片显示的逻辑。
摘要由CSDN通过智能技术生成

学院一门有关openCV的自发课,第一次作业是用VC和openCV的接口做一个可浏览图片的图片浏览器。
大二的一门自发课学的MFC,说实话是很老的框架了,但是为了对付作业还是直接用好了……最后写代码的时候发现openCV部分只有几行,MFC各种奇诡的问题倒是占用了绝大部分时间。
openCV用的是最新版本的4.2,网上普遍相关贴子都是3.4甚至2.2版本……广为流传的使用旧版本“CvvImage”类的方法没办法作用,很多方法名都换掉了,非常痛苦,只好想别的办法。(两个时间跨度这么大的框架一起用也只有各种课程实验了吧……)
唉,花了这么多时间就应付了一个作业,总感觉好亏啊!虽然估计以后99%不会用MFC甚至不会写C了,但写个博客记录一下,稍微有点价值罢!

预览

在这里插入图片描述
一页固定8个图片栏位,点击导入图片会用openCV的接口遍历指定文件夹下的图片文件。
在这里插入图片描述
点击按钮翻页
预览
点击后会显示原图,点击图片两侧也可以翻阅前后的图片。

主要实现

布局
布局就8个Picture Control。

在Dlg里定义一个静态成员mats存储所有opencv读取的mat数据。

public:
	static vector<cv::Mat> mats;

因为MFC的点击事件不能传参(至少我不知道咋传),只能一个控件绑定一个对应事件,所以8个picture control控件对应8个函数?但这也太蠢了……
思考了很久也不知道有什么优雅的书写方式,就想到了一个不那么蠢的方法,8个picture control的点击事件绑定同一个方法,该方法再通过获取鼠标的坐标判断点击的是哪个控件。
好吧,看上去还是很蠢……

	// 图片控件位置列表
	vector<CRect> rects;
	// 一页的图片数量
	int image_count = 8;
	// 当前页数
	int page = 1;

	cv::String folder = "E:\\study-计算机图像\\images";
	int image_ids[8] = { IDC_IMG1, IDC_IMG2, IDC_IMG3, IDC_IMG4,
		IDC_IMG5, IDC_IMG6, IDC_IMG7, IDC_IMG8 };

8个控件绑定同一个方法……(; ´_ゝ`)

BEGIN_MESSAGE_MAP(CImageViewerDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BUTTON1, &CImageViewerDlg::OnBnClickedButton1)
	ON_STN_CLICKED(IDC_IMG1, &CImageViewerDlg::OnStnClickedImg)
	ON_STN_CLICKED(IDC_IMG2, &CImageViewerDlg::OnStnClickedImg)
	ON_STN_CLICKED(IDC_IMG3, &CImageViewerDlg::OnStnClickedImg)
	ON_STN_CLICKED(IDC_IMG4, &CImageViewerDlg::OnStnClickedImg)
	ON_STN_CLICKED(IDC_IMG5, &CImageVi
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值