zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    数据库表结构变动发邮件脚本
    .net程序打包部署
    无法登陆GitHub解决方法
    netbeans 打包生成 jar
    第一次值班
    RHEL6 纯命令行文本界面下安装桌面
    C语言中格式化输出,四舍五入类型问题
    I'm up to my ears
    How to boot ubuntu in text mode instead of graphical(X) mode
    the IP routing table under linux@school
  • 原文地址:https://www.cnblogs.com/GarfieldEr007/p/5374086.html
Copyright © 2011-2022 走看看