opencv学习笔记(三)基本数据类型

类:DataType

  将C++数据类型转换为对应的opencv数据类型

  OpenCV原始数据类型的特征模版。OpenCV的原始数据类型包括unsigned char、bool、signed char、unsigned short、signed short、int、float、double以及由这些基础类型组成的元组,这些元组中的所有值都属于相同的类型。这个原始数据类型列表中的所有类型都可以使用一个标示符进行表示CV_<bit-depth>{U|S|F}C(<number_of_channels>),例如,uchar ~ CV_8UC1,3元素的浮点元组~ CV_32FC3,等等。一个一般的OpenCV结构体能够被存储到一个单独的实例中,例如一个原始数据类型Vec。多个实例可以被存储在std::vector、Mat、Mat_、SparseMat、OparseMat_或其他可以保存Vec实例的容器中。
    DataType类主要用来为原始数据类型提供描述,同时它不会给对应的类加入字段和方法(实际上不可能修改C/C++的原始数据类型)。这个技术依赖于C++的类特性。DataType本身并不会被使用,但是他的特殊版本会被使用,例如:

 template<> class DataType<uchar>
 {
     typedef uchar value_type;
     typedef int work_type;
     typedef uchar channel_type;
     , fmt=’u’, type = CV_8U };
 };
 ...
 template<typename _Tp> DataType<std::complex<_Tp> >
 {
     typedef std::complex<_Tp> value_type;
     typedef std::complex<_Tp> work_type;
     typedef _Tp channel_type;
     // DataDepth is another helper trait class
     ,
     fmt=(channels-)*+DataDepth<_Tp>::fmt,
     type=CV_MAKETYPE(depth, channels) };
 };
 ...

  这个类的主要的目的是为为OpenCV的兼容数据类型标示符转换编译类型信息,例如:

 // 申请一个 30x40 浮点矩阵
     Mat A(, , DataType<float>::type);
     Mat B = Mat_<std::complex<, );
     // 下边将会打印出6,2,意思是depth == CV_64F,channels == 2
     cout << B.depth() << ", " << B.channels() << endl;

  所以这个特性用来告诉OpenCV你当前在使用什么数据类型,即使这个类型并非源自于OpenCV。例如,矩阵B将会被编译,因为OpenCV定义了专门的模版类DataType<complex<_Tp> >。这个机制也用于泛型机制。

Point_
类:Point_

  2D点的模板类,用来描述它的x和y坐标。这个类的实例可以与C结构体CvPoint和CvPoint2D32f之间进行互相转换。其中有类型转换运算符将点的坐标转换成指定的类型。将浮点型坐标转换成整形坐标要通过舍入来完成。通常,转换工作会对每一个坐标执行这个操作。除了上边提到的类成员,以下列出的其它对点的使用操作:

 pt1 = pt2 + pt3;
 pt1 = pt2 - pt3;
 pt1 = pt2 * a;
 pt1 = a * pt2;
 pt1 += pt2;
 pt1 -= pt2;
 pt1 *= a;
 double value = norm(pt); // L2 norm
 pt1 == pt2;
 pt1 != pt2;

  为了使用方便,还定义了下边的类别名:

 typedef Point_<int> Point2i;
 typedef Point2i Point;
 typedef Point_<float> Point2f;
 typedef Point_<double> Point2d;

  例如:

 Point2f a(.f), b(.f, 0.4f);
 Point pt = (a + b)*.f;
 cout << pt.x << ", " << pt.y << endl;

Point3_
类:Point3_

   3D点的模板类,用来描述它的x、y和z坐标。这个类的实例可以与C结构体CvPoint2D32f之间进行互相转换。与Point_相似,3D坐标可以被转换成其他类型。同时这个类也支持vector和比较操作。
    Point3_<>有以下可用的别名:

 typedef Point3_<int> Point3i;
 typedef Point3_<float> Point3f;
 typedef Point3_<double> Point3d;

Size_
类:Size_

  用于指定图像和矩形尺寸的类模板。这个类包含两个成员变量width和height。这个结构体可以与老版OpenCV中的CvSize和CvSizeD32f之间进行转换。能够应用于Point_类的算法和比较操作对Size_也是有效的。
    OpenCV定义了以下Size_<>的别名:

 typedef Size_<int> Size2i;
 typedef Size2i Size;
 typedef Size_<float> Size2f;

Rect_
类:Rect_

  2D矩形的模板类,用以下参数进行描述:

  • 左上角的坐标。这是一个OpenCV中的内定的值Rect_::x和Rect_::y。(左上角为(0,0))但是在你的算法中可能会从左下角计算x和y。
  • 矩形的宽和高。

  OpenCV假设矩形的上边沿和左边沿是包含的,而右边沿和下边沿是不包含的。例如,如果符合以下情况,则方法Rect_::contains将返回true:

  x <pt:x < x + width; y<pt:y < y + height

  实际上在OpenCV中循环浏览一个图像的ROI(ROI被通过Rect_<int>指定)是这样实现的:

 for(int y = roi.y; y < roi.y + rect.height; y++)
 for(int x = roi.x; x < roi.x + rect.width; x++)
 {
 // ...
 }

  除了成员变量,以下对于矩形的操作也得到了实现:

  • rect = rect +/- point (通过某一偏移值移动矩形)
  • rect = rect +/-size (通过某一数量扩大或缩小矩形)
  • rect += point, rect -= point, rect += size, rect -= size (扩张操作)
  • rect = rect1 & rect2 (矩形相交)
  • rect = rect1 | rect2 (包含rect2和rect3的最小区域 )
  • rect &= rect1, rect |= rect1 (and the corresponding augmenting operations)
  • rect == rect1, rect != rect1 (矩形比较)

  为了便利,Rect_<>有以下别名:

 typedef Rect_<int> Rect;

