【OpenCV】Learning OpenCV3 第三章笔记

【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::Sizecv::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

扫描二维码关注公众号,回复: 5733405 查看本文章

模板结构

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;
}

猜你喜欢

转载自blog.csdn.net/luo3300612/article/details/88123923