opencv初步学习总结Word文档格式.docx
《opencv初步学习总结Word文档格式.docx》由会员分享,可在线阅读,更多相关《opencv初步学习总结Word文档格式.docx(13页珍藏版)》请在冰豆网上搜索。
![opencv初步学习总结Word文档格式.docx](https://file1.bdocx.com/fileroot1/2022-11/15/407090f6-4d54-46f4-bc78-bfbac5bba1d2/407090f6-4d54-46f4-bc78-bfbac5bba1d21.gif)
刚开始学习是对OPENCV不怎么懂,不知道其怎么使用。
最后发现OPENCV就是一个用做信号,图像等方面检测处理的C语言库,只要把库添加到VISUALC中便可以。
然后我们用VISUAL做我们所需要的分析处理。
#include”highgui.h”
Voidmain(){
IplImage*img=cvLoadImage(“D:
\\02.jpg”);
cvNamedWindow(“example1”,CV_WINDOW_AUTOSIZE);
cvShowImage(“example1”,img);
cvWaitkey(0);
cvReleaseImage(&
img);
cvDestroyWindow(“example1”);
}
其实这个例子很简单,就是调用显示一张图片了。
这句是包含头文件了,highgui.h中包含图像处理,显示等方面的函数。
IplImage*img=cvLoadImage(“D:
该功能是将显示的图像加载至内存,cvLoadImage();
执行后返回的是一个指针,此指针指向一块描述该图片属性信息的结构体。
IplImage为一个结构体,专门用在图像的处理。
我们也可以看下IplImage的数据结构其实他是这样定义的:
Typedefstruct_IplImage{
Intsize;
Intid;
IntnChannels;
IntalphaChannel;
Intdepth;
………….
}IplImage;
从这里可以看见IplImage是结构体,并且怎么定义的。
cvNamedWindow(“example1”,CV_WINDOW_AUTOSIZE);
作用在屏幕上创建一个窗口,将被显示的图片包含在该窗口中,函数的第一个参数指定了该创建窗口的标题,第二个参数定义了窗口的属性,CV_WINDOW_AUTOSIZE表示窗口的大小随着图像的大小自动的缩放,如果此处该为0,则窗口的大小固定,不会随图片的大小缩放。
在创建好的窗口中显示图像,第一个参数设定在你那个已经存在的窗口中显示图片,第二个参数为一个指针。
是程序暂停,等待用户触发一个按键操作,如果其中的参数值设定为正数时,程序暂停该正数个毫秒单位。
这里也可以尝试,如程序写成:
Charc=cvWaitKey(0);
If(c==27){break;
意思是说当有ESC键按下时推出,(27为ESC的ASCII码)
图片加载完成后,我们释放该图片所分配的内存。
释放为创建窗口分配的内存。
(2)利用OPENCV播放AVI格式视屏:
使用OPENCV播放视屏和使用它显示一张图片一样,都是比较容易的。
以下这段程序实现播放一段视屏(注意是AVI格式的):
#include"
highgui.h"
voidmain(){
cvNamedWindow("
example2"
0);
CvCapture*capture=cvCreateFileCapture("
d:
\\test4.avi"
);
IplImage*frame;
while
(1){
frame=cvQueryFrame(capture);
if(!
frame){break;
cvShowImage("
frame);
charc=cvWaitKey(33);
if(c==27){break;
}
cvReleaseCapture(&
capture);
cvDestroyWindow("
现在对程序做以解释:
cvNamedWindow("
这两个在
(1)中已经做过解释。
CvCapture*capture=cvCreateFileCapture("
对比加载图片的函数IplImage*img=cvLoadImage(“D:
这段代码的意思是加载视屏,执行后返回的是一个指针,此指针指向一块描述该视屏属性信息的结构体。
其中CvCaputer和IplImage相类似,都是一个结构体,不同的是一个放的是视屏的信息,一个放的是图片的信息。
IplImage*frame;
这句定义一个IplImage结构体指针,因为视屏是一帧一帧的(一张一张的图片连续组成的)组成的,故播放视屏其实就是很快速的把这些一帧一帧的图片播放完,所以在循环体中使用IplImage结构体指针frame指向帧。
while
(1){
进入循环体后,便开始播放AVi视屏了,cvQueryFrame();
的作用其实和加载图片时用的cvLoadImage();
函数的功能是一样的,不同的是,每次使用cvLoadImage();
都为图片分配内存空间,而cvQueryFrame();
使用已经在CvCapture中分配好的内存。
这样就没有必要显示完一帧后就用cvReleaseImage();
释放内存空间,
在此程序最后用cvReleaseCapture(&
便可以释放掉内存。
charc=cvWaitKey(33);
意思是显示一个帧后会延迟33毫秒然后在显示下一个帧,如果中间有ESC按键触发(ESC的ASCII码为27),程序直接退出。
cvReleaseCapture(&
当然是释放内存空间了,养成释放内存空间总是好习惯的,虽然现在计算机内存已经很大了,但是对一个较大的程序项目而言,如果没有很好的利用资源,可以想象造成什么不良后果。
以下为播放视屏的截图。
(3)OPENCV为播放视屏添加滚动条
在
(2)中实现了播放一段视屏,但是一般看视屏时都要添加滚动条,没有滚动条不方便。
//包含了图像和视频的输入/输出
//用来标定滚动条当前的位置,为全局变量。
为了区分局部变量,加g以表示区别。
intg_slider_position=0;
//将打开的视频文件作为一个全局变量使用
CvCapture*g_Capture=NULL;
//(回调函数:
很有意义)当拖动滚动条后,会回调这个函数,同时会将当前滚动条的位置以32位形式传递过来
voidCallBackTrackBarSlide(intpos)
{
//这里便是重新设置视频文件当前播放的帧
cvSetCaptureProperty(g_Capture,CV_CAP_PROP_POS_FRAMES,pos);
//使用了命令行下运行的形式,其中要在命令行下传递参数,在DOS下执行命令。
intmain(intargc,char*argv[])
CV_WINDOW_AUTOSIZE);
//根据参数打开指定的视频文件
g_Capture=cvCreateFileCapture(“D:
\\test04.avi”);
//获得总的帧数
IntFrames=(int)cvGetCaptureProperty(g_Capture,CV_CAP_PROP_FRAME_COUNT);
if(Frames!
=0)
{
//创建滚动条,在这里指定了滚动条拖动后的回调函数
cvCreateTrackbar("
TrackBar"
"
&
g_slider_position,Frames,CallBackTrackBarSlide);
IplImage*frame;
//循环的顺序的遍历所有的帧
while
(1)
//获取当前帧的下一个帧,并将其加载到内存中
frame=cvQueryFrame(g_Capture);
if(frame==0){
break;
}
cvShowImage("
charckeycode=cvWaitKey(33);
//ASCII码中27为ESC。
if(cKeyCode==27){
g_Capture);
return(0);
从本质上说,这种方法是通过添加一个全局变量来表示滚动条位置并且添加一个回调函数更新变量以及重新设置视频读入位置。
我们通过一个调用来创建滚动条和确定回调函数。
下面让我们看看细节。
int
g_slider_position
=
0;
CvCapture*
g_capture
NULL;
首先为滚动条位置定义一个全局变量。
由于回调函数需要使用CvCapture对象,因此我们将它定义为全局变量。
为了使我们的程序可读性更强,我们在所有全局变量名称前面加上g_。
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来实现)。
最后,我