opencv学习笔记(三)基本数据类型的更多相关文章

  1. [OpenCV学习笔记2][Mat数据类型和操作]

    [Mat数据类型和基本操作] ®.运行环境:Linux(RedHat+OpenCV3.0) 1.Mat的作用: Mat类用于表示一个多维的单通道或者多通道的稠密数组.能够用来保存实数或复数的向量.矩阵 ...

  2. opencv学习笔记(一)IplImage, CvMat, Mat 的关系

    opencv学习笔记(一)IplImage, CvMat, Mat 的关系 opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像,但是,M ...

  3. Oracle学习笔记三 SQL命令

    SQL简介 SQL 支持下列类别的命令: 1.数据定义语言(DDL) 2.数据操纵语言(DML) 3.事务控制语言(TCL) 4.数据控制语言(DCL)  

  4. opencv学习笔记(六)直方图比较图片相似度

    opencv学习笔记(六)直方图比较图片相似度 opencv提供了API来比较图片的相似程度,使我们很简单的就能对2个图片进行比较,这就是直方图的比较,直方图英文是histogram, 原理就是就是将 ...

  5. opencv学习笔记(四)投影

    opencv学习笔记(四)投影 任选了一张图片用于测试,图片如下所示: #include <cv.h> #include <highgui.h> using namespace ...

  6. (转) OpenCV学习笔记大集锦 与 图像视觉博客资源2之MIT斯坦福CMU

          首页 视界智尚 算法技术 每日技术 来打我呀 注册     OpenCV学习笔记大集锦 整理了我所了解的有关OpenCV的学习笔记.原理分析.使用例程等相关的博文.排序不分先后,随机整理的 ...

  7. java之jvm学习笔记三(Class文件检验器)

    java之jvm学习笔记三(Class文件检验器) 前面的学习我们知道了class文件被类装载器所装载,但是在装载class文件之前或之后,class文件实际上还需要被校验,这就是今天的学习主题,cl ...

  8. OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波

    http://blog.csdn.net/chenyusiyuan/article/details/8710462 OpenCV学习笔记(27)KAZE 算法原理与源码分析(一)非线性扩散滤波 201 ...

  9. Scala入门学习笔记三--数组使用

    前言 本篇主要讲Scala的Array.BufferArray.List,更多教程请参考:Scala教程 本篇知识点概括 若长度固定则使用Array,若长度可能有 变化则使用ArrayBuffer 提 ...

随机推荐

  1. jQuery学习之路(1)-选择器

    ▓▓▓▓▓▓ 大致介绍 终于开始了我的jQuery学习之路!感觉不能再拖了,要边学习原生JavaScript边学习jQuery jQuery是什么? jQuery是一个快速.简洁的JavaScript ...

  2. Docker - command in docker container

    1.查看Container 里面运行的进程 在运行容器以后,可以查看里面的进程: docker top <container_id> or <container_name> 2 ...

  3. NXP NFC移植及学习笔记(原创)

    NFC功能介绍 NFC 目前使用的三种功能: 1. P2P模式:基于LLCP协议的基础上,以NDEF数据交换格式来通信. 2. 读写模式:当作为读卡器,对NFC Tag的读写. 3. 卡模拟模式:模块 ...

  4. Linux进程间通信(四):命名管道 mkfifo()、open()、read()、close()

    在前一篇文章—— Linux进程间通信 -- 使用匿名管道 中,我们看到了如何使用匿名管道来在进程之间传递数据,同时也看到了这个方式的一个缺陷,就是这些进程都由一个共同的祖先进程启动,这给我们在不相关 ...

  5. Python学习笔记只列表和元组

    一.成员资格 1.检查某个字符是否在某个字符串中:'a' in 'absent' 2.获取数组的长度.最大.最小值: numbers=[100,54,345] len(numbers) //长度 ma ...

  6. iOS多线程编程之NSThread的使用(转)

    本文由http://blog.csdn.net/totogo2010/原创 1.简介: 1.1 iOS有三种多线程编程的技术,分别是: 1..NSThread 2.Cocoa NSOperation  ...

  7. finder怎么才能找到library

    右键Finder——前往目录 输入~/Library

  8. android 获取字符串的方法

    字符串数组可以在value文件夹中声明: 书写的内容是: 两者的读取方式略有不同: 如果是读取数字的话,  使用: context.getResources().getStringArray( R.a ...

  9. 别人网站生成的json

    HttpWebRequest req = (HttpWebRequest)WebRequest.Create(sb.ToString()); WebResponse rep = req.GetResp ...

  10. Eclipse中tomcat之后,tomcat的相关配置会被Eclipse重置

    之前用MyEclipse,在tomcat的conf中修改了配置文件,启动就OK了. 现在改用Eclipse,发现改了,之后发现没有用,Eclipse重启tomcat之后,配置文件就被重置了. 众里寻他 ...