1. 程式人生 > >MFC多文件中opencv處理影象開啟、儲存

MFC多文件中opencv處理影象開啟、儲存

需要在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();
}