• OpenCV初次使用配置及mfc编程示例


    <转自http://c.chinaitlab.com/cckaifa/discreteness/200903/779453.html>

    最近开始做一个多点触控的课题,网上查阅许多资料后,发现已有先辈把核心函数写好,并建立了一个库——Touchlib.而Touchlib库函数最终调用的是OpenCV里的函数,为了在自己的课题方案中借鉴Touchlib的成熟算法,有必要熟悉Touchlib,因此势必了解OpenCV在VC下的使用。我从网上下载了OpenCV 1.0,依步骤安装到“J:\Program Files\OpenCV\”目录下。在使用VC 6.0调用OpenCV之前,还需做如下配置:

        (1)运行VC 6.0,打开opencv/_make目录下的opencv.dsw文件 然后点击'组建(Build)'->' 批组建(Batch Build)'(编译大概几分钟)。

        (2)点击'工具(Tools)'->'选项(Options)'->'目录(Directories)选项卡', 在Include files下添加:

     J:\Program Files\OpenCV\cv\include
     J:\Program Files\OpenCV\otherlibs\highgui
     J:\Program Files\OpenCV\cxcore\include
     J:\Program Files\OpenCV\otherlibs\cvcam\include

        (3)在Library files下添加

     J:\Program Files\OpenCV\lib
        (4)在Source files下添加
     J:\Program Files\OpenCV\cv\src
    J:\Program Files\OpenCV\cxcore\src
    J:\Program Files\OpenCV\cvaux\src
    J:\Program Files\OpenCV\otherlibs\highgui
    J:\Program Files\OpenCV\otherlibs\_graphics\src
        (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);

    //以下是把IplImage * 转到能够在view里面画的关键
    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控件中的图像,当该窗口移去时被遮挡部分的图像便显示一片空白。此问题有待对程序进一步查错。

  • 相关阅读:
    Nginx支持HTTPS 使用OpenSSL制作自签的证书
    前端周刊第十五期
    前端周刊第十四期
    validate的使用
    python 建立windows计划任务
    requestium
    在Django中启动后台任务的简单方法
    django 控制进程
    selenium 等待
    win task scheduler
  • 原文地址:https://www.cnblogs.com/aicro/p/1492563.html
Copyright © 2020-2023  润新知