




已阅读5页,还剩7页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
精品文档近几周通过对C语言及OPENCV的逐渐学习,初步了解了OPENCV的一些知识,现在对自己的学习做一个总结。OpenCV是一个开源的计算机视觉库,其采用C编写,被设计成为可移植的函数库,OpenCV的设计目标是执行速度尽可能的快,其主要关注的是实时应用。OpenCV的结构和内容:上面这幅截图是 OpenCV源码的文件组成结构,可以看出其中包括cv,cvaux,cxcore,highgui,ml这5个模块。CV:包含了基本的图像处理函数和高级的计算机视觉算法,包括图像处理,图像结构分析,运动描述和跟踪,模式识别和摄像机标定。ML: 是机器学习库,包含一些基于统计的分类和聚类工具。HighGUI:包含图像和视频的输入/输出函数。CXCORE:包含了 OpenCV 的一些基本的数据结构和相关函数。CVAUX :该模块则是一般用存放即将被淘汰的算法和函数,同时也包含一些新出现的实验性的函数和算法。下面是我学习OPENCV时具体例子:(1)利用OPENCV加载一幅图片:刚开始学习是对OPENCV不怎么懂,不知道其怎么使用。最后发现OPENCV就是一个用做信号,图像等方面检测处理的C语言库,只要把库添加到VISUAL C中便可以。然后我们用VISUAL 做我们所需要的分析处理。#include”highgui.h”Void main() IplImage *img=cvLoadImage(“D:02.jpg”); cvNamedWindow(“example1”,CV_WINDOW_AUTOSIZE); cvShowImage(“example1”,img); cvWaitkey(0); cvReleaseImage(&img); cvDestroyWindow(“example1”);其实这个例子很简单,就是调用显示一张图片了。#include”highgui.h”这句是包含头文件了,highgui.h中包含图像处理,显示等方面的函数。IplImage *img=cvLoadImage(“D:02.jpg”);该功能是将显示的图像加载至内存,cvLoadImage();执行后返回的是一个指针,此指针指向一块描述该图片属性信息的结构体。IplImage为一个结构体,专门用在图像的处理。我们也可以看下IplImage的数据结构 其实他是这样定义的:Typedef struct_IplImageInt size;Int id;Int nChannels;Int alphaChannel;Int depth;.IplImage;从这里可以看见IplImage是结构体,并且怎么定义的。cvNamedWindow(“example1”,CV_WINDOW_AUTOSIZE);作用在屏幕上创建一个窗口,将被显示的图片包含在该窗口中,函数的第一个参数指定了该创建窗口的标题,第二个参数定义了窗口的属性,CV_WINDOW_AUTOSIZE表示窗口的大小随着图像的大小自动的缩放,如果此处该为0,则窗口的大小固定,不会随图片的大小缩放。 cvShowImage(“example1”,img);在创建好的窗口中显示图像,第一个参数设定在你那个已经存在的窗口中显示图片,第二个参数为一个指针。 cvWaitkey(0);是程序暂停,等待用户触发一个按键操作,如果其中的参数值设定为正数时,程序暂停该正数个毫秒单位。这里也可以尝试,如程序写成:Char c=cvWaitKey(0);If(c=27)break;意思是说当有ESC键按下时推出,(27为ESC的ASCII码) cvReleaseImage(&img);图片加载完成后,我们释放该图片所分配的内存。 cvDestroyWindow(“example1”);释放为创建窗口分配的内存。(2)利用OPENCV 播放AVI格式视屏:使用OPEN CV播放视屏和使用它显示一张图片一样,都是比较容易的。以下这段程序实现播放一段视屏(注意是AVI格式的):#include highgui.hvoid main( ) cvNamedWindow(example2,0); CvCapture *capture=cvCreateFileCapture(d:test4.avi); IplImage *frame; while(1) frame=cvQueryFrame(capture); if(!frame)break; cvShowImage(example2,frame); char c=cvWaitKey(33); if(c=27)break; cvReleaseCapture(&capture); cvDestroyWindow(example2);现在对程序做以解释:#include highgui.hcvNamedWindow(example2,0); 这两个在(1)中已经做过解释。CvCapture *capture=cvCreateFileCapture(d:test4.avi);对比加载图片的函数IplImage *img=cvLoadImage(“D:02.jpg”);这段代码的意思是加载视屏,执行后返回的是一个指针,此指针指向一块描述该视屏属性信息的结构体。其中CvCaputer和IplImage相类似,都是一个结构体,不同的是一个放的是视屏的信息,一个放的是图片的信息。IplImage *frame;这句定义一个IplImage结构体指针,因为视屏是一帧一帧的(一张一张的图片连续组成的)组成的,故播放视屏其实就是很快速的把这些一帧一帧的图片播放完,所以在循环体中使用IplImage结构体指针frame指向帧。while(1) frame=cvQueryFrame(capture); if(!frame)break; cvShowImage(example2,frame); char c=cvWaitKey(33); if(c=27)break; 进入循环体后,便开始播放AVi视屏了,cvQueryFrame();的作用其实和加载图片时用的cvLoadImage();函数的功能是一样的,不同的是,每次使用cvLoadImage();都为图片分配内存空间,而cvQueryFrame();使用已经在CvCapture中分配好的内存。这样就没有必要显示完一帧后就用cvReleaseImage();释放内存空间,在此程序最后用cvReleaseCapture(&capture);便可以释放掉内存。char c=cvWaitKey(33); if(c=27)break;意思是显示一个帧后会延迟33毫秒然后在显示下一个帧,如果中间有ESC按键触发(ESC的ASCII码为27),程序直接退出。cvReleaseCapture(&capture); cvDestroyWindow(example2);当然是释放内存空间了,养成释放内存空间总是好习惯的,虽然现在计算机内存已经很大了,但是对一个较大的程序项目而言,如果没有很好的利用资源,可以想象造成什么不良后果。以下为播放视屏的截图。(3)OPENCV为播放视屏添加滚动条在(2)中实现了播放一段视屏,但是一般看视屏时都要添加滚动条,没有滚动条不方便。/包含了图像和视频的输入/输出#include highgui.h/用来标定滚动条当前的位置,为全局变量。为了区分局部变量,加g以表示区别。int g_slider_position =0;/将打开的视频文件作为一个全局变量使用CvCapture * g_Capture=NULL;/(回调函数:很有意义)当拖动滚动条后,会回调这个函数,同时会将当前滚动条的位置以32 位形式传递过来void CallBackTrackBarSlide(int pos)/这里便是重新设置视频文件当前播放的帧cvSetCaptureProperty(g_Capture,CV_CAP_PROP_POS_FRAMES,pos);/使用了命令行下运行的形式,其中要在命令行下传递参数,在DOS下执行命令。int main(int argc,char *argv)cvNamedWindow(example2,CV_WINDOW_AUTOSIZE);/根据参数打开指定的视频文件g_Capture=cvCreateFileCapture(“D:test04.avi”);/获得总的帧数Int Frames= (int)cvGetCaptureProperty(g_Capture,CV_CAP_PROP_FRAME_COUNT);if(Frames!=0)/创建滚动条,在这里指定了滚动条拖动后的回调函数cvCreateTrackbar(TrackBar,example2,&g_slider_position, Frames,CallBackTrackBarSlide);IplImage * frame;/循环的顺序的遍历所有的帧while(1)/获取当前帧的下一个帧,并将其加载到内存中frame=cvQueryFrame(g_Capture);if(frame=0)break;cvShowImage(example2,frame);char ckeycode=cvWaitKey(33);/ASCII码中27为ESC。if(cKeyCode=27)break;cvReleaseCapture(&g_Capture);cvDestroyWindow(example2);return( 0);从本质上说,这种方法是通过添加一个全局变量来表示滚动条位置并且添加一个回调函数更新变量以及重新设置视频读入位置。我们通过一个调用来创建滚动条和确定回调函数 。下面让我们看看细节。intg_slider_position=0; CvCapture*g_capture=NULL;首先为滚动条位置定义一个全局变量。由于回调函数需要使用CvCapture对象,因此我们将它定义为全局变量。为了使我们的程序可读性更强,我们在所有全局变量名称前面加上g_。voidonTrackbarSlide(intpos) cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);现在我们定义一个回调函数,使其在滚动条被拖动时调用。滚动条的位置会被作为一个32位整数以参数形式传入。后面我们会常常看到函数cvSetCaptureProperty()被调用,同时与之配套的函数cvGetCaptureProperty()也经常会被调用。这些函数允许我们设置(或查询)CvCapture对象的各种属性。在本程序中我们设置参数CV_CAP_PROP_POS_ FRAMES(这个参数表示我们以帧数来设置读入位置,如果我们想通过视频长度比例来设置读入位置,我们可以通过用AVI_RATIO代替FRAMES来实现)。最后,我们把新的滚动条位置作为参数传入。因为HighGUI是高度智能化的,它会自动处理一些问题,比如滚动条对应位置不是关键帧,它会从前面一个关键帧开始运行并且快进到对应帧,而不需要我们来处理这些细节问题。intframes=(int)cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);正如前面所说,当需要从CvCapture结构查询数据时,可使用cvGetCaptureProperty函数。在本程序中,我们希望获得视频文件的总帧数以对滚动条进行设置(具体实现在后面)。if(frames!=0)cvCreateTrackbar(Position,Example3,&g_slider_position,frames,onTrackbarSlide); 前面的代码用来创建滚动条,借助函数cvCreateTrackbar()(最好自己查找具体的函数参数看一下,我们可设置滚动条的名称并确定滚动条的所属窗口。我们将一个变量绑定到这个滚动条来表示滚动条的最大值和一个回调函数(不需要回调函数时置为空,当滚动条被拖动时触发)。仔细分析,你会发现一点:cvGetCaptureProperty()返回的帧数为0时,滚动条不会被创建。这是因为对于有些编码方式,总的帧数获取不到,在这种情况下,我们只能直接播放视频文件而看不到滚动条 。最后,运行程序我们发现虽然实现了“拖动”的功能,但是并没有实现滚动条随着视频播放移动而移动的功能包含进来,下一步我们就解决这个问题。要实现这个功能,肯定是必须利用前面已经完成的带滚动条的播放程序,分析程序中的代码,其中我们定义的 s_slider_position全局变量是用来给滚动条定位了,在执行程序时通过cvCreateTrackbar子函数把滚动条的position信息给了s_slider_position, 如果我们有拖动滚动条的话,就会调用回调函数callbackTrackbarslider;在回调函数中又是一个调用子函数cvSetCaptureProperty用来设置滚动条的信息,这样就显示在屏幕上滚动条的位置改变了,如果平时没有拖动滚动条时,只要在循环播放时加上这句就可以,程序开始时 g_slider-position=0,然后建立了滚动条,然后进入循环体一帧一帧的显示,每次显示一帧后,让s_slider_position+,然后再用cvSetTrackbarPos(Trackbar,example2, g_slider_position);便可以解决,此外如果拖动滚动条后s_slider_position的值有所改变,我们只需要在回调函数中增加一句s_slider_position=pos;便可以了。修改后的程序如下:#include highgui.h#include cv.hint g_slider_position=0;CvCapture *g_capture=NULL;void callbackTrackbarSlide(int pos)g_slider_position=pos;cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);int main(int argc,char *argv) cvNamedWindow(example2,0); g_capture=cvCreateFileCapture(d:test4.avi);int frames=(int)cvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT); if(frames!=0) cvCreateTrackbar( Trackbar,example2,&g_slider_position,frames,callbackTrackbarSlide ); IplImage *frame; while(1) frame=cvQueryFrame(g_capture); if(frame=0)break; cvShowImage(example2,frame); char ckeycode=cvWaitKey(33); if(ckeycode=27)break; g_slider_position+; cvSetTrackbarPos(Trackbar,example2, g_slider_position); cvReleaseCapture(&g_capture); cvDestroyWindow(example2); return(0);(4)利用OPENCV对图像做简单高斯平滑处理:前面已经完成了图片的显示和视屏的播放,接下来对一幅图片做一个简单的高斯平滑处理。其中用的的函数为高斯平滑处理的函数:cvSmooth();在程序中已经加了注释,其中需要注意的是cvCreateimage(cvGetsize(img),IPL_DEPTH_8U,3);其功能是建立一幅图片(其实建立自己的图片结构空间),目的是为了存储经过高斯平滑处理后的图片。cvSmooth(img,out,CV_GAUSSIAN,3,3)中参数的解释:Img为输入图片,out为处理输出的图片,CV_GAUSSIAN代表做高斯平滑处理,3,3代表选用3*3的区域进行高斯平滑处理。/Include the cv and highgui block;/#include cv.h#include highgui.hint main(int argc,char *chargv)/Load a image from disk;/IplImage *img=cvLoadImage(D:lena.png);/Create some Window to show the input and out put image in;/cvNamedWindow(picturein,CV_WINDOW_AUTOSIZE);cvNamedWindow(pictureout,CV_WINDOW_AUTOSIZE);/Show our input image;/cvShowImage(picturein,img);/Create an image to hold the smoothed output;/IplImage *out=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,3);/Do the smooth;/cvSmooth(img,out,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 惠东消防知识培训课件
- 文库发布:情景式课件
- 甘肃省天水市甘谷县第一中学2026届化学高一第一学期期末质量跟踪监视试题含解析
- 2026届江苏省常州市奔牛高级中学化学高一上期末调研试题含解析
- 学校四班级新学期方案
- 陕西化学试题及答案
- 酒水知识试题及答案
- 探险之旅:技能揭秘
- 喉镜操作考试题及答案
- 家电公司采购档案管理细则
- 信任五环书籍读书提纲课件
- 江苏居住建筑标准化外窗系统应用技术规程157-2017
- 浮筒液位计演示教学课件
- (完整版)内孔数控车削加工(编程)教案
- 道亨铁塔长短腿基础配置系统-操作说明
- 皮瓣移植术后移植(再植)组织的局部观察课件
- DB11-T 1764.42-2020用水定额 第42部分:居民生活
- 蒂森克虏伯电梯 MC2-B控制系统用户手册
- 医疗器械嵌入式软件注册描述文档
- 工程认证《机械设计》课程教学大纲
- 建设工程五方责任主体法定代表人授权书、项目负责人质量终身责任承诺书
评论
0/150
提交评论