opencv3.1.0基于MFC打开摄像头

来源:互联网 发布:wps linux 缺少字体 编辑:程序博客网 时间:2024/04/29 20:11

//FireMFCDlg.cpp


#include "stdafx.h"
#include "FireMFC.h"
#include "FireMFCDlg.h"
#include "afxdialogex.h"


using namespace cv;
#ifdef _DEBUG
#define new DEBUG_NEW
#endif




// 用于应用程序“关于”菜单项的 CAboutDlg 对话框


class CAboutDlg : public CDialogEx
{
public:
CAboutDlg();


// 对话框数据
#ifdef AFX_DESIGN_TIME
enum { IDD = IDD_ABOUTBOX };
#endif


protected:
virtual void DoDataExchange(CDataExchange* pDX);    // DDX/DDV 支持


// 实现
protected:
DECLARE_MESSAGE_MAP()
public:
// afx_msg void OnChar(UINT nChar, UINT nRepCnt, UINT nFlags);
};


CAboutDlg::CAboutDlg() : CDialogEx(IDD_ABOUTBOX)
{
}


void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CAboutDlg, CDialogEx)
// ON_WM_CHAR()
END_MESSAGE_MAP()




// CFireMFCDlg 对话框






CFireMFCDlg::CFireMFCDlg(CWnd* pParent /*=NULL*/)
: CDialogEx(IDD_FIREMFC_DIALOG, pParent)
{
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}


void CFireMFCDlg::DoDataExchange(CDataExchange* pDX)
{
CDialogEx::DoDataExchange(pDX);
}


BEGIN_MESSAGE_MAP(CFireMFCDlg, CDialogEx)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_OpenCamera, &CFireMFCDlg::OnBnClickedOpencamera)
// ON_WM_TIMER()
ON_WM_TIMER()
ON_BN_CLICKED(IDC_CloseCamera, &CFireMFCDlg::OnBnClickedClosecamera)
END_MESSAGE_MAP()




// CFireMFCDlg 消息处理程序


BOOL CFireMFCDlg::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);// 设置小图标


ShowWindow(SW_MINIMIZE);


// TODO: 在此添加额外的初始化代码


return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}


void CFireMFCDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialogEx::OnSysCommand(nID, lParam);
}
}


// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。


void CFireMFCDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文


SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);


// 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;


// 绘制图标
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialogEx::OnPaint();
}
}


//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CFireMFCDlg::OnQueryDragIcon()
{
return static_cast<HCURSOR>(m_hIcon);
}






void CFireMFCDlg::OnBnClickedOpencamera()
{
if (!camera.isOpened())
{
camera.open(0);
}
SetTimer(IDC_CameraPreview, 10, NULL);
}


void CFireMFCDlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (!camera.isOpened()) return;
Mat mat;
if (!camera.read(mat))
return;
resize(mat, mat, Size(480, 360));//(520, 350)
CImage cimage;
MatToCImage(mat, cimage);
cimage.Draw(GetDlgItem(IDC_CameraPreview)->GetDC()->m_hDC, 0, 0, cimage.GetWidth(), cimage.GetHeight(),
0, 0, cimage.GetWidth(), cimage.GetHeight());
CDialogEx::OnTimer(nIDEvent);
}


//----------定义MatToCImage函数,从图形显示到MFC上
void CFireMFCDlg::MatToCImage(cv::Mat &mat, CImage &cImage)
{
int width = mat.cols;
int height = mat.rows;
int channels = mat.channels();


cImage.Destroy();//初始化图像cImage
cImage.Create(width,height,8 * channels);//创建化图像cImage


uchar* ps;
uchar* pimg = (uchar*)cImage.GetBits();
int step = cImage.GetPitch();


for (int i = 0; i < height; ++i)
{
ps = (mat.ptr<uchar>(i));
for (int j = 0; j < width; ++j)
{
if (channels == 1) //gray  
{
*(pimg + i*step + j) = ps[j];
}
else if (channels == 3) //color  
{
for (int k = 0; k < 3; ++k)
{
*(pimg + i*step + j * 3 + k) = ps[j * 3 + k];
}
}
}
}

}


0 0
原创粉丝点击