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( 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的定义即可。
禁用安全警告之后,编译运行无误,程序达到了预期的效果: