OpenCV中的C++类和函数都是定义在命名空间cv之内的,就像C++的命名空间是std一样。
OpenCV2的头文件
一般来说OpenCV2,使用哪一模块的内容就添加哪一模块的头文件,例如:
1、如果使用了Mat类,属于core模块。
那么头文件就是#include <opencv2/core/core.hpp>
2、如果使用了imread()或者imshow()函数输入与显示图像进行图形用户交互。
那么头文件就是#include <opencv2/highgui/highgui.hpp>
但是有一种更直接的方法,就是只是用使用头文件#include <opencv2/opencv.hpp>,为什么可以这样子用呢?因为OpenCV2所有模块的hpp文件都是包含在了opencv2文件夹内的。
但是要注意的是,如果直接使用头文件#include <opencv2/opencv.hpp>,每次编译程序时,会加载所有模块,有些模块是你不需要的,浪费时间,降低代码性能。
因此,对于新手,建议先使用头文件#include <opencv2/opencv.hpp>,这样不会因为头文件的问题苦恼,代码能运行就好了,这点时间还不算什么大事。而对于使用了一段时间OpenCV的程序员,此时,需要提高程序的性能,节省代码的处理时间,建议使用各个模块的头文件,也方便熟悉opencv的各个模块内容。
OpenCV的命名空间使用
第一种使用方法:使用using编译指令“using namespace cv;”,直接写在头文件后面。
#include<opencv2/opencv.hpp>
using namespace cv;
int main()
{
Mat frame;
frame=imread("1.png",1);
imshow("【神话】",frame);
waitKey(0);
return 0;
}
第二种使用方法:通过作用域解析运算符::,使用名称空间来限定该名称,在使用opencv类或者函数的时候在前面加上cv::来表示该名称属于名称空间cv。
cv::Mat
cv::imread()
cv::imshow()
两种方法的区别:
1、第一种方法使用简单,只需要添加1次,属于全局的,但是增加了名称冲突的可能性。假设,名称空间a和b中都有student这个名称,然后我在代码中使用了student这个名称,那么这个student到底属于谁,就说不清楚了。对于新手,代码量较小,基本上不存在名称冲突,为了方便,可以推荐使用,但是代码量大了,特别是添加了其它类库,就不推荐了。
2、第二种方法就是使用麻烦点,每个名称前面都需要添加1次,来表示该名称属于某个名称空间。但是此种方法不存在导致名称冲突的可能性,也符合C++名称空间的本意。所以,建议使用此种方法,大部分opencv程序员也是这么做的。