• 1.1.3-学习Opencv与MFC混合编程之---画图工具 通过对话框进行工具的参数设置 画曲线 绘图校正


    源代码:http://download.csdn.net/detail/nuptboyzhb/3961688

    l 对话框

    1.“插入”->“资源”->“对话框”

    2.对话框属性如下:


    双击对话框,建立对话框类。取名:LineParameter

    3.在LineParameter.h头文件中添加#include "resource.h",否则:会报错:IDD_DIALOG4未定义

    4.为LineParameter类增加如下成员变量:

           int m_colorR;

           int m_colorG;

           int m_colorB;

           int m_PenWidth;

    5.在构造函数中,初始化变量:

    LineParameter::LineParameter(CWnd*pParent /*=NULL*/)

           : CDialog(LineParameter::IDD, pParent)

    {

           //{{AFX_DATA_INIT(LineParameter)

                  // NOTE: the ClassWizard will addmember initialization here

           //}}AFX_DATA_INIT

           //初始化数据

           m_colorB=0;

           m_colorG=0;

           m_colorR=0;

           m_PenWidth=1;

    }

    6.在数据交换函数里,交换成员变量与相应控件的数据:

    voidLineParameter::DoDataExchange(CDataExchange* pDX)

    {

           CDialog::DoDataExchange(pDX);

           //{{AFX_DATA_MAP(LineParameter)

                  // NOTE: the ClassWizard will addDDX and DDV calls here

           DDX_Text(pDX, IDC_COLOR_R,m_colorR);

        DDV_MinMaxInt(pDX,m_colorR, 0, 255);

           DDX_Text(pDX, IDC_COLOR_G,m_colorG);

        DDV_MinMaxInt(pDX,m_colorG, 0, 255);

           DDX_Text(pDX, IDC_COLOR_B,m_colorB);

        DDV_MinMaxInt(pDX,m_colorB, 0, 255);

           DDX_Text(pDX, IDC_WIDTH, m_PenWidth);

           DDV_MinMaxInt(pDX, m_PenWidth, 1, 50);

           //}}AFX_DATA_MAP

    }

    7.为确认按键添加消息处理函数:

    voidLineParameter::OnOK()

    {

           // TODO: Add extra validation here

           UpdateData(TRUE);  // 把控件上的数据写入成员变量

          

           if ((m_colorR>=0&&m_colorR<=255)&&(m_colorG>=0&&m_colorG<=255)&&(m_colorB>=0&&m_colorB<=255))

           {

                  CDialog::OnOK();  // 关闭对话框

           }

           else

           {

                  MessageBox("请输入0-255之间的数字", "错误提示", MB_ICONEXCLAMATION | MB_OK);

           }

    }

    l 使用对话框

    1.    在CXXXXXXView类中增加成员变量,并在构造函数中进行初始化;

    int m_LineWidth;

    int m_ColorB;

    int m_ColorG;

    int m_ColorR;

    2.    分别在‘直线’,‘圆’,‘矩形’菜单项的消息处理函数里添加LineParameter对话框对象;并将对话框输入的数据传递给相应的成员变量:

          LineParameter dlg;

           if(dlg.DoModal() != IDOK)

           {

                  return;

           }

           m_ColorR=dlg.m_colorR;

           m_ColorG=dlg.m_colorG;

           m_ColorB=dlg.m_colorB;

           m_LineWidth=dlg.m_PenWidth;

           //删除对话框

           deletedlg;

    3.    修改OnMouseMove消息处理函数,将CXXXXView类的相应成员变量值赋值于画图所需的参数,(RGB颜色和线宽)



    画图准确定的校正问题:

    问题的提出:

    运行结果表明:鼠标按下的点,与图像上显示的点有较大的差距。而鼠标移动时的点,和图像上的点完全一致。因此考虑将第一次鼠标移动后的点作为画线的起始点:

    1.    添加CXXXXView成员变量,OnMouseMoveFlag,用于记录鼠标移动的次数。在构造函数里将其初始化为0;

    2.    每次运行OnMouseMove消息处理函数,该标志加一。

    3.    当OnMouseMoveFlag的时候,将此时的点,保存到起始点:

    my_cvpoint1=cvPoint(point.x,point.y);

    4.    为防止OnMouseMoveFlag增加过快而溢出,在此后的语句中将其赋值为3,:OnMouseMoveFlag=3;

    5.    在每次鼠标按下和鼠标抬起时均初始化该变量

    OnMouseMoveFlag=0;


    画曲线

    1.    增加‘曲线’菜单项;设置相应的属性,添加类向导,编辑消息响应函数:

    voidCCVMFCView::OnMyDrawCurve()

    {

    // TODO: Add your command handler code here

    my_draw_flag=4;

    LineParameter dlg;

    if (dlg.DoModal() != IDOK)

    {

               return;

    }

    m_ColorR=dlg.m_colorR;

    m_ColorG=dlg.m_colorG;

    m_ColorB=dlg.m_colorB;

    m_LineWidth=dlg.m_PenWidth;

    //删除对话框

     deletedlg;

    }

    2.    修改OnMouseMove消息处理函数。增加case 4:的消息处理:

    case 4://当选择画曲线时

                        cvFlip(workImg);

                        cvLine(workImg,my_cvpoint1,iner_point,cvScalar(colorB,colorG,colorR),thickness);

                        cvFlip(workImg);

                        my_cvpoint1=cvPoint(point.x,point.y);

                        Invalidate();//重绘

                        break;


     

    from:http://blog.csdn.net/nupt123456789/article/details/7100150

  • 相关阅读:
    jQuery上传插件Uploadify使用详解
    SQL之case when then用法
    myeclipse 上安装 Maven
    ps 简介
    Linux 查看进程和删除进程
    EL表达<%@page isELIgnored="false"%>问题
    刷新本地的DNS缓存
    IDEA中 @override报错的处理步骤
    Caused by: org.springframework.core.NestedIOException: ASM ClassReader failed to parse class file
    jsp中${param.user}不解析,原样输出。
  • 原文地址:https://www.cnblogs.com/lidabo/p/3501313.html
Copyright © 2020-2023  润新知