aihot  2017-05-13 18:05:33  OpenCV |   查看评论   
 行/列中最小值

取得设置数组信息 得到指定行列
CvMat* cvGetCol(constCvArr* arr,CvMat* submat,int col);
CvMat* cvGetCols(const CvArr* arr,CvMat* submat,int start_col,intend_col);//取目标矩阵的某列/连续几列,submat和返回值的实际数据还是在原矩阵中,只是修改了头部和数据指针,没有数据拷贝
CvMat* cvGetRow(const CvArr* arr,CvMat* submat,int row);
CvMat* cvGetRows(const CvArr* arr,CvMat* submat,int start_row,intend_row);
得到对角线
CvMat* cvGetDiag(const CvArr*arr,CvMat* submat,intdiag=0);//取矩阵arr的对角线,结果放在向量中,并不要求原矩阵是方阵,diag表示从哪个位置开始取对角线
维度大小
int cvGetDims(const CvArr* arr,int*sizes=NULL);//获取数组的维数和每一维的大小,sizes十一个数组的头指针。图像或者矩阵的维数一定是2,先行数后列数
int cvGetDimSize(const CvArr* arr,int index);//获取某一维的大小
矩阵大小
CvSize cvGetSize(const CvArr*arr);//返回矩阵和图像的大小。小的结构体一般都是直接返回值而不是重新分配指针,分配指针的效率可能比直接返回值效率更低
截取矩形矩阵
CvMat* cvGetSubRect(const CvArr* arr,CvMat* submat, CvRectrect);//从输入的数组中根据输入的矩形截取一块数组中的矩形,返回的CvMat*就是submat
得到和设置元素       因为效率原因,实际很少会直接用到这些方法,而是根据实际的应用来决定如何操作每一个数
uchar* cvPtr1D(CvArr* arr,int idx0,int*type);//得到的是指针,所以可以修改,比下面的效率更高
uchar* cvPtr2D(CvArr* arr,int idx0,int idx1,int* type);
uchar* cvPtr3D(CvArr* arr,int idx0,int idx1,int idx2,int*type);
uchar* cvPtrND(CvArr* arr,int* idx,int* type,intcreate_node=1,unsigned* precalc_hashval=NULL);//int*idx是一个数组指针,里面保存着索引
double cvGetReal1D(const CvArr* arr,int idx0);//得到的是具体值
double cvGetReal2D(const CvArr* arr,int idx0,int idx1);
double cvGetReal3D(const CvArr* arr,int idx0,int idx1,intidx2);
double cvGetRealND(const CvArr* arr,int* idx);
CvScalar cvGet1D(const CvArr* arr,int idx0);
CvScalar cvGet2D(const CvArr* arr,int idx0,int idx1);
CvScalar cvGet3D(const CvArr* arr,int idx0,int idx1,intidx2);
CvScalar cvGetND(const CvArr* arr,int* idx);
double cvmGet(const CvMat* mat, int row, intcol);//仅仅用于矩阵单通道浮点数的获取,由于是inline并且没有类型判断,所以效率比较高
void cvSetReal1D(CvArr* arr, int idx0, double value);
void cvSetReal2D(CvArr* arr, int idx0, int idx1, doublevalue);
void cvSetReal3D(CvArr* arr, int idx0, int idx1, int idx2, doublevalue);
void cvSetRealND(CvArr* arr, int* idx, double value);
void cvSet1D(CvArr* arr, int idx0, CvScalar value);
void cvSet2D(CvArr* arr, int idx0, int idx1, CvScalar value);
void cvSet3D(CvArr* arr, int idx0, int idx1, int idx2, CvScalarvalue);
void cvSetND(CvArr* arr, int* idx, CvScalar value);
void cvmSet(CvMat* mat, int row, int col, doublevalue);//仅仅用于设置单通道浮点类型的矩阵
void cvClearND(CvArr* arr, int* idx);//把多维数组的某位置设置为0
void cvSet(CvArr* arr, CvScalar value, const CvArr*mask=NULL);//把数组每个元素都设为value
void cvSetZero(CvArr* arr);//对普通矩阵,每位都设为0;对稀疏矩阵,删除所以元素

一般算数运算 int cvRound(double value ); int cvFloor(double value ); int cvCeil( doublevalue);//求和double最(上/下)接近的整数
float cvSqrt(float value);//求平方根
float cvInvSqrt(float value);//求平方根倒数
float cvCbrt(float value);//求立方根
float cvCbrt(float value);//求两个向量的夹角
int cvIsNaN(double value);//判断是否是合法数
int cvIsInf(double value);//判断是否无穷
void cvCartToPolar(const CvArr* x, const CvArr* y, CvArr*magnitude, CvArr* angle=NULL, int angle_in_degrees=0);//
void cvPolarToCart(const CvArr* magnitude, const CvArr* angle,CvArr* x, CvArr* y, int angle_in_degrees=0);//
void cvSolveCubic(const CvArr* coeffs, CvArr*roots);//求三次方方程解,coeffs作为三次方程的系数,可以是三元(三次方系数为1)或者四元

随机数生成 CvRNG cvRNG(int64seed=-1);//生成随机数生成器
unsigned cvRandInt(CvRNG* rng);
double cvRandReal(CvRNG* rng);
void cvRandArr(CvRNG* rng, CvArr* arr, int dist_type, CvScalarparam1, CvScalar param2);//
   dist_type决定生成随机数组中的分布   CV_RAND_UNI均匀分布   CV_RAND_NORMAL正态/高斯分布
   param1:均匀分布中的下界(包含),正态分布中的平均值
   param2:均匀分布中的上界(不包含),正态分布中的偏差

分布转换
void cvDFT(const CvArr* src, CvArr*dst, int flags, int nonzero_rows=0);
int cvGetOptimalDFTSize(int size0);
void cvMulSpectrums(const CvArr* src1, const CvArr* src2, CvArr*dst, int flags);
void cvDCT(const CvArr* src, CvArr* dst, int flags);

 

 

OpenCV中有三种方式访问矩阵中的数据元素:容易的方式,困难的方式,以及正确的方式。以下先讲容易的方式和困难的方式。
容易的方式
最容易的方式是使用宏CV_MAT_ELEM( matrix, elemtype, row, col ),输入参数是矩阵的指针,矩阵元素类型,行,列,返回值是相应行,列的矩阵元素,例如:

 

除特别注明外,本站所有文章均为 赢咖4注册 原创,转载请注明出处来自openCV矩阵操作

留言与评论(共有 0 条评论)
   
验证码:
[lianlun]1[/lianlun]