opencv提供了多种基本数据类型,我们这里分析集中常见的类型。opencv的数据类型定义可以在D:\Program Files\opencv340\opencv\build\include\opencv2\core\types_c.h查看。

目录

1、通常作为函数参数使用

【CvArr】指代不确定类型的数组

【CVStatus】错误代码

2、公共宏与内联函数

CV_SWAP(a,b,t)交换a,b的值,t为中间变量。

CV_IMIN(a,b)无跳转求小值

CV_IMAX(a,b)无跳转求大值

CV_IABS(a)无跳转求绝对值

CV_CMP(a,b)比较两数的大小,a>b返回1,a=b返回0,a<b返回-1

CV_SIGN(a)求a的符号,正数1,零0,负数-1

cvInvSqrt(value)对参数开平方并且求倒数

cvSqrt(value)对参数开平方

【CvRNG】初始化随机数生成器

3、图像类型

【IplImage*】图像类型结构体

4、矩阵类型

【CvMat】矩阵类型

5、其它补充类型定义

【CvRect】矩形框

【CvPoint】点坐标

【CvSize & CvBox】矩形框大小与旋转矩形框

【CvScalar】一个可以用来存放4个double数值的数组

详细说明

1、通常作为函数参数使用

【CvArr】

CvArr仅被用来作为函数的的参数,用来指明函数接收的数组类型不止一个,例如IplImage*, CvMat*,甚至是CvSeq*。最终的数组类型是在运行时通过分析数组头的前四个字节来判断。

CvArr的定义如下:

typedef void CvArr;

【CVStatus】

CVStatus表示opencv的错误代码,是一个枚举型变量,代码含义见文档types_c.h的116行。

2、公共宏与内联函数

【CV_SWAP】

#define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t))交换a,b的值,t为中间变量。

【CV_IMIN】

#define  CV_IMIN(a, b)  ((a) ^ (((a)^(b)) & (((a) < (b)) - 1)))无跳转求小值,这里^为异或运算,两位相同结果为0,两位不同结果为1,以上公式可以写成a^((a^b)&((a < b) - 1))。我们分两种情况讨论,

1.当a<b时,(a < b) - 1结果为0,(a^b)&0结果为0,a^0结果为a,即返回结果为a。

2.当a>=b时,(a < b) - 1结果为-1,-1的每一位均为1,所以(a^b)&-1结果为a^b,a^(a^b)结果为b,即返回结果为b。

这样就求得了a,b的小值,并且没有CV_MIN中的跳转。

【CV_IMAX】

#define  CV_IMAX(a, b)  ((a) ^ (((a)^(b)) & (((a) > (b)) - 1)))无跳转求大值,运算方式与CV_IMIN(a, b相似。

【CV_IABS】

无跳转求绝对值,定义如下:

#ifndef __cplusplus
# define CV_IABS(a) (((a) ^ ((a) < 0 ? -1 : 0)) - ((a) < 0 ? -1 : 0))
#else
# define CV_IABS(a) abs(a)
#endif

【CV_CMP】

#define  CV_CMP(a,b)    (((a) > (b)) - ((a) < (b)))比较两数的大小,a>b返回1,a=b返回0,a<b返回-1

【CV_SIGN】

#define  CV_SIGN(a)     CV_CMP((a),0)求a的符号,正数1,零0,负数-1

【cvInvSqrt】

#define cvInvSqrt(value) ((float)(1./sqrt(value)))对参数开平方并且求倒数

【cvSqrt(value)】

#define cvSqrt(value)  ((float)sqrt(value))对参数开平方

【CvRNG】

typedef uint64 CvRNG;初始化随机数生成器并返回其状态,指向这个状态的指针可以传递给cvRandInt、cvRandReal。

定义如下:

 CV_INLINE CvRNG cvRNG( int64 seed CV_DEFAULT(-))
{
CvRNG rng = seed ? (uint64)seed : (uint64)(int64)-;
return rng;
}
CV_INLINE unsigned cvRandInt( CvRNG* rng )
{
uint64 temp = *rng;
temp = (uint64)(unsigned)temp*CV_RNG_COEFF + (temp >> );
*rng = temp;
return (unsigned)temp;
}
CV_INLINE double cvRandReal( CvRNG* rng )
{
return cvRandInt(rng)*2.3283064365386962890625e-10 /* 2^-32 */;
}

3、图像类型

【IplImage*】

IplImage类型是从Intel的 Image Processing Library(IPL)库原版搬过来的。但是opencv只支持其中的部分格式。

IplImage定义如下:

 typedef struct
_IplImage
{
int nSize; /**< IplImage大小 */
int ID; /**< 版本(=0)*/
int nChannels; /**< 大部分opencv函数支持1,2,3 或 4 个通道 */
int alphaChannel; /**< Ignored by OpenCV */
int depth; /**< 像素深度,主要有一下集中格式:
IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S,
IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_DEPTH_64F */
char colorModel[]; /**< Ignored by OpenCV */
char channelSeq[]; /**< 同上 */
int dataOrder; /**< 0 - 交叉颜色通道, 1 - 分开颜色通道.
cvCreateImage只能创建交叉通道 */
int origin; /**< 原点模式0 - 下-左为原点,1 - 下-左为原点. */
int align; /**< 图像行排列方式 (4 or 8),在 OpenCV 被忽略,
使用 widthStep 代替 . */
int width; /**< 图像宽像素数. */
int height; /**< 图像高像素数. */
struct _IplROI *roi; /**< 图像感兴趣区域,当该值非空时,只对该区域进行处理 */
struct _IplImage *maskROI; /**< 在 OpenCV中必须为NULL */
void *imageId; /**< 同上 */
struct _IplTileInfo *tileInfo; /**<同上 */
int imageSize; /**< 图像数据大小,在交叉存取格式下
ImageSize=image->height*image->widthStep,单位字节*/
char *imageData; /**< 指向排列的图像数据 */
int widthStep; /**< 排列的图像行大小,以字节为单位 */
int BorderMode[]; /**< 在 OpenCV 被忽略 */
int BorderConst[]; /**< 同上 */
char *imageDataOrigin; /**< 指针指向一个不同的图像数据结构(不是必须排列的),
是为了纠正图像内存分配准备的 */
}
IplImage;

4、矩阵类型

【CvMat】

