OpenCV学习_ios平台(二):OpenCV的基本数据类型
2017-03-16 本文已影响320人
爱抽烟的芭比
1.基本数据类型
结构 成员 意义
1.CvPoint int x, y 图像中的点
2.CvPoint2D32f float x,y 二维空间中的点
3.CvPoint3D32f float x,y,z 三维空间中的点
4.CvSize int width,height 图像的尺寸
5.CvRect int x,y,width,height 图像的部分区域
6.CvScalar double val[4] RGBA值
2.CvMat 结构:矩阵头
typedef struct CvMat {
int type;
int step;
int* refcount;
union {
uchar* ptr;
short* s;
int* i;
float* f1;
double* db;
} data;
union {
int rows;
int height;
};
union {
int cols;
int widths;
};
} CvMat;
CvMat矩阵由宽度(width),高度(height),类型(type),行数据长度(step)和一个指向数据的指针构成。
很多程序是区分矩阵头和数据体的,数据体是各个data成员所指向的内存位置。
3.IplImage结构
typedef struct_IplImage {
int nSize;
int ID;
int nChannels;
int alphaChannel;
int depth;
char colorModel[4];
char channelSeq[4];
int dataOrder;
int origin;
int align;
int width;
int height;
struct _iplROI* roi;
struct _IplImage* maskROI;
void* imageId;
struct _IplTileInfo* tileInfo;
int imageSize;
char* imageData;
int widthStep;
int BorderMode[4];
int BorderConst[4];
char* imageDataOrigin;
} IplImage;
从本质上讲,IplImage是一个CvMat对象,但它还有其他一些成员变量将矩阵解释为图像。这个结构最初被定义为Inter图像处理库(IPL)的一部分。
4.OpenCv图像类型
宏 图像像素类型
IDL_DEPTH_8U 无符号8位整数(8u)
IDL_DEPTH_8S 有符号8位整数(8s)
IDL_DEPTH_16S 有符号16位整数(16s)
IDL_DEPTH_32S 有符号32位整数(32s)
IDL_DEPTH_32F 32位浮点数单精度(32f)
IDL_DEPTH_64F 64位浮点数双精度(64f)
5.矩阵和图像操作:
矩阵和图像的操作函数有很多,具体可以查询官方文档,在此不一一列举。
这里以cvAddWeighted的使用为例:
void cvAddWeight(
const CvArr* src1,
double alpha,
const CvArr* src2,
double beta,
double gamma,
CvArr* dst
);
参数中,src1,src2表示两个源图像。图像可以是任何类型的像素,只要他们属于同一类型即可。他们还可以有一个或三个通道(灰度或彩色),同样也要保持类型一致。结果图像dst,也必须同src1和src2是相同的像素类型。这些图像可能是不同尺寸,但是它们的ROI必须统一尺寸。参数alpha是src1的融合强度,beta是src2的融合强度,alpha融合公式如下:
dstx,y = alpha * src1x,y + beta * src2x,y + r
可以设置alpha 从0到1区间取值,beta = 1 - alpha,r为0,将前面公式转换为标准alpha融合公式:
dstx,y = alpha * src1x,y +(1 - alpha) * src2x,y
Mat src1 = [cvprocess cvMatFromUIImage:[UIImage imageNamed:@"001.png"]];
Mat src2 = [cvprocess cvMatFromUIImage:[UIImage imageNamed:@"0001.png"]];
double alpha = 0.7;
double beta = 1 - alpha;
int x = 100;
int y = 150;
//设置ROI区域
Mat roi=src1(cvRect(x,y,400,300));
Mat roi2=src2(cvRect(0,0,400,300));
addWeighted(roi, alpha, roi2, beta, 0.0, src1);
UIImage *image = [cvprocess UIImageFromCVMat:src1];
UIImageView *imview = [[UIImageView alloc]initWithImage:image];
imview.frame = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
imview.contentMode = UIViewContentModeScaleAspectFit;
[self.view addSubview:imview];
融合之前的图像:
001.png 0001.png融合之后的图像:
0001.png