歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

MFC多文檔中OpenCV處理圖像打開、保存

需要在C**Doc和C**View中進行相應修改

圖像打開:

Doc.cpp中:

  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. }  

 
  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中

  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中

  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. }  

整體代碼如下:

  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. };  

 
  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. }  

 
  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  

 
  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. }  
Copyright © Linux教程網 All Rights Reserved