2017.08.23-8.25 OpenCV8.25
前四章
#OpenCV概述
open source computer vision library开源计算机视觉库,由一系列C函数和C++类构成。采用C/C++语言进行开发使用,提供了和MATLAB的接口。
就是一个SDK软件开发工具包(software development Kit),
自动生成的opencv文档:
图像中的物体分析、物体识别。
OpenCV中的所有模块,用到的有:
core:核心功能模块,包含:基本数据结构、动态数据结构、绘图函数、数组操作相关函数等。
imgproc:图像处理模块,滤波、几何变换、图像转换、直方图相关、结构分析和形状描述、运动分析和对象跟踪、特征检测、目标检测等。
features2d:2D功能框架,特征检测和描述、特征检测器通用接口、描述符提取器通用接口、描述符匹配器通用接口、关键点绘制函数和匹配功能绘制函数。
highgui:图像用户界面GUI graphic user interface,包括媒体输入输出、视频捕捉、图形交互界面接口。
ML:机器学习模块,SVM support vector machines
objdetect:目标检测模块,级联分类和latent SVM两部分。
opencv_contrib:脸部识别、文本探测、新的边缘检测器、新的光流和追踪算法等。
OpenCV头文件认知
opencv.hpp已经包含了OpenCV的各模块的头文件。所以编写模块core、imgproc、features2d、highgui、ML等应用程序时,原则上只写一句
include <opencv2/opencv.hpp>
即可,精简代码。但是学习过程中不这样啦,还是包含了相应模块的头文件。
OpenCV数据结构与基本绘图
显示创建Mat对象
采用MATLAB式的初始化方法:
//理解:创建一个mat类的对象,调用该类的成员函数 对角矩阵
Mat E=Mat::Eye(4,4,CV_64F);
cout<<"E="<<endl<<" "<<E<<endl;
//全1矩阵
Mat E=Mat::Ones(2,2,CV_32F);
cout<<"O="<<endl<<" "<<O<<endl;
//全0矩阵
Mat E=Mat::Zeros(3,3,CV_8UC1);
cout<<"Z="<<endl<<" "<<Z<<endl;
基础图像容器mat
Mat类特点:不必手动开辟空间;不必不用时释放空间。像matlab一样很方便。
opencv中函数输出图像的内存分配自动完成;
无需考虑内存释放问题;
赋值运算符 =和构造函数 copy create只复制信息头,不管矩阵像素值的复制,也就是说只管指针即可;
使用clone()或者copyto()复制图像矩阵像素。
组成:矩阵头(大小、存储方法、存储地址等信息)和指针(指向存储像素矩阵的地址)。大图像复制很浪费空间和时间资源,采用引用计数机制,即:不同信息头可共享一个矩阵(采用让矩阵指针指向同一个地址)。
拷贝构造函数只复制信息头和矩阵指针,不复制矩阵。
可以创建只引用部分数据即ROI区域的信息头:
Mat D(A,Rect(10,10,100,100))//使用矩形界定
Mat D=A(Range:all(),Range(1,3));//行和列界定
常用数据结构
opencv里面定义了很多类(包括相应成员和成员函数),可以直接用的。有 point类、Scalar()类、Size类、Rect类、等等。
点 point类 :Point[int]、Point2i 、Point等价
颜色 Scalar()类:
尺寸 Size_[int]、Size2i、Size等价 Size(5,5)
矩形Rect类:
(1)其成员变量有x,y,width,sidth,分别为左上点坐标 和宽高;
(2)其成员函数有:
Size() 返回尺寸
area() 返回面积
contains(Point) 返回“点是否在矩形内部”的判断结果
inside(Rect) 返回“矩形是否在另一矩形内部”的判断结果
tl()— top left 返回左上点坐标
br()–=bottom right 返回右下点坐标
求两个矩形的交集和并集:Rect rect=rect1&rect2 ;Rect rect=rect1|rect 2
矩形的平移和缩放:Rect rectShift=rect+point ;Rect rectScale=rect+size
常用函数
颜色空间转换函数:cvtColor() convert转换
RGB空间、HSI空间、HSV空间、灰度图像的转换。
举例如下:
debug时的错误:源文件未加到项目里去。
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"
using namespace cv;
void main()
{
//定义两个mat类对象;
Mat srcImage=imread("1.jpg",1),dstImage;//正数表示三通道彩色,0灰度图,负包含某通道的加载图像;
cvtColor(srcImage,dstImage,CV_RGB2GRAY);//转换为灰度图
imshow("灰度图",dstImage);
waitKey();//6s后自动关闭
}
其他常用知识点
Range类使得opencv更像MATLAB;
math.h>包含有:
计算向量角度函数fastAtan2、
计算立方根函数cubeRoot、
向上取整函数cvCeil、
向下取整函数cvFloor、
四舍五入函数CVRound、
判断是否无穷大cvIsInf、
判断是否是个数cvIsNaN。
显示文字函数:
getTextSize()
putText()
cvInitFont()
做图相关函数:
circle圆
clipLine
elipes椭圆
elipes2Poly
line直线
rectangle矩形
基本图像绘制
一个完整的绘图函数的例子: