记住新建项目后,要配置OpenCV环境!参考链接http://blog.csdn.net/zy122121cs/article/details/49180541

做工程搭建框架什么的,基本的要熟练啊。

 

 其中借鉴了ww老师的代码~

新建项目,命名:

点确定,然后,我习惯用基于对话框的:然后点击完成。

从工具箱拖几个控件出来:    Combo Box组合框属性设置:

给图片随便命名个ID,再选择类型Frame:

如右图所示,框架就搭好了:

 

在Test01Dlg.h头文件中添加如下:

//包含Opencv库函数
#include <iostream>
#include <vector>
#include <io.h>
#include <direct.h>
#include <stdio.h>
#include <afxwin.h> #include "opencv2/imgproc/imgproc.hpp"//图像处理函数基本模块,包括图像滤波、图像几何变换、色彩空间转换等
#include "opencv2/highgui/highgui.hpp"//视频捕捉,图像视频读取解码,图形交互
#include "afxwin.h" using namespace std;
using namespace cv;

继续在这里加以下代码,定义枚举类型和私有变量:

private:
//定义枚举类型
typedef enum {ememVIDEO_IN, emPICTURES_IN,emCAMERA_IN } READ_METHOD;//读入方式,图像0,分为相机1,视频2读入
typedef enum {emVIEWBEF, emVIEWAFT } SHOW_WINDOW;//读入窗口,0为第一个窗口,2为第二个窗口 //全局私有变量
VideoCapture cap_VidCam;//获取相机输入或者本地视频
cv::Mat m_frmBef;//原图像
int inputType;//选择的数据输入方式
int nImageWidth;//记录或设置的图像宽度
int nImageHeight;//记录或设置的图像高度
CString workDir;//图像初始默认文件夹

初始化部分BOOL CTest01Dlg::OnInitDialog():

 BOOL CTest01Dlg::OnInitDialog()
{
CDialogEx::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 //初始化视频数据读入方法
com_InputStyle.SetCurSel();
inputType=emPICTURES_IN; //将OpenCV中的窗口显示在MFC中
namedWindow("emVIEWBEF", WINDOW_AUTOSIZE);
HWND hWnd = (HWND) cvGetWindowHandle("emVIEWBEF");
HWND hParent = ::GetParent(hWnd);
::SetParent(hWnd, GetDlgItem(IDC_FRMBEF)->m_hWnd);
::ShowWindow(hParent, SW_HIDE); UpdateData( FALSE );//更新界面控件 //将OpenCV中的窗口显示在MFC中
workDir = F_InitWorkDir();//判断Imgs及SaveFrame文件夹是否存在,不存在创建(ww) //初始化图像显示控件的图像
CRect rect;
GetDlgItem(IDC_FRMBEF) ->GetClientRect( &rect );
m_frmBef = Mat::zeros(rect.Height(), rect.Width(), CV_8UC3); return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}

void CTest01Dlg::OnPaint()部分:

 void CTest01Dlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), ); // 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + ) / ;
int y = (rect.Height() - cyIcon + ) / ; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint(); CDialog::UpdateWindow(); // 更新windows窗口,如果无这步调用,图片显示还会出现问题
if (!m_frmBef.empty())
{
F_ShowImage(emVIEWBEF,m_frmBef); // 重绘图片函数
}
}
}

单击combo box组合框右键,给图像输入方式下拉框关联变量:

然后,给变量命个名:

单击组合框右键,选择“添加事件处理程序”

给函数命名:

然后编辑该函数,加一行代码:

类似的给“选择”按钮添加函数,代码如下:

 // 根据选择不同,分别做摄像头输入,视频输入,本地图像组输入背景建模处理
