前话
我会结合计算机视觉算法与应用,冈萨雷斯图像处理,以及CVPR,ICCV等论文深入原理,不仅会用OpenCV,还要懂原理。
Version1和Version2的主要差别
OpenCV2和OpenCV1的一个主要差别就是1是C的版本,2是C++的版本
简要介绍
OpenCV有很多的模块
- core,定义了许多数据结构和基本的函数
- imgproc,顾名思义就是处理图片的模块,包括线性和非线性滤波器,图形几何变换,颜色空间变换,直方图
- video,包括运动估计,背景消除,物体跟踪
- calib3d,摄像机标定,姿态估计,3D重建
- features2D,用于特征的检测
- objdetect,可方便实现人脸识别,眼睛,人,车也可以,已经训练过了
- highgui,很方便的图像捕获接口
- gpu,跟GPU加速有关
- 等等
一些要了解的常识
OpenCV所有的东西都在cv这个namespace下面
所在,我们在调用的时候可以这样
#include "opencv2/core/core.hpp"
...
cv::Mat H = cv::findHomography(points1, points2, CV_RANSAC, 5);
或者
#include "opencv2/core/core.hpp"
using namespace cv;
...
Mat H = findHomography(points1, points2, CV_RANSAC, 5 );
当你的命名空间有std,cv等等大于1个的时候,就有可能导致冲突,比如log函数,这时候就必须要指定了
Mat a(100, 100, CV_32F);
randu(a, Scalar::all(1), Scalar::all(std::rand()));
cv::log(a, a);
a /= std::log(2.);
自动内存管理
在使用version1的时候,我们都要free(image)
在version2里面,所有的类都有解析函数,不需要你手动去管理了
// 创建了1000*1000,每个像素点是64位浮点数
Mat A(1000, 1000, CV_64F);
// B和A共享像素数据,这个操作是立即的,不需要复制像素点
Mat B = A;
// 跟上面一样,只是共享了row3
Mat C = B.row(3);
// 现在是独立的复制了
Mat D = B.clone();
// 把B的第5行复制给C, 其实就是把A的第5行复制给A的第3行
B.row(5).copyTo(C);
// A共享了D的数据;
A = D;
// C仍然指向修改后的A的数据
B.release();
// 这时候,A原来的数据就消失了
C = C.clone();
当你创建属于自己的数据结构,但是又没有自动内存管理怎么办?
OpenCV有自己的智能指针
OpenCV大多数时候会自动为输出矩阵分配内存
#include "cv.h"
#include "highgui.h"
using namespace cv;
int main(int, char**)
{
VideoCapture cap(0);
if(!cap.isOpened()) return -1;
Mat frame, edges;
namedWindow("edges",1);
for(;;)
{
cap >> frame