矩阵由宽度(width),高度(height),类型(type),行数据长度(step,行的长度用字节表示而不是用整形或者浮点型长度)和一个指向数据的指针构成。此类信息通常被称作矩阵头。很多程序是区分矩阵头和数据体的,后者是各个data成员所指向的内存位置。CvMat的定义如下:
 typedef struct CvMat
{
int type;
int step;
int* refcount;/* for internal use only */
int hdr_refcount;
union
{
uchar* ptr;
short* s;
int* i;
float* fl;
double* db;
} data; #ifdef __cplusplus
union
{
int rows;
int height;
}; union
{
int cols;
int width;
};
#else
int rows;
int cols;
#endif #ifdef __cplusplus
CvMat() {}
CvMat(const CvMat& m) { memcpy(this, &m, sizeof(CvMat));}
CvMat(const cv::Mat& m);
#endif }
CvMat; CV_INLINE CvMat cvMat( int rows, int cols, int type, void* data CV_DEFAULT(NULL))
{
CvMat m;
assert( (unsigned)CV_MAT_DEPTH(type) <= CV_64F );
type = CV_MAT_TYPE(type);
m.type = CV_MAT_MAGIC_VAL | CV_MAT_CONT_FLAG | type;
m.cols = cols;
m.rows = rows;
m.step = m.cols*CV_ELEM_SIZE(type);
m.data.ptr = (uchar*)data;
m.refcount = NULL;
m.hdr_refcount = ;
return m;
}
【CvMatND】
 
多维密集矩阵
 typedef struct
CvMatND
{
int type;
int dims; int* refcount;
int hdr_refcount; union
{
uchar* ptr;
float* fl;
double* db;
int* i;
short* s;
} data; struct
{
int size;
int step;
}
dim[CV_MAX_DIM]; #ifdef __cplusplus
CvMatND() {}
CvMatND(const cv::Mat& m);
#endif
}
CvMatND;

【CvSparseMat】

多维稀疏矩阵

 typedef struct
CvSparseMat
{
int type;
int dims;
int* refcount;
int hdr_refcount; struct CvSet* heap;
void** hashtable;
int hashsize;
int valoffset;
int idxoffset;
int size[CV_MAX_DIM]; #ifdef __cplusplus
void copyToSparseMat(cv::SparseMat& m) const;
#endif
}
CvSparseMat;

5、其它数据类型定义

【CvRect】

CvRect含4个数据成员,x、y、width、height,其功能是通过定义矩形左上角坐标和矩形的宽和高来确定一个矩形。其可与感兴趣区域ROI相互转化,定义如下:

 typedef struct CvRect
{
int x;
int y;
int width;
int height;
}
CvRect;

cvRectToROI矩形框转化为感兴趣区域ROI,定义如下:

 CV_INLINE  IplROI  cvRectToROI( CvRect rect, int coi )
{
IplROI roi;
roi.xOffset = rect.x;
roi.yOffset = rect.y;
roi.width = rect.width;
roi.height = rect.height;
roi.coi = coi; return roi;
}

cvROIToRect感兴趣区域ROI转化为矩形框,定义如下:

 CV_INLINE  CvRect  cvROIToRect( IplROI roi )
{
return cvRect( roi.xOffset, roi.yOffset, roi.width, roi.height );
}

【CvPoint】

CvPoint是一个包含两个int类型变量x,y的简单结构体。CvPoint还有几种简单的变体,分别为:

CvPoint2D32f 包含两个float类型的变量x,y的结构体;

CvPoint3D32f 包含三个float类型的变量x,y,z的结构体;

CvPoint2D64f 包含两个double类型的变量x,y的结构体;

CvPoint3D64f 包含三个double类型的变量x,y,z的结构体。

CvPoint定义如下:

 typedef struct CvPoint
{
int x;
int y;
}
CvPoint;

CvPoint构造函数为:

CV_INLINE  CvPoint  cvPoint(int x, int y);

由CvPoint2D32f转换为CvPoint如下:

 CV_INLINE  CvPoint  cvPointFrom32f(CvPoint2D32f point)
{
CvPoint ipt;
ipt.x = cvRound(point.x);
ipt.y = cvRound(point.y);
return ipt;
}

其它四种变体函数定义由与CvPoint相似,如下:

 typedef struct CvPoint2D32f
{
float x;
float y;
}
CvPoint2D32f;
typedef struct CvPoint3D32f
{
float x;
float y;
float z;
}
CvPoint3D32f;
typedef struct CvPoint2D64f
{
double x;
double y;
}
CvPoint2D64f;
typedef struct CvPoint3D64f
{
double x;
double y;
double z;
}
CvPoint3D64f;

【CvSize】【CvBox2D】

CvSize为矩阵框大小,以像素为精度。与CvPoint类似是由两个int类型的变量width、height构成的结构体。其变体类型为:

CvSize2D32f包含两个float类型的变量width、height的结构体。

CvSize定义如下:

 typedef struct CvSize
{
int width;
int height;
}
CvSize;

CvSize构造函数为:

 CV_INLINE  CvSize  cvSize(int width, int height)
{
CvSize s;
s.width = width;
s.height = height;
return s;
}

其变体CvSize2D32f与CvSize相似,不再放代码。

CvBox2D为旋转矩形框,其代码如下:

 typedef struct CvBox2D
{
CvPoint2D32f center; /**< 矩形框的中心 */
CvSize2D32f size; /**< 矩形框的尺寸 */
float angle; /**< 矩形框与水平轴的角度 */
}
CvBox2D;

【CvScalar】

CvScalar就是一个可以用来存放4个double数值的数组,一般用来存放像素值(不一定是灰度值哦)的,最多可以存放4个通道的。

 typedef struct CvScalar
{
double val[];
}
CvScalar; CV_INLINE CvScalar cvScalar( double val0, double val1 CV_DEFAULT(),
double val2 CV_DEFAULT(), double val3 CV_DEFAULT())
{
CvScalar scalar;
scalar.val[] = val0; scalar.val[] = val1;
scalar.val[] = val2; scalar.val[] = val3;
return scalar;
}

使用cvScalar表示颜色时,

cvScalar(blue_component, green_component, red_component[, alpha_component])

【opencv学习笔记三】opencv3.4.0数据类型解释的更多相关文章

  1. C#学习笔记三: C#2.0泛型 可控类型 匿名方法和迭代器

    前言 C#1.0的委托特性使方法作为其他方法的参数来传递,而C#2.0 中提出的泛型特性则使类型可以被参数化,从而不必再为不同的类型提供特殊版本的实现方法.另外C#2.0还提出了可空类型,匿名方法和迭 ...

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

    opencv学习笔记(三)基本数据类型 类:DataType 将C++数据类型转换为对应的opencv数据类型 OpenCV原始数据类型的特征模版.OpenCV的原始数据类型包括unsigned ch ...

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

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

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

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

  5. OpenCV 学习笔记 07 目标检测与识别

    目标检测与识别是计算机视觉中最常见的挑战之一.属于高级主题. 本章节将扩展目标检测的概念,首先探讨人脸识别技术,然后将该技术应用到显示生活中的各种目标检测. 1 目标检测与识别技术 为了与OpenCV ...

  6. OpenCV学习笔记3

    OpenCV学习笔记3 图像平滑(低通滤波) 使用低通滤波器可以达到图像模糊的目的.这对与去除噪音很有帮助.其实就是去除图像中的高频成分(比如:噪音,边界).所以边界也会被模糊一点.(当然,也有一些模 ...

  7. Oracle学习笔记三 SQL命令

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

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

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

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

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

随机推荐

  1. HTTP POST请求数据提交格式(转)

    FROM: http://bbs.125.la/thread-13743350-1-1.html HTTP/1.1 协议规定的 HTTP 请求方法有 OPTIONS.GET.HEAD.POST.PUT ...

  2. 【BZOJ1222】[HNOI2001]产品加工 DP

    [BZOJ1222][HNOI2001]产品加工 Description 某加工厂有A.B两台机器,来加工的产品可以由其中任何一台机器完成,或者两台机器共同完成.由于受到机器性能和产品特性的限制,不同 ...

  3. mongo数据库中一条记录中某个属性是数组情形时 数据结构的定义

    package entity; import java.util.Date; import com.mongodb.BasicDBList;import com.mongodb.DBObject; p ...

  4. Hadoop实战-Flume之Sink Failover(十六)

    a1.sources = r1 a1.sinks = k1 k2 a1.channels = c1 # Describe/configure the source a1.sources.r1.type ...

  5. BZOJ4944: [Noi2017]泳池

    BZOJ4944: [Noi2017]泳池 题目背景 久莲是个爱玩的女孩子. 暑假终于到了,久莲决定请她的朋友们来游泳,她打算先在她家的私人海滩外圈一块长方形的海域作为游泳场. 然而大海里有着各种各样 ...

  6. NFT是什么,有什么前景?

    去年 11 月,Crypokitties 的发布给加密货币的世界带来了风暴,有些加密猫的价格甚至涨到了 30 万美元,以太坊网络拥堵不堪,平均贡献了当时以太坊网络30%的交易额.当 Cryptokit ...

  7. Java实参和形参与传值和传引用

    实参和形参的定义: 形参出现函数定义中,在整个函数体内都可以使用,离开函数则不能使用. 实参出现在主函数中,进入被调函数后,实参变量也不能使用. 形参和实参的功能是做数据传送.发生函数调用时,主调函数 ...

  8. 【linux】ubuntu16.04安装vncserver实现远程访问图形界面

    # 步骤 1 - 安装 X11VNC  sudo apt install x11vnc -y # 步骤 2 - 配置访问密码 sudo x11vnc -storepasswd /etc/x11vnc. ...

  9. POJ - 1426 Find The Multiple 【DFS】

    题目链接 http://poj.org/problem?id=1426 题意 给出一个数 要求找出 只有 0 和 1 组成的 十进制数字 能够整除 n n 不超过 200 十进制数字位数 不超过100 ...

  10. Python运维编程

    Python运维编程 作者:Danbo  2015-10-11 什么是Python,为什么要使用Python? 这个大家自行谷歌,不过看看知乎你就知道Python有多么强大:http://www.zh ...