OpenCV中图像的读取,显示与输出

来源:互联网 发布:学编程怎么开始学 编辑:程序博客网 时间:2024/05/29 14:24

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数据对象而非指针,当生存周期结束时可以自动释放内存,而不用手动释放。

下一节我们将具体讨论图像在内存中是如何存储的

1 0