2024年4月19日发(作者:)

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

在opencv中显示一个图像简单,但是想在MFC的单文档框架中可不是件容易的,好在opencv

提供了CImage类可以简化这一工作,但是还是碰到了些问题,

如如何装IplImage*图像放入CImage类的成员变量中.

CImage类封装了图像打开保存获取等方法,并将图像保存在一个protected的图像成员变量

里.虽然也提供了CopeOf来装入图像,但是由于

类型转换的问题,总是出错.

解决方法:以CImage为基类自定义一个类:

1.从论坛上看到一哥们使用的方法是在自定义的类的构造函数中修改CImage的protected的

图像成员变量,如下:

myimg::myimg(IplImage* img) : CvvImage()

{

m_img=cvCloneImage(img);

}

调试时发现无法在MFC的xxxxDoc.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_g(m_imgBackup);

return TRUE;

}

//图像处理:这里以灰度拉伸为例

void CMcv_image_sdiView::OnPointStre()

{

CMcv_image_sdiDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

IplImage* pImgTemp=pDoc ->mcv_ge();

pImgTemp=GrayStretch(pImgTemp, pImgTemp->width,pImgTemp->height, bX1, bY1, bX2,

bY2);//此处是自定义函数,可以换成其他处理

pDoc ->mcv_g(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_t(0,0,c_(),c_());

c_HDC(pDC->GetSafeHdc() ,m_rect);

}

PS:Mcv_image_sdi为工程名,是一个单文档工程

虽然不大一个问题,但是还是费了半天劲,和大家分享,希望多提意见,共同学习