opencv连接摄像头,拍摄

来源:互联网 发布:2013年网络流行语 编辑:程序博客网 时间:2024/04/28 00:00

从官网下载opencv,我下载的是opencv2.4.10版本的。

运行安装,自己选择安装目录,我选择的是F:\软件压缩包\opencv(因为第一次安装,所以选择了这个目录,最好放在c盘,比较通用的目录)

网上下载DirectShow的SDK包,我的是同事拷贝过来的。链接如下:

http://download.csdn.net/detail/u012702039/8398567


新建一个项目,配置下项目属性:

项目->属性->VC++目录->包含目录:



库目录:




项目->属性->链接器->输入:填入这些需要的静态库

opencv_calib3d2410d.libopencv_contrib2410d.libopencv_core2410d.libopencv_features2d2410d.libopencv_flann2410d.libopencv_gpu2410d.libopencv_highgui2410d.libopencv_imgproc2410d.libopencv_legacy2410d.libopencv_ml2410d.libopencv_objdetect2410d.libopencv_ts2410d.libopencv_video2410d.lib

自此,环境配好了。

链接中有CvvImage.h,CvvImage.cpp,CameraDS.h,CameraDS.cpp文件,拷贝到项目目录,然后在项目头文件和源文件中分别添加进来。




在界面添加一个Picture control控件和连接相机,断开相机,拍照按钮。

1.连接相机

连接相机的点击事件中:

int cam_count;cam_count = CCameraDS::CameraCount();if(cam_count==0){MessageBox("未找到摄像头!");return ;} //if(! camera.OpenCamera(0, true)) //弹出属性选择窗口if(! camera.OpenCamera(0, false)) //不弹出属性选择窗口,用代码制定图像宽和高{MessageBox("摄像头初始化失败!");return ;} IplImage* m_Frame;  m_Frame=camera.QueryFrame(); CvvImage m_CvvImage; m_CvvImage.CopyOf(m_Frame,1);      if (true)   {  m_CvvImage.DrawToHDC(hDC, &rect); }  // 设置计时器,每10ms触发一次事件 SetTimer(1,10,NULL);

定义定时器。

点击对话框,属性栏的消息项,找到WM_TIMER,下拉,<add>OnTimer即可添加一个ontimer响应函数。

void MyDialog::OnTimer(UINT_PTR nIDEvent){/************************************************************************/      /* 显示摄像头                                                           */      /************************************************************************/      IplImage* m_Frame;  m_Frame=camera.QueryFrame();      CvvImage m_CvvImage;      m_CvvImage.CopyOf(m_Frame,1);         if (true)      {          m_CvvImage.DrawToHDC(hDC, &rect);       }  CDialogEx::OnTimer(nIDEvent);}

主要内容是把每一帧数据在Onpaint函数中显示。

OnPaint函数内容如下:

void MyDialog::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();}}

对话框类中定义 如下变量:

CString SavePath;//拍照后的路径CCameraDS camera;  CRect rect;  CDC *pDC;  HDC hDC;  CWnd *pwnd;  CvvImage image;

这些变量要在初始化函数中初始化一下:

BOOL MyDialog::OnInitDialog(){CDialogEx::OnInitDialog();// 将“关于...”菜单项添加到系统菜单中。// IDM_ABOUTBOX 必须在系统命令范围内。ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);ASSERT(IDM_ABOUTBOX < 0xF000);// 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动//  执行此操作SetIcon(m_hIcon, TRUE);// 设置大图标SetIcon(m_hIcon, FALSE);// 设置小图标// TODO: 在此添加额外的初始化代码  pwnd = GetDlgItem(IDC_PIC_STATIC);          pDC =pwnd->GetDC();         hDC= pDC->GetSafeHdc();        pwnd->GetClientRect(&rect);    return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE// 异常: OCX 属性页应返回 FALSE}


2.断开相机

void MyDialog::OnBnClickedUnconnect(){// TODO: 在此添加控件通知处理程序代码KillTimer(1);camera.~CCameraDS();  CRect rect ;m_Picture1.GetClientRect(&rect);//获取空间区域FillRect(m_Picture1.GetDC()->GetSafeHdc(),&rect,CBrush(RGB(240,240,240)));}

3.拍照

SavePath已初始化为“c:\\1.jpg”

void MyDialog::OnBnClickedTakepic(){// TODO: 在此添加控件通知处理程序代码//stillCap.StillCap_Snap((LPTSTR)(LPCTSTR)SavePath,false);IplImage* m_Frame;  m_Frame=camera.QueryFrame(); //可以存在帧中 cvSaveImage(SavePath,m_Frame,0);//也可以存在本地文件}

调试过程中又遇到一个问题

CComPtr<IEnumPins> pEnum;这样的模板,在mfc中可以,但是在建立mfc Activity项目时,会提示CComPtr不是一个模板,解决方案是在前边加上ATL::即可

链接:http://bbs.csdn.net/topics/390765643



0 0