C 辅导:OpenCV初次使用配置及编程示例计算机二级考试

文章作者 100test 发表时间 2009:04:10 00:04:56
来源 100Test.Com百考试题网


  最近开始做一个多点触控的课题,网上查阅许多资料后,发现已有先辈把核心函数写好,并建立了一个库——Touchlib.而Touchlib库函数最终调用的是OpenCV里的函数,为了在自己的课题方案中借鉴Touchlib的成熟算法,有必要熟悉Touchlib,因此势必了解OpenCV在VC下的使用。我从网上下载了OpenCV 1.0,依步骤安装到“J:Program FilesOpenCV”目录下。在使用VC 6.0调用OpenCV之前,还需做如下配置:
  (1)运行VC 6.0,打开opencv/_make目录下的opencv.dsw文件 然后点击组建(Build)->. 批组建(Batch Build)(编译大概几分钟)。
  (2)点击工具(Tools)->.选项(Options)->.目录(Directories)选项卡, 在Include files下添加:  J:Program FilesOpenCVcvinclude
  J:Program FilesOpenCVotherlibshighgui
  J:Program FilesOpenCVcxcoreinclude
  J:Program FilesOpenCVotherlibscvcaminclude
  (3)在Library files下添加  J:Program FilesOpenCVlib
  (4)在Source files下添加  J:Program FilesOpenCVcvsrc
  J:Program FilesOpenCVcxcoresrc
  J:Program FilesOpenCVcvauxsrc
  J:Program FilesOpenCVotherlibshighgui
  J:Program FilesOpenCVotherlibs_graphicssrc
  (5)|*谨记*|:每次建立工程,运行前在工程(Project)->.设置(Settings)->.连接(Link)选项卡->.对象/库模块(Object/library modules) 中添加:  cv.lib highgui.lib cxcore.lib cvcam.lib
  下面给出我所编写的一个简单的应用OpenCV的例子。
  (1)建立一个基于Dialog的MFC工程OpenCV_Dlg1,在头文件OpenCV_Dlg1Dlg.h中加入“#include <.cv.h>.”,“#include <.highgui.h>.”宏命令语句。
  (2)添加Picture控件,ID号为IDC_SHOW_WINDOW,图像将显示在该控件中。
  (3)给COpenCV_Dlg1Dlg类添加成员变量IplImage * m_cvImage,属性为Public.并在构造函数COpenCV_Dlg1Dlg::COpenCV_Dlg1Dlg()中将其初始化为NULL,即添加“m_cvImage=NULL;”语句。
  (4)OpenCV有现成的函数cvShowImage()来显示图像,但用该函数显示图像是却是另外开辟了一个弹出窗口并在其中显示,为了在我们建立的Picture控件中显示图像,需在COpenCV_Dlg1Dlg类中添加成员函数void DrawPicToHDC(IplImage *img, UINT ID),属性设置为Public.DrawPicToHDC()函数代码为:
  //-------------------------------------
  void COpenCV_Dlg1Dlg::DrawPicToHDC(IplImage *img, UINT ID)
  {
  CDC *pDC = GetDlgItem(ID)->.GetDC().
  HDC hDC= pDC->.GetSafeHdc().
  CRect rect.
  CWnd * pWnd.
  pWnd=GetDlgItem(ID).
  pWnd->.SetWindowPos( NULL,0,0,img->.width,img->.height,SWP_NOZORDER | SWP_NOMOVE ).
  pWnd->.GetClientRect(&.rect).
  CvvImage cimg.
  cimg.CopyOf(img).
  cimg.DrawToHDC(hDC,&.rect).
  ReleaseDC(pDC).
  }
  //==========================================
  (5)添加Button按钮,ID号为IDC_READ_PIC,标题为“读图”,用于打开一幅图片。对该按钮添加消息响应函数OnReadPic():
  //---------------------------------------------
  void COpenCV_Dlg1Dlg::OnReadPic()
  {
  // TODO: Add your control notification handler code here
  CString Open_Filename.
  CFileDialog fDlg(TRUE,"bmp","*.bmp",OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
  "原始图像(*.bmp)|*.bmp|所有文件(*.*)|*.*||",NULL).
  if (fDlg.DoModal() == TRUE)
  {
  Open_Filename = fDlg.GetFileName().
  if(m_cvImage)
  cvReleaseImage(&.m_cvImage).
  m_cvImage = cvLoadImage(Open_Filename,1).
  if (m_cvImage==0)
  MessageBox("Reading Failed").
  else
  DrawPicToHDC(m_cvImage, IDC_SHOW_WINDOW).
  }
  }
  //===========================================
  至此,运行程序,当点击“读图”按钮时,会弹出对话框,提示用户选择需要读入的图片,“确定”后程序便会在Picture控件中将图片显示出来。
  (6)添加Edit控件,ID号为IDC_EDIT_TH,应用向导工具MFC ClassWizard给该ID添加int型的成员变量m_Th.通过Edit控件IDC_EDIT_TH,用户可以输入图像分割阈值,程序会将其自动更新到m_Th.
  (7)添加Button按钮,ID号为IDC_THRESHOLD,标题为“阈值分割”,点击它将对业已打开的图片做二值化分割。对该按钮添加消息响应函数OnThreshold():
  //----------------------------------------------------------------------------
  void COpenCV_Dlg1Dlg::OnThreshold()
  {
  // TODO: Add your control notification handler code here
  UpdateData(TRUE).
  if (m_cvImage==NULL)
  MessageBox("NO Source Image Found!","Warning").
  else
  {
  IplImage* dst=cvCreateImage( cvSize(m_cvImage->.width,m_cvImage->.height), m_cvImage->.depth, m_cvImage->.nChannels ).
  cvThreshold( m_cvImage, dst, m_Th, 255, CV_THRESH_BINARY).
  //原型:void cvThreshold( IplImage* src, IplImage* dst, float thresh, float maxvalue,CvThreshType type).
  cvNamedWindow("Threshold"). //设置窗口名称
  cvShowImage("Threshold",dst). //显示图片
  cvWaitKey(0).
  }
  }
  //============================================
  至此,当点击“读图”按钮打开一幅图片,该图片将在Picture控件中显示;在Edit控件IDC_EDIT_TH中输入阈值,并点击“阈值分割”按钮,则对读入的图像做二值化处理,处理结果在一个新弹出窗口中显示。
  以上所编写程序是个试验性程序,从中可以反应出用OpenCV编程的一般性步骤。但该程序依然存在Bug:即显示在Picture控件中的图像不会重绘,也就是说如果用另外一个窗口遮挡Picture控件中的图像,当该窗口移去时被遮挡部分的图像便显示一片空白。此问题有待对程序进一步查错。

  2009年上半年全国计算机等级考试参考答案请进入计算机考试论坛

  2009年全国计算机等级考试报名信息汇总

  2009年NCRE考试有新变化

  2009年全国计算机等级考试-大纲

  2009年上半年全国计算机二级考试试题及答案

  2009年上半年全国计算机等级考试试题答案汇总



相关文章


2004年4月全国计算机等级考试二级C 笔试试题及答案计算机二级考试
在C 中将数据库数据分行和列保存到Excel中计算机二级考试
C 辅导:OpenCV初次使用配置及编程示例计算机二级考试
计算机二级考试:C 组合框控件使用方法计算机二级考试
计算机二级考试C _C的迷宫游戏计算机二级考试
计算机二级考试C _C推箱子游戏计算机二级考试
二级C 辅导:C 中的EXIT与析构函数计算机二级考试
澳大利亚华人论坛
考好网
日本华人论坛
华人移民留学论坛
英国华人论坛