OpenCV学习(3)——命名风格和基本数据结构

一、命名约定


1、文件命名约定:

   彩虹 所有的CV库文件名前缀为cv。

   彩虹 混合的C/C++接口文件名为.h,hpp其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件。

   彩虹 满足POSIX标准,所有文件以小写字母组成。

2、数据类型及函数命名约定

   彩虹 外部函数使用前缀cv。

   彩虹 内部函数使用前缀icv。

   彩虹 数据结构使用Cv前缀。

   彩虹 外部或者宏定义使用前缀CV_。

 

二、基本数据结构


image
//--------------------------------------------
    CvPoint point;
    point.x = 40;
    point.y = 50;

//--------------------------------------------
    CvPoint2D32f pointf;
    pointf.x = 40.;
    pointf.y = 64.;

//--------------------------------------------
    CvPoint3D32f point_3d;
    point_3d.x = 23.;
    point_3d.y = 34.;
    point_3d.z = -67.;

//--------------------------------------------
    CvSize size;
    size.height = 400;
    size.width = 700;

//--------------------------------------------
    CvSize2D32f sizef;
    sizef.height = 45.;
    sizef.width = 239.;

//--------------------------------------------
    CvRect rect;
    rect.x = 50;
    rect.y = 50;
    rect.height = 900;
    rect.width = 400;

//--------------------------------------------
    CvScalar scalar;
    scalar = cvScalar(1.3);                //只赋值第一个值,后面的默认为0
    scalar = cvScalar(1.3,1.2,1.1,1.0);
    scalar = cvScalarAll(1.0);
    scalar = cvRealScalar(1.4);

//--------------------------------------------
    CvMat mat1;
    double a[9] ={
            1 , 2 , 4,
            5 , 6 , 7,
            8 , 9 , 10};
    mat1 = cvMat(3,3,CV_64FC1,a);
    cvReleaseData(&mat1);

    CvMat *mat2;
    double b[9] ={
            1 , 2 , 4,
            5 , 6 , 7,
            8 , 9 , 10};
    mat2 = cvCreateMat(3,3,CV_64FC1);
    cvInitMatHeader(mat2,3,3,CV_64FC1,b);
    cvReleaseData(&mat2);

三、数组及数组有关操作


1、IplImage 结构

#include <opencv2\opencv.hpp>  
#include <iostream>
using namespace std;

int main()
{
    IplImage *src1 = cvLoadImage("logo.jpg",-1);
    IplImage *src2;

    cout<<"----------------logo.jpg 图像信息-----------------"<<endl;
    cout<<"图像大小:"<<src1->nSize<<endl;
    cout<<"图像ID:"<<src1->ID<<endl;
    cout<<"图像通道数:"<<src1->nChannels<<endl;
    cout<<"图像位深度:"<<src1->depth<<endl;
    cout<<"图像:"<<src1->depth<<endl;
    cout<<"-------------------------------------------------"<<endl<<endl;

    src2 = cvCreateImage(cvSize(src1->width,src1->height),src1->depth,3);
    cvConvertImage(src1,src2,CV_CVTIMG_FLIP);
    cvNamedWindow("logo",1);
    cvNamedWindow("logo-covert",1);
    cvShowImage("logo",src1);
    cvShowImage("logo-covert",src2);

    cvWaitKey(0);

    cvReleaseImage(&src1);
    cvReleaseImage(&src2);
    return 0;
}

image

#include <opencv2\opencv.hpp>  
#include <iostream>
using namespace std;

int main()
{
    IplImage *src1 = cvLoadImage("logo.jpg",-1);
    IplImage *src2;
    CvRect rect1,rect2;

    cvNamedWindow("logo",1);
    cvMoveWindow("logo",200,200);
    
    rect1.x = 0;
    rect1.y = 0;
    rect1.width = 120;
    rect1.height = 120;
    cvSetImageROI(src1,rect1);

    cout<<"原图像的ROI区域:"<<(src1->roi->xOffset)<<" "<<(src1->roi->yOffset)<<endl;

    cvShowImage("logo",src1);
    src2 = cvCloneImage(src1);
    rect2  = cvGetImageROI(src2);
    cout<<"转换图像的ROI区域:"<<(src1->roi->xOffset)<<" "<<(src1->roi->yOffset)<<endl;

    cvNamedWindow("logo-convert",1);
    cvMoveWindow("logo-convert",400,200);
    cvShowImage("logo-convert",src1);
    cvResetImageROI(src1);

    cvShowImage("logo",src1);
    
    cvWaitKey(0);

    cvReleaseImage(&src1);
    cvReleaseImage(&src2);
    return 0;
}

image

2、CvMat 结构

#include <opencv2\opencv.hpp>  
#include <iostream>
using namespace std;

