阅读opencv2计算机视觉编程手册的一些笔记,供自己快速以后查阅!
一.opencv的各大模块
二.opencv示例代码
OpenCV的各大模块
- core模块,包含核心功能,尤其是底层数据结构和算法函数;
- imgproc模块,包含图像处理函数;
- highgui模块,包含读写图像及视频的函数,以及操作图形用户界面函数;
- features2d模块,包含兴趣点检测子,描述子以及兴趣点匹配框架;
- calib3d模块,包含相机标定,双目几何估算以及立体视觉函数;
- video模块,包含运动估算,特征跟踪以及前景提取函数与类;
- objdetect模块, 包含物体检测函数,如脸部与行人检测;
- opencv中还包括,机器学习模块(ml),计算几何(flann),第三方代码(contrib),废弃的代码(legacy),以及gpu加速过的代码(gpu);这些代码均位于
./sources/modules路径下。
在需要用的时候,可以单独用如下方式:
1
2
3 #include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/imgproc/imgproc.hpp>
或者使用一句代码将所有的头文件全部包含进去,#include<opencv2/opencv.hpp>,这种方法比较偷懒。
OpenCV示例代码
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 #include<opencv2/highgui/highgui.hpp>
int main()
{
cv::Mat img = cv::imread("../../resource/test.jpg");
if (!img.data)
{
return -1;
}
std::string windowName = "show image";
cv::namedWindow(windowName);
cv::imshow(windowName, img);
std::string fileName = "../../resource/test_write.bmp";
cv::imwrite(fileName, img);
cv::waitKey(0);
return 0;
}1.cv::Mat 实现了引用技术以及浅拷贝,当图像之间进行赋值时,图像数据并没有发生复制,两个对象都指向同一块内存块。这也可用于参数传值的图像以及返回值传值的图像。
2.引用计数的作用是当只有当所有引用内存数据的对象都被析构后,才会释放内存块。
3.如果希望创建的图像拥有原始图像的崭新拷贝,那么可以使用copyTo()方法.
1
2
3
4
5 cv::Mat function()
{
cv::Mat img(240, 110, CV_8U, cv::Scalar(100));
return img;
}如果我们从main函数中调用该函数:
1 cv::Mat gray = function();函数返回的
cv::Mat对象在转移到gray时仅发生浅拷贝。函数中的声明局部变量img离开作用域被析构,但是由于它所关联的引用计数表示内部图像正被另一个对象gray所引用,因此内存块并不会被释放。
但是在类中使用时需要谨慎,避免返回类中的图像成员。错误示例如下:
1
2
3
4
5
6
7 class Test
{
cv::Mat img;
public:
Test() : img(240,10,CV_8U, cv::Scalar(100)){}
cv::Mat function() { return img;}
}如果这里调用了function,便得到该图像的浅拷贝,如果之后这份拷贝发送改变,则会导致类中的成员变量也发生改变,为了避免这种错误发生,应当返回成员变量的一份新的拷贝。
尽量少使用C风格的代码,比如IplImage,因为C风格的代码需要手动释放内存,对于我这种没学过C语言的渣渣和opencv来说,有时候用着用着就忘了手动释放内存,cv::Mat不用手动释放。
而且C语言版本后面据说将要被舍弃,还是C++大法好。