OpenCV基础数据结构

OpenCV基础数据结构图谱

图像数据结构

IPL 图像: IplImage 
        |-- int nChannels; // 色彩通道数(1,2,3,4) 
        |-- int depth; // 象素色深: 
        | // IPL_DEPTH_8U, IPL_DEPTH_8S, 
        | // IPL_DEPTH_16U,IPL_DEPTH_16S, 
        | // IPL_DEPTH_32S,IPL_DEPTH_32F, 
        | // IPL_DEPTH_64F 
        |-- int width; // 图像宽度(象素点数) 
        |-- int height; // 图像高度(象素点数) 
        |-- char* imageData; // 指针指向成一列排列的图像数据 
        | // 注意色彩顺序为BGR 
        |-- int dataOrder; // 0 - 彩色通道交叉存取 BGRBGRBGR, 
        | // 1 - 彩色通道分隔存取 BBBGGGRRR 
        | // 函数cvCreateImage只能创建交叉存取的图像 
        |-- int origin; // 0 - 起点为左上角, 
        | // 1 - 起点为右下角(Windows位图bitmap格式) 
        |-- int widthStep; // 每行图像数据所占字节大小 
        |-- int imageSize; // 图像数据所占字节大小 = 高度*每行图像数据字节大小 
        |-- struct _IplROI *roi;// 图像ROI. 若不为NULL则表示需要处理的图像 
        | // 区域. 
        |-- char *imageDataOrigin; // 指针指向图像数据原点 
        | // (用来校准图像存储单元的重新分配) 
        | 
        |-- int align; // 图像行校准: 4或8字节校准 
        | // OpenCV不采用它而使用widthStep 
        |-- char colorModel[4]; // 图像色彩模型 - 被OpenCV忽略 
矩阵与向量 
矩阵: CvMat // 2维数组 
        |-- int type; // 元素类型(uchar,short,int,float,double) 
        |-- int step; // 一行所占字节长度 
        |-- int rows, cols; // 尺寸大小 
        |-- int height, width; // 备用尺寸参照 
        |-- union data; 
        |-- uchar* ptr; // 针对unsigned char矩阵的数据指针 
        |-- short* s; // 针对short矩阵的数据指针 
        |-- int* i; // 针对integer矩阵的数据指针 
        |-- float* fl; // 针对float矩阵的数据指针 
        |-- double* db; // 针对double矩阵的数据指针 
CvMatND // N-维数组 
        |-- int type; // 元素类型(uchar,short,int,float,double) 
        |-- int dims; // 数组维数 
        |-- union data; 
        | |-- uchar* ptr; // 针对unsigned char矩阵的数据指针 
        | |-- short* s; // 针对short矩阵的数据指针 
        | |-- int* i; // 针对integer矩阵的数据指针 
        | |-- float* fl; // 针对float矩阵的数据指针 
        | |-- double* db; // 针对double矩阵的数据指针 
        | 
        |-- struct dim[]; // 每个维的信息 
        |-- size; // 该维内元素个数 
        |-- step; // 该维内元素之间偏移量 
CvSparseMat // 稀疏N维数组 
通用数组: CvArr* // 仅作为函数参数,说明函数接受多种类型的数组,例如: 
        // IplImage*, CvMat* 或者 CvSeq*. 
        // 只需通过分析数组头部的前4字节便可确定数组类型 
标量: CvScalar 
        |-- double val[4]; //4D向量 
初始化函数: 
CvScalar s = cvScalar(double val0, double val1=0, double val2=0, double val3=0); 
举例: 
CvScalar s = cvScalar(20.0); 
s.val[0]=10.0; 
注意:初始化函数与数据结构同名,只是首字母小写. 它不是C++的构造函数. 
其他数据结构 
点: CvPoint p = cvPoint(int x, int y); 
CvPoint2D32f p = cvPoint2D32f(float x, float y); 
CvPoint3D32f p = cvPoint3D32f(float x, float y, float z); 
例如: 
p.x=5.0; 
p.y=5.0; 
长方形尺寸: CvSize r = cvSize(int width, int height); 
CvSize2D32f r = cvSize2D32f(float width, float height); 
带偏移量的长方形尺寸: CvRect r = cvRect(int x, int y, int width, int height);


//将色彩空间转化到HSI空间,获得其中的H分量:

    IplImage* target=cvLoadImage("target.bmp",-1);    //装载图片

    IplImage* target_hsv=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 3 );

    IplImage* target_hue=cvCreateImage( cvGetSize(target), IPL_DEPTH_8U, 1);

    cvCvtColor(target,target_hsv,CV_BGR2HSV);         //转化到HSV空间

    cvSplit( target_hsv, target_hue, NULL, NULL, NULL );      //获得H分量

---------------------------------

OpenCV 彩色图像RGB或其他通道分割:

m_Source_Pic是一个IplImage*多通道图像.

方法一:

IplImage * RedChannel     = cvCreateImage( cvGetSize(m_Source_Pic), 8, 1);
IplImage * GreenChannel    = cvCreateImage( cvGetSize(m_Source_Pic), 8, 1);
IplImage * BlueChannel = cvCreateImage( cvGetSize(m_Source_Pic), 8, 1);
IplImage * alphaChannel    = cvCreateImage( cvGetSize(m_Source_Pic), 8, 1);

       //提取rgb
    cvCvtPixToPlane(m_Source_Pic,BlueChannel,GreenChannel,RedChannel,NULL);

方法二:

cvSetImageCOI(m_Source_Pic,1); 
    cvCopy(m_Source_Pic,BlueChannel); //提取蓝色
    cvSetImageCOI(m_Source_Pic,2);
    cvCopy(m_Source_Pic,GreenChannel);    //提取绿色
    cvSetImageCOI(m_Source_Pic,3);
    cvCopy(m_Source_Pic,RedChannel); //提取红色

你可能感兴趣的:(VS2010,opencv)