int main()
{    
    CvMat *mat1,*mat2,*mat3;

    //cvCreateMat()创建矩阵
    mat1 = cvCreateMat(3,3,CV_64FC1);
    mat2 = cvCreateMat(3,3,CV_64FC1);
    mat3 = cvCreateMat(3,3,CV_64FC1);

    double a[9] ={1,2,3,4,5,6,7,8,9};
    
    //初始化矩阵
    cvInitMatHeader(mat1,3,3,CV_64FC1,a);

    //克隆举证
    mat2 = cvCloneMat(mat1);

    //矩阵相乘
    cvMatMulAdd(mat1 , mat2 , 0 , mat3);

    for(int i =0;i < 3;i++)
    {
        for(int j = 0;j < 3;j++)
        {
            //输出矩阵元素
            cout<<CV_MAT_ELEM(*mat3,double,i,j)<<" ";
        }
        cout<<endl;
    }
    
    //释放矩阵
    cvReleaseMat(&mat1);
    cvReleaseMat(&mat2);
    cvReleaseMat(&mat3);

    return 0;
}

3、数组复制和添加

image

 

#include <opencv2\opencv.hpp>  
#include <iostream>
using namespace std;

int main()
{    
    CvScalar value = cvRealScalar(1);
    CvMat *mat1,*mat2,*mat3,*mat4;

    //cvCreateMat()创建矩阵
    mat1 = cvCreateMat(3,3,CV_32FC1);
    mat2 = cvCreateMat(3,3,CV_32FC1);
    mat3 = cvCreateMat(3,3,CV_32FC1);
    mat4 = cvCreateMat(3,3,CV_32FC1);

    //设定数组元素为指定值
    cvSet(mat1,value,NULL);
    //清空数组
    cvSetZero(mat2);
    //初始化带尺度的单位矩阵
    cvSetIdentity(mat3,value);
    //用指定的范围填充矩阵
    cvRange(mat4,3.,12.);

    for(int i =0;i < 3;i++)
    {
        for(int j = 0;j < 3;j++)
        {
            //输出矩阵元素
            cout<<CV_MAT_ELEM(*mat4,float,i,j)<<" ";
        }
        cout<<endl;
    }
    
    //释放矩阵
    cvReleaseMat(&mat1);
    cvReleaseMat(&mat2);
    cvReleaseMat(&mat3);
    cvReleaseMat(&mat4);

    return 0;
}

4、数组变换

CvMat* cvReshape(const CvArr* arr,CvMat* header,int new_cn,int new_rows =0) 改变矩阵/图像的大小,但不复制其数据。
void cvRepeat(const CvArr* src,const CvArr* dst) 用原始数组填充新数组,新数组大小大于等于原数组。
void cvFlip(const CvArr* src,const CvArr* dst=NULL,int flip_mode=0) 翻转数组。flip_mode等于0,垂直翻转;小于0,水平翻转;大于0,垂直水平翻转。
void cvSplit(const CvArr* src,const CvArr* dst0,CvArr* dst1 ,CvArr* dst2 ,CvArr* dst3 ) 分割多道数组,或者提取多道数组数据到单道数组。
void cvMerge(const CvArr* src0 , const CvArr *src1 , CvArr *src2 CvArr* src3 CvArr* dst) 合并数组。
void cvRandShuffle(CvArr* mat , CvRNG* rmg , double iter_factor = 1) 随机交换数组元素。

关于数组的元素的其他操作还有很多,例如数组元素的获取、数组的运算和数组统计变换等。函数比较多,但每个函数作用单一,容易理解。具体函数可以参考OpenCV官方文档。

 

四、OpenCV 数学函数


1、取整函数

//就近取整
int cvRound(double value);

//向下取整
int cvFloor(double value);

//向上取整
int cvCeil(double value);

2、开方函数

//计算平方根
float cvSqrt(float value);

//计算平方根的倒数
float cvInvSqrt(float value);

//计算立方根
float cvCbrt(float value);

3、向量计算函数

//计算二维向量的角度
float cvFastArctan(float value);

//计算二维向量的长度或角度
float cvCartToPolar(const CvArr* x , const CvArr* y , 
    CvArr* magntitude , CvArr* angle = NULL,int angle_in_degrees = 0);
    
//极坐标转直角坐标
float cvPolarToCart(CvArr* magntitude , const CvArr* angle ,
    CvArr* x , CvArr* y , int angle_in_degrees = 0);

4、数字判断函数

//判断是否为数字
int cvIsNaN(double vuale);

//判断是否为无穷大
int cvIsInf(double vuale);

5、数组取幂函数

//数组元素取幂
void cvPow(const CvArr* src , CvArr* dst , double power);

//计算数组元素的整数幂
void cvPow(const CvArr* src , CvArr* dst );

 

阅读更多
想对作者说点什么?
相关热词

博主推荐

换一批

没有更多推荐了,返回首页