本文共 1798 字,大约阅读时间需要 5 分钟。
在MFC中,使用opencv库对图像进行读取和显示非常方便,支持的格式也很多。在opencv中,使用cvLoadImage函数读取图像。
函数原型:IplImage* cvLoadImage( const char* filename, int flags=CV_LOAD_IMAGE_COLOR );
支持的图片格式有:BMP、DIB、JPEG、JPG、JPE、PNG、PBM、PGM、PPM、SR、RAS、EXR、jp2。
flags参数是指读入图片的方式,具体定义在highgui.h中:
/* 8bit, color or not */#define CV_LOAD_IMAGE_UNCHANGED -1/* 8bit, gray */#define CV_LOAD_IMAGE_GRAYSCALE 0/* ?, color */#define CV_LOAD_IMAGE_COLOR 1/* any depth, ? */ #define CV_LOAD_IMAGE_ANYDEPTH 2/* ?, any color */#define CV_LOAD_IMAGE_ANYCOLOR 4/* load image from file iscolor can be a combination of above flags where CV_LOAD_IMAGE_UNCHANGED overrides the other flags using CV_LOAD_IMAGE_ANYCOLOR alone is equivalent to CV_LOAD_IMAGE_UNCHANGED unless CV_LOAD_IMAGE_ANYDEPTH is specified images are converted to 8bit*/
cvLoadImage(filename,-1); 默认读取图像的原通道数
cvLoadImage(filename,0); 强制转化读取图像为灰度图
cvLoadImage(filename,0); 强制转化读取图像为灰度图
cvLoadImage( filename, 4 ); 根据图片读取彩色图或灰度图
CV_LOAD_IMAGE_ANYCOLOR和CV_LOAD_IMAGE_UNCHANGED是等值的。但是,CV_LOAD_IMAGE_ANYCOLOR有着可以和CV_LOAD_IMAGE_ANYDEPTH同时使用的优点,所以CV_LOAD_IMAGE_UNCHANGED不再使用了。
在MFC中使用下段代码,通过CFileDialog获得文件路径,然后使用cvLoadImage打开。
char szFilter[]="BMP files(*.bmp)|*.bmp|JPG files(*.jpg)|*.jpg|All files(*.*)|*.*||"; CFileDialog ofd(TRUE,NULL,NULL,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter); if(ofd.DoModal()!=IDOK) return; IplImage *src=cvLoadImage(ofd.GetPathName(),CV_LOAD_IMAGE_ANYCOLOR); if(!src) return;显示图像时,图像的数据全部存在IplImage结构中,通过该结构体指针来操作。最简单的方法是使用使用opencv的函数在新窗口中显示。
cvNamedWindow("使用OpenCV显示的图片", 0); cvShowImage("使用OpenCV显示的图片", src);另一种形式是转换成BITMAPINFO对象,直接在MFC窗口中贴图。这种方式在需要嵌入式图片显示的场合比较常见。具体的实现可参考例子:
http://download.csdn.net/detail/shawpan/7280135
另外一个例子是使用这两种方法在新窗口中显示图像:(1、使用opencv的函数;2、自定义一个非模式对话框,然后把图像粘在该对话框中)
http://download.csdn.net/detail/shawpan/7279263
转载地址:http://hehci.baihongyu.com/