继承opencv的CImage类在MFC的单文档中编辑并显示图像

摘自:http://wenku.baidu.com/view/fc943c41a8956bec0975e374.html

opencv中显示一个图像简单,但是想在MFC的单文档框架中可不是件容易的,好在opencv提供了CImage类可以简化这一工作,但是还是碰到了些问题,

如如何装IplImage*图像放入CImage类的成员变量中.
CImage
类封装了图像打开\保存\获取\等方法,并将图像保存在一个protected的图像成员变量里.虽然也提供了CopeOf来装入图像,但是由于

类型转换的问题,总是出错.
解决方法:CImage为基类自定义一个类:
1.
从论坛上看到一哥们使用的方法是在自定义的类的构造函数中修改CImageprotected的图像成员变量,如下:
myimg::myimg(IplImage* img) : CvvImage()
{
m_img=cvCloneImage(img);
}

调试时发现无法在MFCxxxxDoc.h中定义新类myimg的对像,错误是构造函数不正确,也可能是自己MFC水平太差^_^(请大家提意见).
2.
自己的解决办法是,CImage为基类自定义一个类如下:

//class声明文件
#include "stdafx.h"
#include "mcv_common.h" //
其中是opencv的一些头文件

class myimg :public CvvImage
{

public:
myimg();
mSetImg(IplImage* pImg);
};

//class实现文件
#include "stdafx.h"
#include "mcv_common.h" //
其中是opencv的一些头文件
#include "mCImage.h"
myimg::myimg()
{
}

myimg::mSetImg(IplImage* pImg)
{
m_img=cvCloneImage(pImg); //
这句很关键 ,调试也曾换成CImage类中的CopeOf方法,但是总有类型转换错误
}


//
测试代码
//
打开文件
BOOL CMcv_image_sdiDoc::OnOpenDocument(LPCTSTR lpszPathName)
{
if (!CDocument::OnOpenDocument(lpszPathName))
return FALSE;

m_imgBackup=cvLoadImage(lpszPathName,0);
mcv_image.mSetImg(m_imgBackup);

return TRUE;
}

//图像处理:这里以灰度拉伸为例
void CMcv_image_sdiView::OnPointStre()
{
CMcv_image_sdiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
IplImage* pImgTemp=pDoc ->mcv_image.GetImage();

pImgTemp=GrayStretch(pImgTemp, pImgTemp->width,pImgTemp->height, bX1,bY1, bX2, bY2);//
此处是自定义函数,可以换成其他处理

pDoc ->mcv_image.mSetImg(pImgTemp); //
主要是部分:将处理后和图像写入CImage中的m_img

//非常关键的部分
UpdateData(FALSE); //
更新
CRect m_MouseRect;
GetClientRect (&m_MouseRect);
InvalidateRect(m_MouseRect, TRUE);//
重绘

}

//显示部分
void CMcv_image_sdiView::OnDraw(CDC* pDC)
{
CMcv_image_sdiDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
myimg & c_myimg = pDoc ->mcv_image; //mcv_image->m_image
CRect m_rect;

m_rect.SetRect(0,0,c_myimg.Width(),c_myimg.Height());
c_myimg.DrawToHDC(pDC->GetSafeHdc() ,m_rect);

}

PS:Mcv_image_sdi 为工程名 , 是一个单文档工程
虽然不大一个问题 , 但是还是费了半天劲 , 和大家分享 , 希望多提意见 , 共同学习
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值