MFC+VS2012+图像/视频+函数

来源:互联网 发布:环形网络拓扑结构 编辑:程序博客网 时间:2024/06/05 08:13

利用vs创建mfc相对于qt会更容易上手,但是界面上会远不如其好看。
0 创建解决方案
这里写图片描述这里写图片描述
1 配置环境
添加需要使用opencv的两个文件

http://download.csdn.net/detail/songzige/9477119

将其分别添加到头文件和源文件
在….Dlg.h文件中添加几个include引用:

#include "cv.h"#include "highgui.h"#include "CvvImage.h"

2 界面设置

菜单,视图,工具箱,打开工具箱
一、选中Button控件-将Button从工具箱向窗体拖动,添加按钮-双击添加button的启动函数
例如读取指定文件夹下的文件:

// TODO: 在此添加控件通知处理程序代码      CString FilePath;       CFileDialog FileDlg(TRUE);       if (IDOK == FileDlg.DoModal())       {           //获取FileOpen对话框返回的路径名          FilePath = FileDlg.GetPathName();           //GetPathName返回的是CString类型,要经过转换为string类型才能使用imread打开图片           std::string pathName(FilePath.GetBuffer());           //读取图片           cv::Mat orgImg = cv::imread(pathName);   (视频也OK)        }

二、同理,添加Picture Control控件-右击Picture控件,属性,打开控件属性窗口,其ID为IDC_STATIC(可自己随意设置),修改Type为Rectangle-将Picture控件大小调整合适,–右击添加的按钮,属性-可将Caption改为OpenImg(随意修改,中午也OK)–双击按钮,添加事件处理程序,会自动生成相对应的代码(将需要处理的代码放置在函数中)
利用Picture Control显示图片或视频:

//显示图片            RECT win_rect;               ::GetClientRect(GetDlgItem(IDC_WINDOWS)->GetSafeHwnd(), &win_rect);               cv::Mat imgShow( abs(win_rect.top - win_rect.bottom), abs(win_rect.right - win_rect.left), CV_8UC3 );               resize( TestImage, imgShow, imgShow.size() );               //在控件上显示要用到的CImage类图片               ATL::CImage CI;               int w=imgShow.cols;//宽               int h=imgShow.rows;//高               int channels=imgShow.channels();//通道数               CI.Create( w, h, 8*channels); //CI像素的复制               uchar *pS; uchar *pImg=(uchar *)CI.GetBits();//得到CImage数据区地址               int step=CI.GetPitch();               for(int i=0;i<h;i++)               {                   pS=imgShow.ptr<uchar>(i);                  for(int j=0;j<w;j++)                   {                       for(int k=0;k<3;k++)                           *(pImg+i*step+j*3+k)=pS[j*3+k]; //注意到这里的step不用乘以3                   }               }               //在控件显示图片               HDC dc ;               dc = ::GetDC(GetDlgItem(IDC_WINDOWS)->GetSafeHwnd());               CI.Draw( dc, 0, 0 );               ::ReleaseDC( GetDlgItem(IDC_WINDOWS)->GetSafeHwnd(), dc);               CI.Destroy(); 

三、添加输出框
类似于这个样子
这里写图片描述
这里面涉及几个点,首先实现代码:

        string SS_String = SS.str();//SS为一个stringstream SS(stringstream::in | stringstream::out);用来存东西的        cstr += SS_String.c_str();        GetDlgItem(IDC_SHOW_OUTPUT)->SetWindowText(cstr);        m_recvshw.LineScroll(m_recvshw.GetLineCount());//m_recvshw为该编辑框的成员变量(也就是control类型的变量)   ,右键按钮-添加变量-设置变量名(这里是m_recvshw)        cstr += _T("\r\n");//换行

滚动及自动换行:
1.新建一个编辑框控件(Edit Control),将其多行(Multiline)前面打勾(属性设置为True),Auto HScroll前面的勾去掉(属性设置False),这样就可以实现每一行填满后自动换行了。

2.再将垂直滚动条(Vetrical Scroll)前面打勾(属性设置为True),当输入或显示超过编辑框的大小后就会出现垂直滚动条。