openCV入门1------显示图像

    openCV是一个庞大的计算机视觉库,那么要做好机器视觉,学好openCV的使用是必要的,那么我们不妨使用openCV写一些程序来进行入门,方便后期机器视觉的深入学习!

    openCV包括以下几个模块(或者说是库吧):
                        1.cv
                     2.ML(Machine Learning)
                     3.highgui
                     4.cxcore
   其中ML模块在openCV2以后就没有了,所以要使用openCV函数,将上述1、3、4包含进来就足够了!即在C++源文件开头处定义
                   #include"cv.h"
                #include"highgui.h"
                #include"cxcore.h"
那么这里就涉及到一个配置问题了,能这么写得益于openCV安装后的一系列配置。可以看到安装目录下(比如说我的D:\openCV\build\include\)有两个文件夹,一个是openCV,一个是openCV2,那么现在程序中用得更多的是后者。如果搞不清楚到底用哪个怎么办呢?好办,在属性表里将D:\openCV\build\include\openCV和D:\openCV\build\include\openCV2以及D:\openCV\build\include\均配置进来就好了,如此一来,你就可以放心地include头文件了!

    搞清楚组成模块和头文件,那么接下来就可以编写第一个openCV的程序了。对于一个新手来说,处理图像或者模式识别还太过遥远,往往是显示图像来作为入门。
#include"highgui.h"
#include"cv.h"
#include"cxcore.h"
#include<iostream>
using namespace std;

int main()
{
IplImage* scr = cvLoadImage("8.png");
cvNamedWindow("showImage",0);
cvShowImage("showImage", scr);
cvWaitKey(5000);
cvReleaseImage(&scr);
return 0;
}

那接下来我们深入认识一下这个程序,看看这里有哪些值得我们关注的地方:
1.IplImage
这是openCV里号称最重要的一个结构体(为什么是号称?因为我也不晓得有多重要,以后自会见分晓)
typedef struct _IplImage
{
int nSize; /* IplImage大小 */
int ID; /* 版本 (=0)*/
int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */
int alphaChannel; /* 被OpenCV忽略 */
int depth; /* 像素的位深度,主要有以下支持格式: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,IPL_DEPTH_16S, IPL_DEPTH_32S,
IPL_DEPTH_32F 和IPL_DEPTH_64F */
char colorModel&#91;4&#93;; /* 被OpenCV忽略 */
char channelSeq&#91;4&#93;; /* 同上 */
int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道.
只有cvCreateImage可以创建交叉存取图像 */
int origin; /*图像原点位置: 0表示顶-左结构,1表示底-左结构 */
int align; /* 图像行排列方式 (4 or ,在 OpenCV 被忽略,使用 widthStep 代替 */
int width; /* 图像宽像素数 */
int height; /* 图像高像素数*/
struct _IplROI *roi; /* 图像感兴趣区域,当该值非空时,
只对该区域进行处理 */
struct _IplImage *maskROI; /* 在 OpenCV中必须为NULL */
void *imageId; /* 同上*/
struct _IplTileInfo *tileInfo; /*同上*/
int imageSize; /* 图像数据大小(在交叉存取格式下ImageSize=image->height*image->widthStep),单位字节*/
char *imageData; /* 指向排列的图像数据 */
int widthStep; /* 排列的图像行大小,以字节为单位 */
int BorderMode&#91;4&#93;; /* 边际结束模式, 在 OpenCV 被忽略*/
int BorderConst&#91;4&#93;; /* 同上 */
char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */
} IplImage;
这就是IplImage具体的定义,我们可以看出这个结构体几乎反映了所有的图像信息


2.与IplImage相关的常用的几个函数

1. 图像载入函数
函数cvLoadImage载入指定图像文件,并返回指向该文件的IplImage指针。函数支持bmp、jpg、 png、 tiff等格式的图像。其函数原型如下:
IplImage* cvLoadImage( const char* filename, int iscolor);
其中,filename 是待载入图像的名称,包括图像的扩展名;iscolor是一个辅助参数项,可选正数、零和负数三种值,正数表示作为三通道图像载入,零表示该图像作为单通道图像,负数表示载入图像的通道数由图像文件自身决定。
2. 窗口定义函数
函数cvNamedWindow定义一个窗口,用于显示图像。其函数原型如下:
int cvNamedWindow( const char* name, unsigned long flags );
其中,name是窗口名,flags是窗口属性指标值,可以选择CV_WINDOW_AUTOSIZE和0两种值。CV_WINDOW_AUTOSIZE表示窗口尺寸与图像原始尺寸相同,0表示以固定的窗口尺寸显示图像。
3. 图像显示函数
函数cvShowImage是在指定的窗口中显示图像,其函数原型如下:
void cvShowImage( const char* name, const CvArr* image );
其中,name是窗口名称,image是图像类型指针,一般是IplImage指针。
4. 图像保存函数
函数cvSaveImage以指定的文件名保存IplImage类型的指针变量,其函数原型如下:
int cvSaveImage( const char* filename, const CvArr* image );
其中,filename是图像保存路径和名称,image是IplImage指针变量。
5. 图像销毁函数
函数cvReleaseImage销毁已定义的IplImage指针变量,释放占用内存空间。其函数原型如下:
void cvReleaseImage( IplImage** image );
其中,image为已定义的IplImage指针


那么上述程序就很容易解释了!

猜你喜欢

转载自lps-683.iteye.com/blog/2249433