《学习opencv》笔记——基本数据结构,CvMat,矩阵访问

    老板让让做一个东东,输入端要用到opencv顺便就来学习一下。买了本书《学习opencv》翻来一看,opencv1.0,去官网上一看,opencv2.49,瞬间有种蛋碎的赶脚。看着第二章介绍一个头文件,在opencv2.49下面招了半天都没找到。。。泪奔~~

    不过看到一些论坛上说,这本书里还是讲了一些有用的算法的,所以还是决心仔细读一读,里面的测试程序基本是亲手输入运行成功的,很多例子我自也用不同的方法实现了一下,毕竟入门级新手。望各位老鸟勿喷。还请各位大手多多指点。

        

1.opencv基本数据结构:


结构


成员


意义


CvPoint


int x,y


图像中的点


CvPoint2D32f


float x,y


二维空间中的点


CvPoint3D32f


float x,y,z


三维空间中的点


CvSize


int width,height


图像的尺寸


CvRect


int x,y,width,height


图像的部分区域


CvScalar


double val[4]


RGBA值

2.CvMat矩阵结构:

(1)两点注意:

1.在Opencv中没有向量结构,任何时候需要向量,都只是一个列矩阵。

2.Opencv矩阵的概念与我们在线性代数课上学习过的概念相比,更抽象,特别是矩阵的元素。

(2)CvMat结构:

typedef struct CvMat{
  int type;
  int step;
  int* refcount;
  union{
  uchar* ptr;
  short* s;
  int* i;
  float *f1;
  double* db;
  } data;
     union{
  int rows;
  int height;
  };
     union{
  int cols;
  int width;
  };
}CvMat;

(3)矩阵的创建与释放

CvMat* cvCreateMat( int rows, int cols, int type );  //创建一个矩阵

CvMat* cvCreateMatHeader( int rows, int cols, int type ); //创建一个矩阵结构,不分配空间

CvMat* cvInitMatHeader(CvMat* mat,int rows,int cols,int type,void* data = NULL,int step = CV_AUTOSTEP);//用一个现有矩阵初始化矩阵

CvMat cvMat(int rows,int cols,int type,void* data = NULL);//初始化矩阵结构,不分配空间

CvMat* cvCloneMat( const cvMat* mat );//复制一个mat副本

void cvReleaseMat( CvMat** mat ); //释放矩阵

(4)创建一个矩阵程序:

#include <cv.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	float vals[] = {1,2,3,4};

	CvMat rotmat;

	cvInitMatHeader(
		&rotmat,
		2,
		2,
		CV_32FC1,
		vals
		);
	cout << rotmat.cols <<endl;
	cout << rotmat.step <<endl;
	cout << rotmat.rows <<endl;
	cout << rotmat.type <<endl;
	getchar();
	return 0;
}

3.矩阵数据的存取(简单的方法,麻烦的方法,恰当的方法)

(1)简单的方法:

利用CV_MAT_ELEM()宏存取矩阵

#include "stdafx.h"
#include <cv.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	float vals[] = {1,2,3,4};

	CvMat* rotmat = cvCreateMat( 2, 2, CV_32FC1 );

	cvInitMatHeader(
		rotmat,
		2,
		2,
		CV_32FC1,
		vals
		);
	float ele = CV_MAT_ELEM(*rotmat,float,1,1);
	cout << ele << endl;
	getchar();
	return 0;
}

另外宏CV_MAT_ELEM_PTR()需要三个参数,传入矩阵,待返回元素的行和列。

它和上个宏一样,只不过返回的是指向元素的指针。需要自己固定类型。

(2)麻烦的方法

使用cvPtr*D访问矩阵,其结构为:

  uchar* cvPtr1D(
      const CvArr* arr,         //访问矩阵
      int          idx0,       //元素索引
      int*         type = NULL//元素类型
   );
   uchar* cvPtr2D(
      const CvArr* arr,
      int          idx0,
      int          idx1,
      int*         type = NULL
   );
   uchar* cvPtr3D(
      const CvArr* arr,
      int          idx0,
		int          idx1,
		int          idx2,
		int*         type = NULL
	);
	uchar* cvPtrND(
		const CvArr* arr,
		int*         idx,
		int*         type            = NULL,
		int          create_node     = 1,
		unsigned*    precalc_hashval = NULL
	);

访问实例:

#include <cv.h>
#include <iostream>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
	float vals[] = {1,2,3,4};

	CvMat* rotmat = cvCreateMat( 2, 2, CV_32FC1 );

	cvInitMatHeader(
		rotmat,
		2,
		2,
		CV_32FC1,
		vals
		);
	float *p = (float*) cvPtr2D(rotmat,1,1);
	cout <<*p<<endl;
	getchar();
	return 0;
}

(3)恰当的方法

计算机视觉是一种密集型的任务,所以应该利用最有效的方法做事。

方法:

#include <cv.h>
#include <iostream>
using namespace std;

float sum( CvMat* mat ) {
	float s = 0.0f;
	for( int row=0; row<mat->height; row++ ) {
		float* ptr = mat->data.fl + row * mat->step/4;
		for( int col=0; col<mat->width; col++ ) {
			s += *ptr++;
		}
	}
	return( s );
};

