opencv播放和CImage保存BMP

来源:互联网 发布:最新经典网络语言大全 编辑:程序博客网 时间:2024/04/26 05:11
// MFCopencvDlg.cpp : 实现文件//#include "stdafx.h"#include "MFCopencv.h"#include "MFCopencvDlg.h"#include "afxdialogex.h"//#include "atlimage.h"#include <cv.h>#include <highgui.h>#include <cvaux.h>#include <ml.h>#ifdef _DEBUG#define new DEBUG_NEW#endif// CMFCopencvDlg 对话框CMFCopencvDlg::CMFCopencvDlg(CWnd* pParent /*=NULL*/): CDialogEx(CMFCopencvDlg::IDD, pParent){m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);pStc=NULL;    pDC=NULL;capture=NULL;//data=NULL;}void CMFCopencvDlg::DoDataExchange(CDataExchange* pDX){CDialogEx::DoDataExchange(pDX);DDX_Control(pDX, IDC_STATIC_PIC, m_bmpShow);}BEGIN_MESSAGE_MAP(CMFCopencvDlg, CDialogEx)ON_WM_PAINT()ON_WM_QUERYDRAGICON()ON_BN_CLICKED(IDC_BUTTON1, &CMFCopencvDlg::OnBnClickedButton1)ON_WM_TIMER()ON_BN_CLICKED(IDC_BUTTON2, &CMFCopencvDlg::OnBnClickedButton2)END_MESSAGE_MAP()// CMFCopencvDlg 消息处理程序BOOL CMFCopencvDlg::OnInitDialog(){CDialogEx::OnInitDialog();// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码pStc=(CStatic *)GetDlgItem(IDC_STATIC_PIC);//IDC_VIEW为Picture控件ID     pStc->GetClientRect(&rect);//将CWind类客户区的坐标点传给矩形     pDC=pStc->GetDC(); //得到Picture控件设备上下文    hDC=pDC->GetSafeHdc(); //得到控件设备上下文的句柄 return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE}// 如果向对话框添加最小化按钮,则需要下面的代码//  来绘制该图标。对于使用文档/视图模型的 MFC 应用程序,//  这将由框架自动完成。void CMFCopencvDlg::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 CMFCopencvDlg::OnQueryDragIcon(){return static_cast<HCURSOR>(m_hIcon);}void CMFCopencvDlg::OnBnClickedButton1(){// TODO: 在此添加控件通知处理程序代码//提取图片/*IplImage * img=cvLoadImage("D://11.jpg");//load image from file     CvvImage cvvImg; //CvvImage类5      cvvImg.CopyOf(img);//复制图像到当前的CvvImage对象中      cvvImg.DrawToHDC(hDC,&rect); //绘制图像的ROI区域到DC的rect*///提取录像 if (!capture)     {                 capture=cvCaptureFromAVI("D://11.avi"); //初始化一个视频文件捕捉器     }     if(!capture)     {        // AfxMessageBox("无法获得摄像头");           return;     }     SetTimer(1,25,NULL); //定时器,定时时间和帧率一致}void CMFCopencvDlg::OnTimer(UINT_PTR nIDEvent){// TODO: 在此添加消息处理程序代码和/或调用默认值     if(1==nIDEvent)     {          IplImage* img=0;            img=cvQueryFrame(capture); //从摄像头或者文件中抓取并返回一帧// data = img->imageData; /*显示图片          cvGrabFrame( capture ); //从摄像头或者视频文件中抓取帧          img=cvRetrieveFrame(capture); //取回由函数cvGrabFrame抓取的图像      */   //  img = cvCreateImageHeader(cvSize(15, 15), 8, 1); //   memcpy(img->imageData, data, 15*15);       CvvImage m_CvvImage;           m_CvvImage.CopyOf(img,1); //复制该帧图像             m_CvvImage.DrawToHDC(hDC, &rect); //显示到设备的矩形框内      }CDialogEx::OnTimer(nIDEvent);}void CMFCopencvDlg::OnBnClickedButton2(){// TODO: 在此添加控件通知处理程序代码    CRect m_rect;m_bmpShow.GetWindowRect(&m_rect);imag.Create(rect.Width(),rect.Height(),32);    ::BitBlt(imag.GetDC(),0,0,rect.Width(),rect.Height(),pDC->m_hDC,0,0,SRCCOPY);    imag.Save(_T("f:\\2.bmp")); // ReleaseDC(pDC);// imag.ReleaseDC();    AfxMessageBox(_T("OK!"));}