您的位置:首页 > 理论基础 > 数据结构算法

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

2013-11-29 13:59 489 查看

一、命名约定

1、文件命名约定:

   

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

   

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

   

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

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

   

 外部函数使用前缀cv。

   

 内部函数使用前缀icv。

   

 数据结构使用Cv前缀。

   

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

 

二、基本数据结构





//--------------------------------------------
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;
}






#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;
}





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、数组复制和添加





 

#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 );


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: