首页 > 学院 > 开发设计 > 正文

Opencv学习笔记【一】

2019-11-08 20:23:16
字体:
来源:转载
供稿:网友
  由于以后研究生会用到Opencv,于是最近开始了对Opencv的学习,我用的参考学习资料是 《Learnning Opencv》,开发环境是 VS2013+Opencv 2.4.13。  写博客的目的差不多像是写一篇学习笔记一样,我是菜鸟初学者,文中难免会有不当之处,还请大家不吝赐教~。  (1)SVN     看《Learning Opencv》的时候,碰到了SVN这个词,SVN是Subversion的缩写。

     Subversion是一个自由,开源的版本控制系统。在Subversion管理下,文件和目录可以超越时空。Subversion将文件存放在中心版本库里。这个版本库很像一个普通的文件服务器,不同的是,它可以记录每一次文件和目录的修改情况。这样就可以籍此将数据恢复到以前的版本,并可以查看数据的更改细节。正因为如此,许多人将版本控制系统当作一种神奇的“时间机器”。

  ( 英语单词解释:   Trunk:总线  Wiki:维基 

                                Garage:车库,存放区 // (英 ['gærɑː(d)ʒ; -ɪdʒ; gə'rɑːʒ]美 [gəˈrɑʒ; gəˈrɑdʒ])    )

  (2)OpenCV的组织结构

OpenCV包含5个模块,其中四个模块如下图所示:

除了以上4个模块之外,还有一个CVAux模块,该模块一般存放一些即将被淘汰的算法和函数,同时还有一些新出现的实验性的算法和函数。

未来CVAux中的一些函数、算法可能会被合并到CV模块,也可能永远留在CVAux模块中。

(3) VS2013+OpenCV2.4.13的配置

首先从opencv官网上下载opencv-2.4.13.exe,之后选择解压目录为D:/PRogramFiles/,之后点击Extract按钮,便进行解压,等待一段时间之后,解压就完成了,大小大约为3个G左右。(由于此处解压会自动生成根目录opencv,所以不需要提前新建一个叫Opencv的文件夹)。

   之后,便开始配置环境变量。(我的电脑->右键->属性->高级系统设置->环境变量)在用户变量上添加上opencv这个变量,值为D:/ProgramFiles/opencv/build。之后在用户变量区的PATH上(若无,则需先创建PATH变量)添加值D:/ProgramFiles/opencv/build/x86/vc12/bin。

   接下来在系统变量区的PATH变量上,添加值D:/ProgramFiles/opencv/build/x86/vc12/bin。

由于我用的是VS2013,所以对应的是vc12。(vc10对应VS2010,vc11对应vs2012,vc12对应vs2013)

  至此,我们就完成了对环境变量的配置,我们打开VS2013。

点击【新建】,创建项目,选择创建【Win32控制台应用程序】,点击【确定】,点击【下一步】,勾上【空项目】那个勾。

之后的步骤大致与Baidu经验上面讲的一致,详见

http://jingyan.baidu.com/article/acf728fd56f894f8e510a3d8.html。

以上为我自己配置opencv开发环境的一些过程,希望能给大家一些参考。

部分内容参考自:

http://jingyan.baidu.com/article/acf728fd56f894f8e510a3d8.html

http://blog.csdn.net/SherryD/article/details/51734334

关于一次配置,永久使用的问题可参照知乎网友的回答:

https://www.zhihu.com/question/24400428

(4)opencv AVI视频读取

 Opencv可以用CvCreateFileCapture(const char* filename)这个函数来打开AVI文件,返回值为CvCapture*类型指针,其中参数即为AVI文件所对应的Pathname。

 

cvQueryFrame(CVCapture*)用来获取Frame图像,返回值为ipLImage*

cvWaitKey(N);//(N>0时)等待N ms,返回值为用户按键的键值  N<=0时,等待用户按下一个按键。  ESC的键值为27

使用CvCapture和cvLoadImage不一样,此处IPLImage存放于CvCapture结构体中,没有单独开辟空间,所以不需要ReleaseImage,只需要ReleaseCapture即可。而若使用CvLoadImage,则在使用完之后,需要调用ReleaseImage(),以免造成内存泄漏;

CvCreateTrackbar()  //创建滚动条

【slide     英 [slaɪd]   美 [slaɪd]  vi.滑落;下跌;打滑;[棒球]滑垒 n. 幻灯片;降低】

为了使我们的程序可读性更强,我们可在所有的全局变量前面加上g_

【滚动条TrackBar】

cvCreateTrackbar("Track_bar","Video",&g_slider_postion, frames, onTrackbarSlide);

g_slider_postion为事先定义好的int (32bits整形变量),用来记录TrackBar的滑动位置,创建TrackBar时,就已经和TrackBar关联好了。

frames为视频总帧数,可通过CvGetCaptureProperty(g_capture,CV_CAP_PROP_FRAME_COUNT)获取到。

当Bar滑动时,OnTrackBarSlide回调函数(需要自己编写,若无,该处可设为NULL)即被调用,g_slider_postion作为实参被传递过去,通过cvSetCaptureProperty(g_capture,CV_CAP_PROP_POS_FRAMES,pos);

每显示一帧图像,可以让g_slider_postion++,再调用cvSetTrackbarPos("Track_bar","Video", g_slider_postion),这样便事先了滚动条随着视频播放而不断移动了。

(5) CvLoadImgae函数

  cvLoadImage()函数原型:

cvLoadImage(constchar* filename,int iscolorCV_DEFAULT(CV_LOAD_IMAGE_COLOR))

第1个参数是图像文件名,如”D:/pic.jpg”

第2个参数是读取图像的方式,-1 表示按照图像本身的类型来读取,1表示强制彩色化,0 表示强制灰值化

(6)读取AVI视频并播放,且带有滚动条的程序代码实现如下:

#include<iostream>#include "highgui.h"/*该程序实现了对Test.avi的读取播放,并实现了进度滚动条的功能。(播放过程中可按ESC键退出播放)*/using namespace cv;CvCapture* g_capture = NULL;int g_slider_postion = 0;//滚动条滑动位置记录变量,32位整数值void onTrackbarSlide(int pos)  //滚动条滚动时的回调函数{	cvSetCaptureProperty(g_capture, CV_CAP_PROP_POS_FRAMES, pos);}int main(int argc,char** argv){	g_capture = cvCreateFileCapture("Test.avi");//读入AVI,创建CvCapture结构于AVI文件开头.	cvNamedWindow("Video", CV_WINDOW_AUTOSIZE);	int frames =(int) cvGetCaptureProperty(g_capture, CV_CAP_PROP_FRAME_COUNT);//得到AVI视频总帧数,为g_slider_pos的max值	if (frames != 0)	{		cvCreateTrackbar("Track_bar", "Video", &g_slider_postion, frames, onTrackbarSlide);             //当视频总帧数可以获取时,创建TrackBar	}//g_slider_postion记录滑动位置,frames为滑动位置最大值,onTrackbarSlide为回掉函数	char c;	IplImage *img = NULL;	while (1)	{		img = cvQueryFrame(g_capture);  //读入一帧图片至CvCapture结构中		if (!img) break;//读取结束,Break		cvShowImage("Video", img);		g_slider_postion++;		cvSetTrackbarPos("Track_bar", "Video", g_slider_postion);		c = cvWaitKey(33);   //帧率为  30帧/s  1帧=33Ms   此处为人为指定帧率,也可以通过CvCapture结构体中成员精确控制帧率		if (c == 27) break;  //27是ESC的ASCII键值	}	cvDestroyWindow("Video");	cvReleaseCapture(&g_capture);	return 0;}

(7)在VS2013中直接编译运行上述程序时,出现了一个Error

   error C4996:'fopen': This function or variable may be unsafe. Consider using fopen_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online helpfor details.  

 

由于CV模块中某些头文件中包含了fopen这个函数,所以在VS2013开发环境下,会报错fopen不安全(我尝试过将库文件里报错的地方fopen改为fopen_s,但是会导致更多的错误,因此我选择了禁用安全警告)只需选择【项目】->【属性】->【c/c++】->【预处理器】->【预处理定义】->【点击下拉按钮】,之后添加_CRT_SECURE_NO_WARNINGS的定义即可。

 禁用安全警告之后,编译运行无误,程序达到了预期的效果:


上一篇:WCF回调实现

下一篇:Unicode与UTF-8转换

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表