Opencv学习笔记【一】

  由于以后研究生会用到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个模块,其中四个模块如下图所示:

Opencv学习笔记【一】_第1张图片

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

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


(3) VS2013+OpenCV2.4.13的配置

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

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

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

Opencv学习笔记【一】_第2张图片

由于我用的是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( const char* filename, int iscolor CV_DEFAULT(CV_LOAD_IMAGE_COLOR))

1个参数是图像文件名,D:\pic.jpg

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


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

#include
#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的定义即可。

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

Opencv学习笔记【一】_第3张图片



你可能感兴趣的:(Opencv,学习笔记,AVI视频读取,opencv,Learnning,Opencv)