• MFC多文档中opencv处理图像打开、保存


    需要在C**Doc和C**View中进行相应修改

    图像打开:

    Doc.cpp中:

    [cpp] view plain copy
     
    1. BOOL CCVMFCDoc::Load(IplImage** pp, LPCTSTR csFilename)  
    2. {  
    3.     IplImage* pImg=NULL;  
    4.   
    5.     pImg = cvLoadImage(csFilename,-1);      //  读图像文件(DSCV)  
    6.     if (!pImg) return(false);  
    7.     cvFlip(pImg);                           //  与 DIB 像素结构一致  
    8.     if (*pp) {  
    9.         cvReleaseImage(pp);  
    10.     }  
    11.     (*pp)=pImg;  
    12.     m_Display=0;  
    13.     return(true);  
    14. }  
    [cpp] view plain copy
     
    1. BOOL CCVMFCDoc::OnOpenDocument(LPCTSTR lpszPathName)  
    2. {  
    3.     if(!CDocument::OnOpenDocument(lpszPathName))    return false;  
    4.     Load(&pImg,lpszPathName);  
    5.     if(pImg) return true;  
    6.     return false;  
    7. }  


    图像保存:

    1.Doc.cpp中

    [cpp] view plain copy
     
    1. BOOL CCVMFCDoc::Save(LPCTSTR csFilename, IplImage* pImg)  
    2. {  
    3.     int   bl;  
    4.     cvFlip(pImg);                           //  恢复原 OpenCV 位图结构  
    5.     bl=cvSaveImage(csFilename,pImg);        //  图像存盘  
    6.     return(bl);  
    7. }  

    2.View.cpp中

    [cpp] view plain copy
     
    1. void CCVMFCView::OnFileSaveAs()//图像保存  
    2. {  
    3.     CFileDialog dlg(false,"*.bmp","Test.bmp",OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"保存为(*.bmp)|*.bmp|所有文件(*.*)|*.*||");  
    4.     CString strPath("");  
    5.     if(dlg.DoModal()==IDOK)  
    6.     {  
    7.         cvFlip(workImg);  
    8.         strPath=dlg.GetPathName();  
    9.         cvSaveImage(strPath,workImg);  
    10.         cvFlip(workImg);  
    11.     }  
    12. }  



    整体代码如下:

    [cpp] view plain copy
     
    1. // CVMFCDoc.h : CCVMFCDoc 类的接口  
    2. //@Author:ZrqSophia  
    3. //@2012-3-2  
    4.   
    5.   
    6. #pragma once  
    7.   
    8.   
    9. class CCVMFCDoc : public CDocument  
    10. {  
    11. protected: // 仅从序列化创建  
    12.     CCVMFCDoc();  
    13.     DECLARE_DYNCREATE(CCVMFCDoc)  
    14.   
    15. // 属性  
    16. public:  
    17.   
    18. // 操作  
    19. public:  
    20.   
    21. // 重写  
    22. public:  
    23.     virtual BOOL OnNewDocument();  
    24.     virtual void Serialize(CArchive& ar);  
    25.   
    26. // 实现  
    27. public:  
    28.     virtual ~CCVMFCDoc();  
    29. #ifdef _DEBUG  
    30.     virtual void AssertValid() const;  
    31.     virtual void Dump(CDumpContext& dc) const;  
    32. #endif  
    33.   
    34. protected:  
    35.   
    36. // 生成的消息映射函数  
    37. protected:  
    38.     DECLARE_MESSAGE_MAP()  
    39. public:  
    40.     IplImage* pImg;  
    41.     int m_Display;  
    42.     BOOL Load(IplImage** pp, LPCTSTR csFilename);  
    43.     BOOL Save(LPCTSTR csFilename, IplImage* pImg);  
    44.     BOOL OnOpenDocument(LPCTSTR lpszPathName);  
    45. };  
    [cpp] view plain copy
     
    1. // CVMFCDoc.cpp : CCVMFCDoc 类的实现  
    2. //Author:ZrqSophia  
    3. //2012-3-2  
    4.   
    5. #include "stdafx.h"  
    6. #include "CVMFC.h"  
    7.   
    8. #include "CVMFCDoc.h"  
    9.   
    10. #ifdef _DEBUG  
    11. #define new DEBUG_NEW  
    12. #endif  
    13.   
    14.   
    15. // CCVMFCDoc  
    16.   
    17. IMPLEMENT_DYNCREATE(CCVMFCDoc, CDocument)  
    18.   
    19. BEGIN_MESSAGE_MAP(CCVMFCDoc, CDocument)  
    20. END_MESSAGE_MAP()  
    21.   
    22.   
    23. // CCVMFCDoc 构造/析构  
    24.   
    25. CCVMFCDoc::CCVMFCDoc()  
    26. : pImg(NULL)  
    27. , m_Display(0)  
    28. {  
    29.     // TODO: 在此添加一次性构造代码  
    30.   
    31. }  
    32.   
    33. CCVMFCDoc::~CCVMFCDoc()  
    34. {  
    35. }  
    36.   
    37. BOOL CCVMFCDoc::OnNewDocument()  
    38. {  
    39.     if (!CDocument::OnNewDocument())  
    40.         return FALSE;  
    41.   
    42.     // TODO: 在此添加重新初始化代码  
    43.     // (SDI 文档将重用该文档)  
    44.   
    45.     return TRUE;  
    46. }  
    47.   
    48.   
    49.   
    50.   
    51. // CCVMFCDoc 序列化  
    52.   
    53. void CCVMFCDoc::Serialize(CArchive& ar)  
    54. {  
    55.     if (ar.IsStoring())  
    56.     {  
    57.         // TODO: 在此添加存储代码  
    58.     }  
    59.     else  
    60.     {  
    61.         // TODO: 在此添加加载代码  
    62.     }  
    63. }  
    64.   
    65.   
    66. // CCVMFCDoc 诊断  
    67.   
    68. #ifdef _DEBUG  
    69. void CCVMFCDoc::AssertValid() const  
    70. {  
    71.     CDocument::AssertValid();  
    72. }  
    73.   
    74. void CCVMFCDoc::Dump(CDumpContext& dc) const  
    75. {  
    76.     CDocument::Dump(dc);  
    77. }  
    78. #endif //_DEBUG  
    79.   
    80.   
    81. // CCVMFCDoc 命令  
    82.   
    83. BOOL CCVMFCDoc::Load(IplImage** pp, LPCTSTR csFilename)  
    84. {  
    85.     IplImage* pImg=NULL;  
    86.   
    87.     pImg = cvLoadImage(csFilename,-1);      //  读图像文件(DSCV)  
    88.     if (!pImg) return(false);  
    89.     cvFlip(pImg);                           //  与 DIB 像素结构一致  
    90.     if (*pp) {  
    91.         cvReleaseImage(pp);  
    92.     }  
    93.     (*pp)=pImg;  
    94.     m_Display=0;  
    95.     return(true);  
    96. }  
    97.   
    98. BOOL CCVMFCDoc::Save(LPCTSTR csFilename, IplImage* pImg)  
    99. {  
    100.     int   bl;  
    101.     cvFlip(pImg);                           //  恢复原 OpenCV 位图结构  
    102.     bl=cvSaveImage(csFilename,pImg);        //  图像存盘  
    103.     return(bl);  
    104. }  
    105.   
    106. BOOL CCVMFCDoc::OnOpenDocument(LPCTSTR lpszPathName)  
    107. {  
    108.     if(!CDocument::OnOpenDocument(lpszPathName))    return false;  
    109.     Load(&pImg,lpszPathName);  
    110.     if(pImg) return true;  
    111.     return false;  
    112. }  
    [cpp] view plain copy
     
    1. // CVMFCView.h : CCVMFCView 类的接口  
    2. //@Author:Zrqsophia  
    3. //@2012-3-2  
    4.   
    5. #pragma once  
    6.   
    7.   
    8. class CCVMFCView : public CScrollView  
    9. {  
    10. protected: // 仅从序列化创建  
    11.     CCVMFCView();  
    12.     DECLARE_DYNCREATE(CCVMFCView)  
    13.   
    14. // 属性  
    15. public:  
    16.     CCVMFCDoc* GetDocument() const;  
    17.   
    18. // 操作  
    19. public:  
    20.   
    21. // 重写  
    22. public:  
    23.     virtual void OnDraw(CDC* pDC);  // 重写以绘制该视图  
    24.     virtual BOOL PreCreateWindow(CREATESTRUCT& cs);  
    25. protected:  
    26.     virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);  
    27.     virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);  
    28.     virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);  
    29.   
    30. // 实现  
    31. public:  
    32.     virtual ~CCVMFCView();  
    33. #ifdef _DEBUG  
    34.     virtual void AssertValid() const;  
    35.     virtual void Dump(CDumpContext& dc) const;  
    36. #endif  
    37.   
    38. protected:  
    39.     IplImage* saveImg;  
    40.     IplImage* workImg;  
    41.   
    42.     LPBITMAPINFO m_lpBmi;  
    43.   
    44.     int     m_CaptFlag;  
    45.     int     m_dibFlag;  
    46.     int     m_SaveFlag;  
    47.     int     m_ImageType;  
    48. // 生成的消息映射函数  
    49. protected:  
    50.     afx_msg void OnFilePrintPreview();  
    51.     afx_msg void OnRButtonUp(UINT nFlags, CPoint point);  
    52.     afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);  
    53.     DECLARE_MESSAGE_MAP()  
    54. public:  
    55.     virtual void OnInitialUpdate();  
    56.     afx_msg void OnSize(UINT nType, int cx, int cy);  
    57.     afx_msg void OnFileSaveAs();  
    58.     afx_msg void OnColorImageRefresh();  
    59. };  
    60.   
    61. #ifndef _DEBUG  // CVMFCView.cpp 中的调试版本  
    62. inline CCVMFCDoc* CCVMFCView::GetDocument() const  
    63.    { return reinterpret_cast<CCVMFCDoc*>(m_pDocument); }  
    64. #endif  
    [cpp] view plain copy
     
      1. // CVMFCView.cpp : CCVMFCView 类的实现  
      2. //@Author:ZrqSophia  
      3. //@2012-3-2  
      4.   
      5. #include "stdafx.h"  
      6. #include "CVMFC.h"  
      7.   
      8. #include "CVMFCDoc.h"  
      9. #include "CVMFCView.h"  
      10. #include "resource.h"  
      11.   
      12. #ifdef _DEBUG  
      13. #define new DEBUG_NEW  
      14. #endif  
      15.   
      16.   
      17. // CCVMFCView  
      18.   
      19. IMPLEMENT_DYNCREATE(CCVMFCView, CScrollView)  
      20.   
      21. BEGIN_MESSAGE_MAP(CCVMFCView, CScrollView)  
      22.     // 标准打印命令  
      23.     ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)  
      24.     ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)  
      25.     ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)  
      26.     ON_WM_SIZE()  
      27.     ON_COMMAND(ID_FILE_SAVE_AS, &CCVMFCView::OnFileSaveAs)  
      28.     ON_COMMAND(ID_COLOR_IMAGE_REFRESH, &CCVMFCView::OnColorImageRefresh)  
      29. END_MESSAGE_MAP()  
      30.   
      31. // CCVMFCView 构造/析构  
      32.   
      33. CFile fCapture;  
      34. CFileException eCapture;  
      35. char pbuf[20];  
      36. int  captSetFlag=0;  
      37.   
      38. CCVMFCView::CCVMFCView()  
      39. {  
      40.     // TODO: 在此处添加构造代码  
      41.     saveImg    = NULL;  
      42.     workImg    = NULL;  
      43.   
      44.     m_lpBmi    = 0;  
      45.   
      46.     m_CaptFlag = 0;  
      47.     m_dibFlag  = 0;  
      48.     m_ImageType= 0;  
      49.   
      50.     CSize sizeTotal;  
      51.     sizeTotal.cx = sizeTotal.cy = 100;  
      52.     SetScrollSizes(MM_TEXT, sizeTotal);  
      53. }  
      54.   
      55. CCVMFCView::~CCVMFCView()  
      56. {  
      57.     if (saveImg)  
      58.         cvReleaseImage(&saveImg);           //  释放位图  
      59.     if (workImg)  
      60.         cvReleaseImage(&workImg);  
      61.   
      62.     if (m_lpBmi)  
      63.         free(m_lpBmi);                      //  释放位图信息  
      64. }  
      65.   
      66. BOOL CCVMFCView::PreCreateWindow(CREATESTRUCT& cs)  
      67. {  
      68.     // TODO: 在此处通过修改  
      69.     //  CREATESTRUCT cs 来修改窗口类或样式  
      70.   
      71.     return CScrollView::PreCreateWindow(cs);  
      72. }  
      73.   
      74. // CCVMFCView 绘制  
      75.   
      76. void CCVMFCView::OnDraw(CDC* pDC)  
      77. {  
      78.     CCVMFCDoc* pDoc = GetDocument();  
      79.     ASSERT_VALID(pDoc);  
      80.     if (!pDoc)  
      81.         return;  
      82.   
      83.     // TODO: 在此处为本机数据添加绘制代码  
      84.     if(pDoc->pImg)  
      85.     {  
      86.         if(pDoc->m_Display==0)  
      87.         {  
      88.             imageClone(pDoc->pImg,&saveImg);  
      89.             m_dibFlag=imageClone(saveImg,&workImg);  
      90.   
      91.             m_ImageType=imageType(workImg);  
      92.             m_SaveFlag=m_ImageType;  
      93.             pDoc->m_Display=1;  
      94.         }  
      95.     }  
      96.   
      97.     if (m_dibFlag) {                        //  DIB 结构改变  
      98.         if (m_lpBmi)  
      99.             free(m_lpBmi);  
      100.         m_lpBmi=CtreateMapInfo(workImg,m_dibFlag);  
      101.         m_dibFlag=0;  
      102.   
      103.         CSize sizeTotal;  
      104.         sizeTotal=CSize(workImg->width,workImg->height);  
      105.         SetScrollSizes(MM_TEXT,sizeTotal);  
      106.     }  
      107.   
      108.     char* pBits;  
      109.     if(workImg)  
      110.         pBits=workImg->imageData;  
      111.   
      112.     if(workImg)  
      113.         StretchDIBits(pDC->m_hDC,  
      114.         0,0,workImg->width,workImg->height,  
      115.         0,0,workImg->width,workImg->height,  
      116.         pBits,m_lpBmi,DIB_RGB_COLORS,SRCCOPY);  
      117. }  
      118.   
      119.   
      120. // CCVMFCView 打印  
      121.   
      122.   
      123. void CCVMFCView::OnFilePrintPreview()  
      124. {  
      125.     AFXPrintPreview(this);  
      126. }  
      127.   
      128. BOOL CCVMFCView::OnPreparePrinting(CPrintInfo* pInfo)  
      129. {  
      130.     // 默认准备  
      131.     return DoPreparePrinting(pInfo);  
      132. }  
      133.   
      134. void CCVMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)  
      135. {  
      136.     // TODO: 添加额外的打印前进行的初始化过程  
      137. }  
      138.   
      139. void CCVMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)  
      140. {  
      141.     // TODO: 添加打印后进行的清理过程  
      142. }  
      143.   
      144. void CCVMFCView::OnRButtonUp(UINT nFlags, CPoint point)  
      145. {  
      146.     ClientToScreen(&point);  
      147.     OnContextMenu(this, point);  
      148. }  
      149.   
      150. void CCVMFCView::OnContextMenu(CWnd* pWnd, CPoint point)  
      151. {  
      152.     theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);  
      153. }  
      154.   
      155.   
      156. // CCVMFCView 诊断  
      157.   
      158. #ifdef _DEBUG  
      159. void CCVMFCView::AssertValid() const  
      160. {  
      161.     CScrollView::AssertValid();  
      162. }  
      163.   
      164. void CCVMFCView::Dump(CDumpContext& dc) const  
      165. {  
      166.     CScrollView::Dump(dc);  
      167. }  
      168.   
      169. CCVMFCDoc* CCVMFCView::GetDocument() const // 非调试版本是内联的  
      170. {  
      171.     ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCVMFCDoc)));  
      172.     return (CCVMFCDoc*)m_pDocument;  
      173. }  
      174. #endif //_DEBUG  
      175.   
      176.   
      177. // CCVMFCView 消息处理程序  
      178.   
      179. void CCVMFCView::OnInitialUpdate()  
      180. {  
      181.     CScrollView::OnInitialUpdate();  
      182.   
      183.     CSize sizeTotal;  
      184.     // TODO: calculate the total size of this view  
      185.     sizeTotal.cx = sizeTotal.cy = 100;  
      186.     SetScrollSizes(MM_TEXT, sizeTotal);  
      187. }  
      188.   
      189. void CCVMFCView::OnSize(UINT nType, int cx, int cy)  
      190. {  
      191.     CScrollView::OnSize(nType, cx, cy);  
      192.   
      193.     if (workImg) {                          //  刷新窗口画面  
      194.         CSize  sizeTotal;  
      195.         sizeTotal = CSize(workImg->width,workImg->height);  
      196.         SetScrollSizes(MM_TEXT, sizeTotal);   //  设置滚动条  
      197.     }  
      198. }  
      199.   
      200. void CCVMFCView::OnFileSaveAs()  
      201. {  
      202.     CFileDialog dlg(false,"*.bmp","Test.bmp",OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"保存为(*.bmp)|*.bmp|所有文件(*.*)|*.*||");  
      203.     CString strPath("");  
      204.     if(dlg.DoModal()==IDOK)  
      205.     {  
      206.         cvFlip(workImg);  
      207.         strPath=dlg.GetPathName();  
      208.         cvSaveImage(strPath,workImg);  
      209.         cvFlip(workImg);  
      210.     }  
      211. }  
      212. void CCVMFCView::OnColorImageRefresh()  
      213. {  
      214.     CCVMFCDoc* pDoc = GetDocument();  
      215.     ASSERT_VALID(pDoc);  
      216.     pDoc->m_Display=0;  
      217.     Invalidate();  
      218. }  
      219. //from: http://blog.csdn.net/abcjennifer/article/details/7313711
  • 相关阅读:
    模拟器分辨率收集
    6. 蜂鳴器
    5. 伺服馬達
    4. 流水燈
    3. 序列埠的輸出以及按鈕消抖
    2. 沒有按鈕的電路是沒有靈魂的
    1. 點亮一個LED燈
    ARDUINO準備工作
    vritualenvwrapper的基本操作
    蠻力法兌換零錢及其優化
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/5374086.html
Copyright © 2020-2023  润新知