【OpenCV】Learning OpenCV3 第三章笔记
OpenCV 中的三个主要的数据类型
- C++基础数据类型,如int,float
- 帮助类,如有关垃圾回收的类等
- 大数组类,如
cv::Mat
除此以外,OpenCV大量依赖STL
Overview
cv::Vec<>
OpenCV使用cv::Vec<>
(在之后被称为fixed vector class)而不使用C++自带的vector类?
因为cv::Vec<>
是为了适用于在编译时维度已知的小的向量而设计的
但事实上而cv::Vec<>也不常用
常用的是cv::Vec{2,3,4,6}{b,w,s,i,f,d},其中
b | w | s | i | f | d |
---|---|---|---|---|---|
unsigned char | unsigned short | short | int | float | double |
数字表示元素的个数
cv::Matx<>
cv::Matx<>
是 fixed matrix classes,与cv::Vec<>
相同,是为了确定维度的小矩阵运算设计的,常用的方法是cv::Matx{1,2,3,4,6}{1,2,3,4,6}{f,d}
,这些维度都需要在编译时确定,从而使得这些矩阵的运算十分高效,并避免了动态内存的消耗
cv::Point
这个类与cv::Vec<>
功能类似,但却不是继承而来,两者可以相互转换,两者的主要区别是,point可以通过坐标名取值mypoint.x,mypoint.y
,常用方法是cv::Point{2,3}{d,i,f}
cv::Scalar
cv::Scalar
是一个四维的点,直接从Vec<double,4>
得到
cv::Size
cv::Size
是cv::Size2i
的别名,如果有浮点数宽高,应该使用cv::Size2f
cv::Rect
cv::Rect
是整数的矩形,另一种表示矩形的方法是cv::RotatedRect
,它包括表示中心的cv::Point2f
,表示矩形大小的cv::Size2f
,以及一个表示角度的浮点数
Detials
懒,不想打,具体请查书
- cv::Point
- cv::Scalar
- cv::size,不能被cast为vector
- cv::Rect,.x .y表示左上角的点坐标
- cv::RotatedRect
- cv::Matx,写作书的时候并没有实现
Matx11,Matx55
- cv:vector,是cv::Matx的继承
- complex number classes
Helper Objects
- cv::TermCriteria,封装了停机准则,用来传参给函数
- cv::Range,得到一系列连续的整数
- cv::Ptr,C++中的smart_pointer
- cv:Exception,异常
- cv::DataType<> template,看不懂暂时略过
- cv::InputArray/cv::OutputArray,OpenCV中有很多array类型(cv::scalar,cv::Vec,cv::Matx),为了避免造成复杂,所以使用这两个类,它们可以支持所有array的传参,它们两者的区别是InputArray被视为const(只读)
工具函数
OpenCV的一些工具函数,详见书上表3-10
模板结构
cv::Point_<Type T>
cv::Rect_<Type T>
cv::Vec<Type T, int H>
cv::Matx<Type T, int H, int W>
cv::Scalar_<Type T>
总结
本章详细介绍了一些OpenCV中的常用基础数据类型,也给出了模板和模板适用的类型。
此外还介绍了一些帮助类(比如停机准则和数值范围),最后给出了工具函数,基本是一些常用的算法和内存分配函数
code
1.使用fixed的数据类型创建变量
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
int main(){
cv::Matx33f mat(1,2,3,4,5,6,7,8,9);
cv::Vec3f vec(1,1,1);
cout << mat <<endl;
cout << vec <<endl;
cout << mat * vec << endl;
return 0;
}
2.使用模板创建变量,并将向量cast为矩阵
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
int main(){
cv::Matx<int,3,3> mat(1,2,3,4,5,6,7,8,9);
cv::Vec<int,3> vec(1,2,3);
cout << mat << endl;
cout << vec << endl;
cout << mat * vec << endl;
cout << (cv::Matx<int,3,1>)vec << endl; // type-casting
return 0;
}