学院一门有关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