OpenCV1.0中的方法:
#include "highgui.h"
int main()
{
IplImage* img = cvLoadImage("2.jpg"); //将图片加载至内存,img指针指向该内存
cvShowImage("Example",img); //显示该图片
cvWaitKey(0);
cvReleaseImage(&img);
}
运行结果:
早期的OpenCV版本通过cvLoadImage 函数将图像文件加载至内存,同时返回一个 指针,指针指向一块为描述该图像文件数据结构而分配的内存块。
当不再需要加载到内存中的图像文件时,调用cvRealeaseImage函数释放分配给该图像的内存。
cvShowImage 函数会按照原图像的大小来显示,若要改变所显示的图像大小,可通过cvNamedWindow 函数来实现,具体做法如下:
#include "highgui.h"
int main()
{
IplImage* img = cvLoadImage("2.jpg"); //将图片加载至内存,img指针指向该内存
cvNamedWindow("Example",CV_WINDOW_NORMAL); //定义窗口
cvResizeWindow("Example",300,300); //调整窗口大小
cvShowImage("Example",img); //显示该图片
cvWaitKey(0);
cvReleaseImage(&img); //释放分配给图像的内存
cvDestroyWindow("Example"); //销毁窗口,释放为该窗口所分配的内存
}
运行结果:
可以看到原图像以300X300 的像素大小进行显示(注意在cvNamedWindow的定义中 函数的第二个参数默认为CV_WINDOW_AUTOSIZE,必须改为CV_WINDOW_NORMAL,否则无法调用cvResizeWindow改变窗口大小)。
我们再回头来看看cvLoadImage函数。
图像文件数据的存储方式与MATLAB中类似,都是以矩阵的形式,注意此处调用cvLoadImage返回的*img指针并非是矩阵的地址,而是指向IplImage 数据类型的描述。具体内容会在 图像的存储方式 里 进一步阐述。
转到cvLoadImage 的定义:
我们看到cvLoadImage还有一个缺省的int型参数 iscolor , 默认为常量CV_LOAD_IMAGE_COLOR 继续转到该常量的定义,我们看到一个枚举类型:
从各常量的命名和注释我们可以推测,CV_LOAD_IMAGE_GRAYSCALE 将图像读取为灰度图,CV_LOAD_IMAGE_COLOR将图像读取为彩图,CV_LOAD_IMAGE_UNCHANGED 则不改变图像本身灰度图还是彩图的属性。
读取进的图像是灰度图还是彩图不一定依赖于图像本身,可以在读取的时候进行转换,不同的读取方式意味着不同的内存分配方式(如彩图相比于灰度图需要占据更大的内存空间),OpenCV默认将图像以彩图的方式读取进内存。
OpenCV1.0以后的方法:
#include <opencv2/opencv.hpp>
using namespace cv;
int main()
{
MatsrcImg = imread("2.jpg"); //读取图像
imshow("Example",srcImg); //显示图像
waitKey(0);
return0;
}
以上这段代码可以获得同样的读取显示效果,只不过读取图片的函数为imread,那么它与cvLoadImage相比有什么区别呢,我们首先查看该函数的定义:
与cvLoadImage不同的是,该函数的返回值为一个Mat数据类型而非指针(将在图形的存储方式里详解Mat数据类型)。而这两个函数的参数列表是一样的(图像的存放路径,和图像的读取方式),我们看imread函数关于图像读取方式的枚举类型:
从以上程序的对比可以看到,cvLoadImage 与imread 的区别在于返回值,后者因为返回的是一个Mat数据对象而非指针,当生存周期结束时可以自动释放内存,而不用手动释放。
下一节我们将具体讨论图像在内存中是如何存储的