继承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); 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_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为工程名,是一个单文档工程 虽然不大一个问题,但是还是费了半天劲,和大家分享,希望多提意见,共同学习 |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论