int main(int argc, char** argv)
{
	CvMat *mat = cvCreateMat(2,2,CV_32FC1);
	float elem = 2;
	*((float*)CV_MAT_ELEM_PTR( *mat, 0,0) ) = elem;
	cvmSet(mat,0,1,3);
	cvSetReal2D(mat,1,0,4);
	cvSetReal2D(mat,1,1,5);
	float s = sum(mat);
	printf("%f\n",s);
	getchar();
	return 0;
}

   to be continued

《学习opencv》笔记——基本数据结构,CvMat,矩阵访问

时间: 2024-10-11 04:12:49

《学习opencv》笔记——基本数据结构,CvMat,矩阵访问的相关文章

《学习opencv》笔记——基本数据结构,CvMat,矩阵訪问

    老板让让做一个东东.输入端要用到opencv顺便就来学习一下.买了本书<学习opencv>翻来一看,opencv1.0,去官网上一看.opencv2.49,瞬间有种蛋碎的赶脚.看着第二章介绍一个头文件,在opencv2.49以下招了半天都没找到...泪奔~~     只是看到一些论坛上说.这本书里还是讲了一些实用的算法的,所以还是决心细致读一读,里面的測试程序基本是亲手输入执行成功的,非常多样例我自也用不同的方法实现了一下,毕竟入门级新手.望各位老鸟勿喷.还请各位大手多多指点.    

《学习opencv》笔记——矩阵和图像操作——cvGEMM,cvGetCol,cvGetCols and cvGetDiag

矩阵和图像的操作 (1)cvGEMM函数 其结构 double cvGEMM(//矩阵的广义乘法运算 const CvArr* src1,//乘数矩阵 const CvArr* src2,//乘数矩阵 double alpha,//1号矩阵系数 const CvArr* src3,//加权矩阵 double beta,//2号矩阵系数 CvArr* dst,//结果矩阵 int tABC = 0//变换标记 ); tABC变换标记及其对应的含义 CV_GEMM_A_T 转置 src1 CV_GE

《学习opencv》笔记——矩阵和图像操作——cvDet,cvDit,cvDotProduct,cvEigenVV and cvFlip

矩阵和图像的操作 (1)cvDet函数 其结构 double cvDet(//计算矩阵的行列式 const CvArr* mat ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main() { double va[] = {1,0,0,0,2,0,0,0,3}; CvMat Va=cvMa

《学习opencv》笔记——矩阵和图像操作——cvCrossProduct and cvCvtColor

矩阵和图像的操作 (1)cvCrossProduct函数 其结构 void cvCrossProdust(//计算两个三维向量的叉积 const CvArr* src1, const CvArr* src2, CvArr* dst ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main()

《学习opencv》笔记——矩阵和图像操作——cvCalcCovarMatrix,cvCmp and cvCmpS

矩阵和图像的操作 (1)cvCalcCovarMatrix函数 其结构 void cvCalcCovarMatrix(计算给定点的均值和协方差矩阵 const CvArr** vects,//给定向量 int count,//给定向量的组数 CvArr* cov_mat,//结果矩阵 CvArr* avg,//根据flag得到结果 int flags//标记位 ); 标记位参数值极其意义 标志参数的具体标志值 意义 CV_COVAR_NORMAL 计算均值和协方差 CV_COVAR__SCRAM

《学习opencv》笔记——矩阵和图像操作——cvSum,cvSVD,cvSVBkSb,cvTrace,cvTranspose,cvXor,cvXorS and cvZero

矩阵和图像的操作 (1)cvSum函数 其结构 CvScalar cvSum(//计算arr各通道所有像素总和 CvArr* arr//目标矩阵 ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main() { IplImage *src1,*dst1,*dst2,*dst3,*dst4;

《学习opencv》笔记——矩阵和图像操作——cvOr,cvOrS,cvrReduce,cvRepeat,cvScale,cvSet and cvSetZero

矩阵和图像的操作 (1)cvOr函数 其结构 void cvOr(//两个矩阵对应元素做或运行 const CvArr* src1,//矩阵1 const CvArr* src2,//矩阵2 CvArr* dst,//结果矩阵 const CvArr* mask = NULL//矩阵"开关" ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> int main(int arg

《学习opencv》笔记——矩阵和图像操作——cvMinManLoc,cvMul,cvNot,cvNorm and cvNormalize

矩阵和图像的操作 (1)cvMinManLoc函数 其结构 void cvMinMaxLoc(//取出矩阵中最大最小值 const CvArr* arr,//目标矩阵 double* min_val,//最小值 double* max_val,//最大值 CvPoint* min_loc = NULL,//最小值位置 CvPoint* max_loc = NULL,//最大值位置 const CvArr* mask = NULL//矩阵"开关" ); 实例代码 #include <

《学习opencv》笔记——矩阵和图像操作——cvGertDims,cvGetDimSize,cvGetRow,cvGetRow,cvGetSize and cvGetSubRect

矩阵和图像的操作 (1)cvGetDims函数 其结构 int cvGetDims(//返回矩阵的维度和每维上的大小 const CvArr* arr,//目标矩阵 int * sizes = NULL//每个维上的大小,是个数组 ); 实例代码 #include <cv.h> #include <highgui.h> #include <stdio.h> #include <iostream> using namespace std; int main()