void CTest01Dlg::OnBnChoosePicture()
{
// TODO: 在此添加控件通知处理程序代码
if (inputType==emPICTURES_IN)//(1)如选择图像输入
{
StopCam();//停止相机工作
string frmPath;
frmPath = DoSelectFiles(
_T("*.bmp"),
OFN_ENABLESIZING |OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY,
_T("image files (*.bmp; *.png; *.jpg) |*.bmp; *.png; *.jpg; *.jpeg| All Files (*.*) |*.*||"),
_T("选择图像序列"),
workDir+"\Imgs");
m_frmBef=cv::imread(frmPath);//读取图像
F_ShowImage(emVIEWBEF,m_frmBef);
}
else if(inputType==emCAMERA_IN)//(2)如选择视频输入
{
//摄像头输入,设置摄像头显示分辨率
nImageWidth = ;
nImageHeight = ;
//打开第一个摄像头
if ( !cap_VidCam.open() )
{
AfxMessageBox(_T("打开摄像头失败!"));
return;
}
cap_VidCam.set(CV_CAP_PROP_FRAME_WIDTH, nImageWidth); //cv设置视频流的帧宽度(只对摄像头有效)
cap_VidCam.set(CV_CAP_PROP_FRAME_HEIGHT, nImageHeight);//cv设置视频流的帧高度(只对摄像头有效)
// 启动摄像头后显示实时画面
SetTimer(, , NULL); // 10ms 定时显示
while() {
cap_VidCam >> m_frmBef;
if(m_frmBef.empty()) break;
F_ShowImage(emVIEWBEF,m_frmBef);
if(waitKey()>)break;
}
cap_VidCam.release();
}
else//(3)如选择视频输入
{
CStringA videoFiles;//存储文件的名字
StopCam();//停止相机工作
videoFiles = DoSelectFiles(
_T("*.avi"),
OFN_ENABLESIZING |OFN_EXPLORER | OFN_ALLOWMULTISELECT | OFN_HIDEREADONLY,
_T("video files (*.avi) |*.avi| All Files (*.*) |*.*||"),
_T("选择视频文件"),
workDir+"\Videos");
cap_VidCam.open(LPCSTR(videoFiles));//打开文件
SetTimer(, , NULL); // 10ms 定时显示
while() {
cap_VidCam >> m_frmBef;
if(m_frmBef.empty()) break;
F_ShowImage(emVIEWBEF,m_frmBef);
if(waitKey()>)break;
}
cap_VidCam.release();
}
}

继续在下面添加 关闭摄像头部分 代码:

 //关闭摄像头
void CTest01Dlg::StopCam()
{
if (cap_VidCam.isOpened())
{
KillTimer();//该函数移除先前用SetTimer设置的定时器,在定时器使用完毕后移除定时器时使用
// 对图像数据清零
m_frmBef = Scalar();
cap_VidCam.release();//释放VideoCapture对象
}
}

打开文件对话框相关代码:

 //弹出打开文件对话框,选择单个文件,并可以限制文件类型
CStringA CTest01Dlg::DoSelectFiles(
LPCTSTR lpszDefExt,
DWORD dwFlags,
LPCTSTR lpszFilter,
LPCSTR lpstrTitle,
LPCSTR lpstrInitialDir )
{
CStringA selectedFile;
POSITION filePosition; CFileDialog dlg( TRUE, lpszDefExt, NULL, dwFlags, lpszFilter, NULL );
dlg.m_ofn.lpstrFile[] = NULL;
dlg.m_ofn.lpstrTitle = lpstrTitle;
dlg.m_ofn.lpstrInitialDir = lpstrInitialDir; if( dlg.DoModal() == IDOK )
{
selectedFile = dlg.GetPathName();
}
return selectedFile;
}
//初始化(创建)程序运行所需的文件夹
CString CTest01Dlg::F_InitWorkDir()
{
CStringA strPath;
TCHAR path[_MAX_PATH];
TCHAR drive[_MAX_DRIVE];
TCHAR dir[_MAX_DIR];
TCHAR fname[_MAX_FNAME];
TCHAR ext[_MAX_EXT];
::GetModuleFileName(AfxGetApp()->m_hInstance, path, _MAX_PATH);
_tsplitpath(path, drive, dir, fname, ext); strPath.Empty();
strPath += CString(drive);
strPath += CString(dir); string saveDir = strPath;
saveDir += "/Imgs";
F_CheckDir(saveDir, true);
saveDir = strPath;
saveDir += "/Videos";
F_CheckDir(saveDir, true);
saveDir = strPath;
saveDir += "/SaveFrame";
F_CheckDir(saveDir, true); return CString(strPath);
}
//检查文件夹是否存在
bool CTest01Dlg::F_CheckDir(const string dir, bool creatDir /* = false */)
{
bool RetVal = false; string fileName = dir;
fileName += "\\*"; _finddata_t FileInfo;
long Handle = _findfirst(fileName.c_str(), &FileInfo); if (Handle == -1L)
{
if (creatDir)
{
if(_mkdir(dir.c_str())==)
{
RetVal = true;
}
}
}
else
{
RetVal = true;
_findclose(Handle);
}
return RetVal;
}

