MFC多文件中opencv處理影象開啟、儲存
阿新 • • 發佈:2019-01-01
需要在C**Doc和C**View中進行相應修改
影象開啟:
Doc.cpp中:
BOOL CCVMFCDoc::Load(IplImage** pp, LPCTSTR csFilename) { IplImage* pImg=NULL; pImg = cvLoadImage(csFilename,-1); // 讀影象檔案(DSCV) if (!pImg) return(false); cvFlip(pImg); // 與 DIB 畫素結構一致 if (*pp) { cvReleaseImage(pp); } (*pp)=pImg; m_Display=0; return(true); }
BOOL CCVMFCDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if(!CDocument::OnOpenDocument(lpszPathName)) return false;
Load(&pImg,lpszPathName);
if(pImg) return true;
return false;
}
影象儲存:
1.Doc.cpp中
BOOL CCVMFCDoc::Save(LPCTSTR csFilename, IplImage* pImg) { int bl; cvFlip(pImg); // 恢復原 OpenCV 點陣圖結構 bl=cvSaveImage(csFilename,pImg); // 影象存檔 return(bl); }
2.View.cpp中
void CCVMFCView::OnFileSaveAs()//影象儲存 { CFileDialog dlg(false,"*.bmp","Test.bmp",OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"儲存為(*.bmp)|*.bmp|所有檔案(*.*)|*.*||"); CString strPath(""); if(dlg.DoModal()==IDOK) { cvFlip(workImg); strPath=dlg.GetPathName(); cvSaveImage(strPath,workImg); cvFlip(workImg); } }
整體程式碼如下:
// CVMFCDoc.h : CCVMFCDoc 類的介面
//@Author:ZrqSophia
//@2012-3-2
#pragma once
class CCVMFCDoc : public CDocument
{
protected: // 僅從序列化建立
CCVMFCDoc();
DECLARE_DYNCREATE(CCVMFCDoc)
// 屬性
public:
// 操作
public:
// 重寫
public:
virtual BOOL OnNewDocument();
virtual void Serialize(CArchive& ar);
// 實現
public:
virtual ~CCVMFCDoc();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
// 生成的訊息對映函式
protected:
DECLARE_MESSAGE_MAP()
public:
IplImage* pImg;
int m_Display;
BOOL Load(IplImage** pp, LPCTSTR csFilename);
BOOL Save(LPCTSTR csFilename, IplImage* pImg);
BOOL OnOpenDocument(LPCTSTR lpszPathName);
};
// CVMFCDoc.cpp : CCVMFCDoc 類的實現
//Author:ZrqSophia
//2012-3-2
#include "stdafx.h"
#include "CVMFC.h"
#include "CVMFCDoc.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CCVMFCDoc
IMPLEMENT_DYNCREATE(CCVMFCDoc, CDocument)
BEGIN_MESSAGE_MAP(CCVMFCDoc, CDocument)
END_MESSAGE_MAP()
// CCVMFCDoc 構造/析構
CCVMFCDoc::CCVMFCDoc()
: pImg(NULL)
, m_Display(0)
{
// TODO: 在此新增一次性構造程式碼
}
CCVMFCDoc::~CCVMFCDoc()
{
}
BOOL CCVMFCDoc::OnNewDocument()
{
if (!CDocument::OnNewDocument())
return FALSE;
// TODO: 在此新增重新初始化程式碼
// (SDI 文件將重用該文件)
return TRUE;
}
// CCVMFCDoc 序列化
void CCVMFCDoc::Serialize(CArchive& ar)
{
if (ar.IsStoring())
{
// TODO: 在此新增儲存程式碼
}
else
{
// TODO: 在此新增載入程式碼
}
}
// CCVMFCDoc 診斷
#ifdef _DEBUG
void CCVMFCDoc::AssertValid() const
{
CDocument::AssertValid();
}
void CCVMFCDoc::Dump(CDumpContext& dc) const
{
CDocument::Dump(dc);
}
#endif //_DEBUG
// CCVMFCDoc 命令
BOOL CCVMFCDoc::Load(IplImage** pp, LPCTSTR csFilename)
{
IplImage* pImg=NULL;
pImg = cvLoadImage(csFilename,-1); // 讀影象檔案(DSCV)
if (!pImg) return(false);
cvFlip(pImg); // 與 DIB 畫素結構一致
if (*pp) {
cvReleaseImage(pp);
}
(*pp)=pImg;
m_Display=0;
return(true);
}
BOOL CCVMFCDoc::Save(LPCTSTR csFilename, IplImage* pImg)
{
int bl;
cvFlip(pImg); // 恢復原 OpenCV 點陣圖結構
bl=cvSaveImage(csFilename,pImg); // 影象存檔
return(bl);
}
BOOL CCVMFCDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if(!CDocument::OnOpenDocument(lpszPathName)) return false;
Load(&pImg,lpszPathName);
if(pImg) return true;
return false;
}
// CVMFCView.h : CCVMFCView 類的介面
//@Author:Zrqsophia
//@2012-3-2
#pragma once
class CCVMFCView : public CScrollView
{
protected: // 僅從序列化建立
CCVMFCView();
DECLARE_DYNCREATE(CCVMFCView)
// 屬性
public:
CCVMFCDoc* GetDocument() const;
// 操作
public:
// 重寫
public:
virtual void OnDraw(CDC* pDC); // 重寫以繪製該檢視
virtual BOOL PreCreateWindow(CREATESTRUCT& cs);
protected:
virtual BOOL OnPreparePrinting(CPrintInfo* pInfo);
virtual void OnBeginPrinting(CDC* pDC, CPrintInfo* pInfo);
virtual void OnEndPrinting(CDC* pDC, CPrintInfo* pInfo);
// 實現
public:
virtual ~CCVMFCView();
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif
protected:
IplImage* saveImg;
IplImage* workImg;
LPBITMAPINFO m_lpBmi;
int m_CaptFlag;
int m_dibFlag;
int m_SaveFlag;
int m_ImageType;
// 生成的訊息對映函式
protected:
afx_msg void OnFilePrintPreview();
afx_msg void OnRButtonUp(UINT nFlags, CPoint point);
afx_msg void OnContextMenu(CWnd* pWnd, CPoint point);
DECLARE_MESSAGE_MAP()
public:
virtual void OnInitialUpdate();
afx_msg void OnSize(UINT nType, int cx, int cy);
afx_msg void OnFileSaveAs();
afx_msg void OnColorImageRefresh();
};
#ifndef _DEBUG // CVMFCView.cpp 中的除錯版本
inline CCVMFCDoc* CCVMFCView::GetDocument() const
{ return reinterpret_cast<CCVMFCDoc*>(m_pDocument); }
#endif
// CVMFCView.cpp : CCVMFCView 類的實現
//@Author:ZrqSophia
//@2012-3-2
#include "stdafx.h"
#include "CVMFC.h"
#include "CVMFCDoc.h"
#include "CVMFCView.h"
#include "resource.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
// CCVMFCView
IMPLEMENT_DYNCREATE(CCVMFCView, CScrollView)
BEGIN_MESSAGE_MAP(CCVMFCView, CScrollView)
// 標準列印命令
ON_COMMAND(ID_FILE_PRINT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CScrollView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CScrollView::OnFilePrintPreview)
ON_WM_SIZE()
ON_COMMAND(ID_FILE_SAVE_AS, &CCVMFCView::OnFileSaveAs)
ON_COMMAND(ID_COLOR_IMAGE_REFRESH, &CCVMFCView::OnColorImageRefresh)
END_MESSAGE_MAP()
// CCVMFCView 構造/析構
CFile fCapture;
CFileException eCapture;
char pbuf[20];
int captSetFlag=0;
CCVMFCView::CCVMFCView()
{
// TODO: 在此處新增構造程式碼
saveImg = NULL;
workImg = NULL;
m_lpBmi = 0;
m_CaptFlag = 0;
m_dibFlag = 0;
m_ImageType= 0;
CSize sizeTotal;
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
CCVMFCView::~CCVMFCView()
{
if (saveImg)
cvReleaseImage(&saveImg); // 釋放點陣圖
if (workImg)
cvReleaseImage(&workImg);
if (m_lpBmi)
free(m_lpBmi); // 釋放點陣圖資訊
}
BOOL CCVMFCView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: 在此處通過修改
// CREATESTRUCT cs 來修改視窗類或樣式
return CScrollView::PreCreateWindow(cs);
}
// CCVMFCView 繪製
void CCVMFCView::OnDraw(CDC* pDC)
{
CCVMFCDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
// TODO: 在此處為本機資料新增繪製程式碼
if(pDoc->pImg)
{
if(pDoc->m_Display==0)
{
imageClone(pDoc->pImg,&saveImg);
m_dibFlag=imageClone(saveImg,&workImg);
m_ImageType=imageType(workImg);
m_SaveFlag=m_ImageType;
pDoc->m_Display=1;
}
}
if (m_dibFlag) { // DIB 結構改變
if (m_lpBmi)
free(m_lpBmi);
m_lpBmi=CtreateMapInfo(workImg,m_dibFlag);
m_dibFlag=0;
CSize sizeTotal;
sizeTotal=CSize(workImg->width,workImg->height);
SetScrollSizes(MM_TEXT,sizeTotal);
}
char* pBits;
if(workImg)
pBits=workImg->imageData;
if(workImg)
StretchDIBits(pDC->m_hDC,
0,0,workImg->width,workImg->height,
0,0,workImg->width,workImg->height,
pBits,m_lpBmi,DIB_RGB_COLORS,SRCCOPY);
}
// CCVMFCView 列印
void CCVMFCView::OnFilePrintPreview()
{
AFXPrintPreview(this);
}
BOOL CCVMFCView::OnPreparePrinting(CPrintInfo* pInfo)
{
// 默認準備
return DoPreparePrinting(pInfo);
}
void CCVMFCView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 新增額外的列印前進行的初始化過程
}
void CCVMFCView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: 新增列印後進行的清理過程
}
void CCVMFCView::OnRButtonUp(UINT nFlags, CPoint point)
{
ClientToScreen(&point);
OnContextMenu(this, point);
}
void CCVMFCView::OnContextMenu(CWnd* pWnd, CPoint point)
{
theApp.GetContextMenuManager()->ShowPopupMenu(IDR_POPUP_EDIT, point.x, point.y, this, TRUE);
}
// CCVMFCView 診斷
#ifdef _DEBUG
void CCVMFCView::AssertValid() const
{
CScrollView::AssertValid();
}
void CCVMFCView::Dump(CDumpContext& dc) const
{
CScrollView::Dump(dc);
}
CCVMFCDoc* CCVMFCView::GetDocument() const // 非除錯版本是內聯的
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCVMFCDoc)));
return (CCVMFCDoc*)m_pDocument;
}
#endif //_DEBUG
// CCVMFCView 訊息處理程式
void CCVMFCView::OnInitialUpdate()
{
CScrollView::OnInitialUpdate();
CSize sizeTotal;
// TODO: calculate the total size of this view
sizeTotal.cx = sizeTotal.cy = 100;
SetScrollSizes(MM_TEXT, sizeTotal);
}
void CCVMFCView::OnSize(UINT nType, int cx, int cy)
{
CScrollView::OnSize(nType, cx, cy);
if (workImg) { // 重新整理視窗畫面
CSize sizeTotal;
sizeTotal = CSize(workImg->width,workImg->height);
SetScrollSizes(MM_TEXT, sizeTotal); // 設定滾動條
}
}
void CCVMFCView::OnFileSaveAs()
{
CFileDialog dlg(false,"*.bmp","Test.bmp",OFN_HIDEREADONLY |OFN_OVERWRITEPROMPT,"儲存為(*.bmp)|*.bmp|所有檔案(*.*)|*.*||");
CString strPath("");
if(dlg.DoModal()==IDOK)
{
cvFlip(workImg);
strPath=dlg.GetPathName();
cvSaveImage(strPath,workImg);
cvFlip(workImg);
}
}
void CCVMFCView::OnColorImageRefresh()
{
CCVMFCDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
pDoc->m_Display=0;
Invalidate();
}