在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