所有的CV库文件名前缀为cv。
混合的C/C++接口文件名为.h,hpp其实质就是将.cpp的实现代码混入.h头文件当中,定义与实现都包含在同一文件。
满足POSIX标准,所有文件以小写字母组成。
外部函数使用前缀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);
#include#include using namespace std; int main() { IplImage *src1 = cvLoadImage("logo.jpg",-1); IplImage *src2; cout<<"----------------logo.jpg 图像信息-----------------"<<endl; cout<<"图像大小:"< nSize<<endl; cout<<"图像ID:"< ID<<endl; cout<<"图像通道数:"< nChannels<<endl; cout<<"图像位深度:"< depth<<endl; cout<<"图像:"< depth<<endl; cout<<"-------------------------------------------------"< 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#include 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; }
#include#include 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< double,i,j)<<" "; } cout<<endl; } //释放矩阵 cvReleaseMat(&mat1); cvReleaseMat(&mat2); cvReleaseMat(&mat3); return 0; }
#include#include 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< float,i,j)<<" "; } cout<<endl; } //释放矩阵 cvReleaseMat(&mat1); cvReleaseMat(&mat2); cvReleaseMat(&mat3); cvReleaseMat(&mat4); return 0; }
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官方文档。
//就近取整 int cvRound(double value); //向下取整 int cvFloor(double value); //向上取整 int cvCeil(double value);
//计算平方根 float cvSqrt(float value); //计算平方根的倒数 float cvInvSqrt(float value); //计算立方根 float cvCbrt(float value);
//计算二维向量的角度 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);
//判断是否为数字 int cvIsNaN(double vuale); //判断是否为无穷大 int cvIsInf(double vuale);
//数组元素取幂 void cvPow(const CvArr* src , CvArr* dst , double power); //计算数组元素的整数幂 void cvPow(const CvArr* src , CvArr* dst );