显示图像部分 代码:

 //显示图像,将要绘制的图像 src 复制到 des,然后绘制到控件号为 ID 的 Picture 控件
void CTest01Dlg::F_ShowImage(int type,Mat& src)
{
cv::Mat m_dst;
CRect rect;
GetDlgItem(IDC_FRMBEF)->GetClientRect(&rect);
cv::Rect dst(rect.left,rect.top,rect.right,rect.bottom);
cv::resize(src,m_dst,cv::Size(rect.Width(),rect.Height()));
if (type==emVIEWBEF)
{
imshow("emVIEWBEF", m_dst);
}
}

然后别忘了给“保存图片”按钮 添加响应函数:

 void CTest01Dlg::OnBnClickedSaveImage()
{
//定义可以保存的图像类型后缀名
CString csBMP="BMP Files(*.BMP)|*.BMP|";
CString csJPG="JPG Files(*.JPG)|*.JPG|";
CString csTIF="TIF Files(*.TIF)|*.TIF|";
CString csPNG="PNG Files(*.PNG)|*.PNG|";
CString csDIB="DIB Files(*.DIB)|*.DIB|";
CString csPBM="PBM Files(*.PBM)|*.PBM|";
CString csPGM="PGM Files(*.PGM)|*.PGM|";
CString csPPM="PPM Files(*.PPM)|*.PPM|";
CString csSR ="SR Files(*.SR) |*.SR|";
CString csRAS="RAS Files(*.RAS)|*.RAS||"; CString csFilter=csBMP+csJPG+csTIF+csPNG+csDIB
+csPBM+csPGM+csPPM+csSR+csRAS; CString name[]={"","bmp","jpg","tif","png","dib",
"pbm","pgm","ppm","sr", "ras",""}; CString strFileName;
CString strExtension; CString defaultDir = workDir+"\SaveFrame"; //默认打开的文件路径
CString fileName = "new.bmp"; //默认保存的文件名 CFileDialog openFileDlg(false,".bmp", fileName, OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT, csFilter, NULL);
openFileDlg.m_ofn.lpstrInitialDir=defaultDir;//初始化路径
// 文件存盘对话框
if (openFileDlg.DoModal()==IDOK ) // 输入了文件名
{
strFileName = openFileDlg.m_ofn.lpstrFile;
if (openFileDlg.m_ofn.nFileExtension == ) // 无文件后缀
{
strExtension = name[openFileDlg.m_ofn.nFilterIndex];
strFileName = strFileName + '.' + strExtension;
// 加文件后缀
} string s(strFileName.GetBuffer());
imwrite(s,m_frmBef); // 当前画面存盘
}
}

给“关闭”按钮添加响应函数:

 void CTest01Dlg::OnBnClickedOk()
{
// TODO: 在此添加控件通知处理程序代码
StopCam();//停止相机工作
CDialogEx::OnOK();
}

注:以上代码均加在Test01Dlg.cpp中(Test01换成你自己命名的项目名)

然后这个简单的框架就搭好啦!    ^-^

 

