好几年没用 MFC 了,OpenCV 也是刚学。一边复习,一边学习新的知识。经过半个星期的编程和调试,终于从众多错误当中走了出来。记下一点经验,以便后用。
从 Edit 控件获取文件路径名:
从 CEdit 派生一个类,重写 OnDropFiles ,调用 DragQueryFile 。
从路径名中获得文件名:
strPathName.Mid(strPathName.ReverseFind('\\')+1)
创建 Modeless Dialogbox:
用 new 在队上分配一个实例,然后要用 Create() 方法创建。
重写 OnCancel() ,取消对基类的调用,增加调用 DestroyWindow() 。
重写PostNcDestroy(), 增加 delete this; 。
检测内存泄漏:
增加引用:
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
在程序退出的地方增加:
_CrtDumpMemoryLeaks();
绘图时重绘不闪烁:
重写 OnEraseBkgnd() ,直接 return false; 。
已知客户区大小,求窗口大小:
CalcWindowRect(&rect);
以上是纯 MFC 。增加了 OpenCV ,便多了很多麻烦。很遗憾,OpenCV 当中的 CvvImage 和 MFC 当中的 CImage 并不兼容,甚至还取而代之,造成不少麻烦。我不得不为二者分别写一个显示的类。
CImage 用着很方便,而且有 MSDN 可以参考。我可不想让它被取代。
在 highgui.h 当中把下面一行注释掉:
#define CImage CvvImage
调用 CvvImage::CopyOf() 时,如果源图像是单通道图像,则会出错。仔细查看源码发现,原来是 cvConvertImage() 并没有提供单通道图像之间的直接转换。要先转换成 RGB 再转换回去。解决方法如下:
if(pSrcImg->nChannels != 1)
pDestImg->CopyOf(pSrcImg);
else
{
CvvImage img;
img.Create(pSrcImg->width, pSrcImg->height, 3*8, pSrcImg->origin);
cvConvertImage(pSrcImg, img.GetImage(), CV_GRAY2RGB);
pDestImg->CopyOf(img, 0);
}
2008年5月22日星期四
2008年4月24日星期四
Horton Hears a Who


最近新出的电影 Horton Hears a Who 很好看。
不愧是由 Jim Carrey 配音,继承了他一贯的爆笑风格。
令人欣赏的是里面的对白,十分押韵,朗朗上口,像诗歌一样。
最欣赏里面的一句话: A person is a person, no matter how small.
相关链接:
wikepedia
官方网站
订阅:
博文 (Atom)