天天看點

1.1.3-學習Opencv與MFC混合程式設計之---畫圖工具 通過對話框進行工具的參數設定 畫曲線 繪圖校正

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

l 對話框

1.“插入”->“資源”->“對話框”

2.對話框屬性如下:

1.1.3-學習Opencv與MFC混合程式設計之---畫圖工具 通過對話框進行工具的參數設定 畫曲線 繪圖校正

輕按兩下對話框,建立對話框類。取名: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);

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

                    Invalidate();//重繪

                    break;

繼續閱讀