【OpenCV】【MFC】图片、视频、摄像头输入响应【详细图解】的更多相关文章

  1. opencv4-highgui之视频的输入和输出以及滚动条

    这是<opencv2.4.9tutorial.pdf>的highgui的三个例子.通过简短的介绍来实现不同函数的理解,省去一些不需要说的东西. 一.增加滑动条 这是opencv中为数不多的 ...

  2. 摄像头脸部识别 (1)opencv 抓取视频数据并保存

    摄像头脸部识别 (1)opencv 抓取视频数据并保存 基于python 和 opencv 3.4.0 (兼容 opencv 2.X 参考注释),详细如代码 import numpy as np im ...

  3. MFC上显示摄像头JPEG图片数据的两种方法

    其一是借助opencv,其二是利用流对象. 方法一: CvMat *mat; ,,CV_8UC1); ,,CV_8UC1,JPEGBuf); /*初始化矩阵信息头,这里的JPEGBuf就是JPEG图像 ...

  4. 基于OpenCv和swing的图片/视频展示Java实现

    基于OpenCv和swing实现图片/视频的展示 图片的展示 swing展示图片,多为操作BufferedImage,这里要关注的核心是将Mat转为BufferedImage. 代码如下: publi ...

  5. 【转】MFC 自定义edit 限制输入十六进制内容 响应复制粘贴全选剪切的功能

    参考地址:MFC 自定义edit 限制输入内容 响应复制粘贴全选剪切的功能   Ctrl组合键ASCII码 ^Z代表Ctrl+z                     ASCII值 控制字符  AS ...

  6. javacpp-opencv图像处理3:使用opencv原生方法遍历摄像头设备及调用(增加实时帧率计算方法)

    javaCV图像处理系列: javaCV图像处理之1:实时视频添加文字水印并截取视频图像保存成图片,实现文字水印的字体.位置.大小.粗度.翻转.平滑等操作 javaCV图像处理之2:实时视频添加图片水 ...

  7. OpenCV Python 录制视频

    调用摄像头 引入库支持 初始化 调整界面大小 实时显示 录制视频并保存 fourcc问题解决 代码实现 效果展示 总结 学到实用OpenCV调用笔记本电脑的摄像头,并录制视频保存到本地硬盘的时候,出现 ...

  8. 【计算机视觉】opencv读取多个摄像头

    [计算机视觉]opencv读取多个摄像头 标签(空格分隔): [图像处理] 说明:今天蹭了机器视觉课程,讲到了stereopsis,立体视觉,讲到了关于通过多个摄像头获取object的depth信息的 ...

  9. 使用图片视频展示插件blueimp Gallery改造网站的视频图片展示

    在很多情况下,我们网站可能会展示我们的产品图片.以及教程视频等内容,结合一个比较好的图片.视频展示插件,能够使得我们的站点更加方便使用,也更加酷炫,在Github上有很多相关的处理插件可以找来使用,有 ...

随机推荐

  1. 推荐网站 explainshell.com

    ls 显示指定目录下的文件和目录,默认为当前目录. -a 显示所有文件及目录 (ls内定将文件名或目录名称开头为"."的视为隐藏档,不会列出) -l 除文件名称外,亦将文件型态.权 ...

  2. .NET MVC自定义Html辅助方法

    using System;using System.Web.Mvc;using System.Web.Routing; namespace MvcTest2.Helpers{ public stati ...

  3. [linux] shell脚本编程-xunsearch安装脚本学习

    安装脚本setup.sh #!/bin/sh # FULL fast install/upgrade script # See help message via `--help' # $Id$ # s ...

  4. 自定义Jquery插件——由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件

    由于项目需要,对页面中过长的文本进行截取,鼠标移上去有一个title的提示,所以做了一个Jquery过长文本处理的插件下面是代码: // 掉用方式支持 $('select').textBeauty(1 ...

  5. Java 运行时数据区域

    1. 整体分类 程序计数器 虚拟机栈 本地方法栈 Java 堆 方法区 运行时常量池 直接内存 2. 程序计数器 每个线程一个计数器,线程的私有内存 指向的是字节码的内存地址? 如果线程执行的是 Ja ...

  6. aabb问题

    输出所有aabb型的完全平方数 这个问题主要是提供一个判断完全平方的思路,就是用floor函数 #include <iostream> #include <string> #i ...

  7. 原生canvas写的飞机游戏

    一个原生canvas写的飞机游戏,实用性不大,主要用于熟悉canvas的一些熟悉用法. 项目地址:https://github.com/BothEyes1993/canvas_game

  8. POJ P2777 Count Color——线段树状态压缩

    Description Chosen Problem Solving and Program design as an optional course, you are required to sol ...

  9. react生命周期es6

    基本函数有 import React from 'react' export default class MyClass extends React.Component { constructor(p ...

  10. sql-pivot

    PIVOT PIVOT运算符用于在列和行之间进行数据旋转或透视转换,同时执行聚合运算 ,,) Order By empid asc Select * From ( Select empid,YEAR( ...