一、简述opencv安装目录下的文件夹

opencv_core 核心功能,特别是基本的数据结构和数学函数

opencv_imgproc 主要的图像处理函数(滤波、模糊、缩放、直方图等)

opencv_highgui 图像和视频接口函数

opencv_features2d 特征点检测器和特征点匹配框架(SURF,FAST等)

opencv_calib3d 摄像头标定函数、3D重建函数等

opencv_video 运动估计,特征追踪和前景提取函数(光流法,移动模板,背景消除)

opencv_objdetect 物体检测函数如人脸和行人检测器(haar&LBP人脸检测和识别)

opencv_ml 机器学习函数(SVM,决策树,级联分类器等)

opencv_flann 计算几何算法

opencv_legacy 废弃的代码

opencv_gpu GPU加速代码,但不是很稳定

opencv_contrib 最新贡献的但不是很成熟的库函数


二、VS中的解决方案和项目

一般而言,一个解决方案可以由多个项目组成,每一个项目又是相对独立的软件模块,例如:一个软件模块和一个库模块,这样解决方案内的项目可以共享文件和库。


三、VS中的Debug模式和Release模式

Debug模式可以帮助你创建和调试程序,它是一个更加受保护的环境,可能可以告诉你程序存在的某些问题,如内存泄漏和运行时检查函数是否正常运行,但是它产生的可执行文件运行可能较慢,这就是当程序准备好后为什么要用Release模式建立可执行文件的原因。注意到有可能在调试模式下运行良好的程序在Release模式下可能会报错,这时候需要继续追溯错误的根源。大多数的IDE都提供这两种编译模式。


四、VS中包含目录

最好使用环境变量的方式,因为不同的运行环境下opencv安装环境都不一样,使用环境变量可以有效的避免程序运行在他处时修改Property Sheets的窘境。使用方式为设定opencv包含目录为d:\Opencv2.6,这样可以将opencv目录表达成$(OPENCV2_DIR)\include和$(OPENCV2_DIR)\lib。


五、opencv基础知识笔记

·Mat image;//创建一个大小为0*0的矩阵,image中的data指针指向分配的内存,没有分配内存时初始化为0.

·对于Mat类型的对象,采用引用计数和浅复制的方式,所以直接用赋值语句是不能复制图像数据的,只会复制data指针,该指针指向数据区,如果想要复制数据的话可以采用clone成员函数和copyTo函数。

·引用计数的方式可以将数据区保存直到所有指向的数据区的引用析构。这样的话可以很方便的跨函数返回函数中的Mat指针。

例:

Mat func(){
    ima(240,320,CV_8U,Scalar(100));
    return ima;
}
int main()
{
    Mat gray = func();
    return 0;
}

这时在函数内分配的空间将会被gray变量所拥有,而无需开辟另外的存储空间,这就是引用计数带来的好处。事实上,return回来的是ima的浅复制版本,当ima局部变量生命周期结束,将会被回收。但由于引用计数不为0(又被gray变量拥有),因此分配的内存不会被释放。


此机制可能引发一些问题:


class Test {
// image attribute
cv::Mat ima;
public:
// constructor creating a gray-level image
Test() : ima(240,320,CV_8U,cv::Scalar(100)) {}
// method return a class attribute, not a good idea...
cv::Mat method() { return ima; }
};

如果返回ima的浅拷贝,后续对ima浅拷贝修改了将会变相修改ima成员变量的值(往往是非预期的),此时注意最好返回ima的深拷贝版本。


·imwrite("output.bmp",result);//文件扩展名决定了保存图片时使用的编码器

·C++版本的Mat和C版本的Iplimage之间可以很轻松的相互转换

例一、

IplImage* iplImage = cvLoadImage("c:\\img.jpg");
cv::Mat image4(iplImage,false);

注意到第二个变量设定为false指明不想得到图像数据区的拷贝(默认值),指明为true得到新的拷贝。这里可能出现的问题是迷途指针Iplimage*,因此更好的解决方案是使用Opencv2.0版本提供的安全指针Ptr template(据说是参考Boost库的相关技术),简单的说就是加入了一个引用计数和操作符重载,让需要手动release的指针自动Release方便内存管理。


cv::Ptr<IplImage> iplImage = cvLoadImage("c:\\img.jpg");

最后:尽量使用Mat吧。