CXCORE
包含数据结构、矩阵运算、数据变换、对象持久(object persistence)、内存管理、错误处理、动态装载、绘图、文本和基本的数学功能等 CV
图象处理和计算机视觉功能
包含图像处理、图像结构分析、运动描述和跟踪、模式识别和摄像机标定。
Machine Learning (ML)
包含许多聚类、分类和数据分析函数。 HighGUI 用户交互部分
包含图形用户界面和图像/视频的读/写,系统调用函数等。
二、
OpenCV的CV模块包含基本的图像处理函数和高级的计算机视觉算法。ML是机器学习库,包含一些基于统计的分类和聚类工具。HighGUI包含图像和视频输入/输出的函数。CXCore包含OpenCV的一些基本数据结构和相关函数。
三、
在编译时,有几个头文件非常重要,它们分别是:机器视觉中所要用到的“…/cv/include/cv.h”和“…/cxcore/include/cxcore.h”;I/O操作中所要用到的“…/otherlibs/highgui/highgui.h”;机器学习中所要用到的“…/ml/include/ml.h”。
OpenCV开发包提供了读取各种类型的图像文件、视频内容以及摄像机输入的功能。这些功能是OpenCV开发包中所包含的HighGUI工具集的一部分
四、EXAMPLES
1.从磁盘加载并在屏幕上显示图象 #include”highgui.h”
int main(int argc,char** argv); {
IplImage *img=cvLoadImage(agrv[1]); //将图像文件加载至内存,cvLoadImage()函数是一个高层调用接口,它通过文件名确定被加载文件的格式,。IplImage结构体将是我们在使用OpenCV时会最常用到的数据结构
cvNamedWindow(”Example 1”,CV_WINDOW_AUTOSIZE); // cvNamedWindow()函数用于在屏幕上创建一个窗口,将被显示的图像包含于该窗口中。函数的第一个参数指定了该窗口的窗口标题,cvNamedWindow()函数的第二个参数定义了窗口的属性。该参数可被设置为0(默认值)或CV_WINDOW_AUTOSIZE,设置为0时,窗口的大小不会因图像的大小而改变,图像只能在窗口中根据窗口的大小进行拉伸或缩放;而设置为CV_WINDOW_AUTOSIZE时,窗口则会根据图像的实际大小自动进行拉伸或缩放,以容纳图像
cvShowImage(”Example 1”,img);// 只要有一个与某个图像文件相对应的IplImage*类型的指针,我们就可以在一个已创建好的窗口(使用cvNamedWindow()函数创建)中使用cvShowImage()函数显示该图像。cvShowImage()函数通过设置其第一个参数确定在哪个已存在的窗口中显示图像。cvShowImage()函数被调用时,该窗口将被重新绘制,并且图像也会显示在窗口中。如果该窗口在创建时被指定CV_WINDOW_AUTOSIZE标志作为cvNamedWindow()函数的第二个参数,该窗口将根据图像的大小自动调整为与图像一致。
cvWaitKey(0);// 使程序暂停,等待用户触发一个按键操作。但如果将该函数参数设为一个正数,则程序将暂停一段时间,时间长为该整数值个毫秒单位,然后继续执行程序,即使用户没有按下任何键。当设置该函数参数为0或负数时,程序将一直等待用户触发按键操作。
cvReleaseImage(&img);// 通过为cvReleaseImage()函数传递一个类型为IplImage*的指针参数调用该函数,用以执行内存释放操作。对cvReleaseImage()函数的调用执行完毕后,img指针将被设置为NULL
cvDestroyWindow(“Example 1”);// cvDestroyWindow()函数将关闭窗口,并同时释放为该窗口所分配的所有内存(包括窗口内部的图像内存缓冲区,该缓冲区中保存了与img指针相关的图像文件像素信息的一个副本) }
2.播放AVI视频 #include”highgui.h” int main(int argc,char **argv) {
cvNamedWindow(“Example 2”,CV_WINDOW_AUTOSIZE);
CvCapture *capture=cvCreatFileCapture (argv[1]); // 函数cvCreateFileCapture()通过参数设置确定要读入的AVI文件,返回一个指向CvCapture结构的指针。这个结构包括了所有关于要读入AVI文件的信息,其中包含状态信息。在调用这个函数后,返回指针所指向的CvCapture结构被初始化到所对应AVI文件的开头。
IplImage *frame; While(1)
{ frame=cvQueryFrame(capture);// 一旦进入while(1)循环,我们便开始读入AVI文件,cvQueryFrame的参数为CvCapture结构的指针。用来将下一帧视频文件载入内存(实际是填充或更新CvCapture结构中)。返回一个对应当前帧的指针
If(!frame) break;
cvShowImage(“Example 2”,frame); char c=cvWaitKey(33); if (c==27) break; }
cvReleaseCapture(&capture);// 退出循环体(视频文件已经读入结束或者用户触发了Esc键)后,我们应该释放为CvCapture结构开辟的内存空间,这同时也会关闭所有打开的AVI文件相关的文件句柄。
cvDestroyWindow(“Example 2”); }
3. 视频播放控制
滚动条可以使我们方便地从视频的一帧跳到另外一帧。我们通过调用cvCreateTrackbar()来创建一个滚动条,并且通过设置参数确定滚动条所属于的窗口。为了获得所需的功能,只需要提供一个回调函数。 拖动滚动条,函数onTrackSlide()便被调用并被传入滚动条新的状态值.
从本质上说,这种方法是通过添加一个全局变量来表示滚动条位置并且添加一个回调函数更新变量以及重新设置视频读入位置。我们通过一个调用来创建滚动条和确定回调函数 #include”cv.h” #include”highgui.h” int g_slider_position=0;
CvCapture *capture=NULL;//首先为滚动条位置定义一个全局变量。由于回调函数需要使用CvCapture对象,因此我们将它定义为全局变量
void onTrackbarSlide(int pos) { cvSetCaptureProperty
( g_capture,
CV_CAP_PROP_POS_FRAMES,
pos);
} //现在我们定义一个回调函数,使其在滚动条被拖动时调用。滚动条的位置会被作为一个32位整数以参数形式传入。
后面我们会常常看到函数cvSetCaptureProperty()被调用,同时与之配套的函数cvGetCaptureProperty()也经常会被调用。这些函数允许我们设置(或查询)CvCapture对象的各种属性。在本程序中我们设置参数CV_CAP_PROP_POS_ FRAMES(这个参数表示我们以帧数来设置读入位置,如果我们想通过视频长度比例来设置读入位置,我们可以通过用AVI_RATIO代替FRAMES来实现)。最后,我们把新的滚动条位置作为参数传入 int main(int argc,char**argv)
{ cvNamedWindow(“Example 3”,CV_WINDOW_AUTOSIZE); g_capture=cvCreatFileCapture(argv[1]); int frames=(int) cvGetCaptureProperty ( g_capture,
CV_CAP_PROP_FRAME_COUNT);// 当需要从CvCapture结构查询数据时,可使用cvGetCaptureProperty函数 if(frames!=0) { cvCreateTrackbar ( “position”, “Example 3”, &g_slider_position,
frames,
onTrackbarSlide);
}//前面的代码用来创建滚动条,借助函数cvCreateTrackbar(),我们可设置滚动条的名称并确定滚动条的所属窗口。我们将一个变量绑定到这个滚动条来表示滚动条的最大值和一个回调函数(不需要回调函数时置为空,当滚动条被拖动时触发)。仔细分析,你会发现一点:cvGetCaptureProperty()返回的帧数为0时,滚动条不会被创建。这是因为对于有些编码方式,总的帧数获取不到,在这种情况下,我们只能直接播放视频文件而看不到滚动条 IplImage*frame;
// While loop (as in Example 2) capture & show video ...
// Release memory and destroy window ... return(0); }
4.载入一幅图象并进行平滑处理 #include”cv.h” #include”highgui.h”
void example2_4(IplImage *image) { cvNamedWindow(“example4-in”);
cvNamedWindow(“example4-out”); //creat some windows to show the input and output images in
cvShowImage(“example4-in”,image);//show our input image IplImage*out=cvCreatImage(cvGetSize(image),IPL_DEPTH_8U,3); //creat an image to hold the smooth output 。第一个参数是一个CvSize结构,这个结构可以通过cvGetSize(image)方便地获得;第一个参数说明了当前图像结构的大小。第二个参数告诉了我们各通道每个像素点的数据类型,最后一个参数说明了通道的总数。所以从程序中可以看出,当前图像是3个通道(每个通道8位),图像大小同image。 cvSmooth(image,out,CV_GAUSSIAN,3,3);//do the smooth 我们通过使用每个像素周围3*3区域进行高斯平滑处理
cvShowImage(“example4-out”,out);//show the smoothed image in the output window
cvReleaseImage(&out);//be tidy 现在我们可以在我们新窗口中显示处理后的图像然后释放它:cvReleaseImage()通过给定一个指向IplImage*的指针来释放与图像对应的内存空间。
cvWaitKey(0);//wait for the user to hit a key ,then clean up the windows cvDestroyWindow(“example4-in”); cvDestroyWindow(“example4-out”); }
5.使用cvPyrDown() 创建一幅宽度和高度为输入图像一半尺寸的图像(只是用于这个功能的一小段程序) IplImage* doPyrDown( IplImage* in,
int filter = IPL_GAUSSIAN_5x5 ) {
// Best to make sure input image is divisible by two. assert( in->width%2 == 0 && in->height%2 == 0 ); IplImage* out = cvCreateImage( cvSize( in->width/2, in->height/2 ), in->depth, in->nChannels );
cvPyrDown( in, out ); return( out ); };
因篇幅问题不能全部显示,请点此查看更多更全内容