《学习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()
{
	double a[5][5] =
	{
		{1,0,0,0,6},
		{0,2,0,7,0},
		{0,0,3,0,0},
		{0,9,0,4,0},
		{8,0,0,0,5}
	};

	CvMat va=cvMat(5,5, CV_64FC1,a);

	cout<<"目标矩阵:"<<endl;

	for(int i=0;i<5;i++)
	{
		for(int j=0;j<5;j++)
			printf("%f\t",cvmGet(&va,i,j));
		cout << endl;
	}

	int sizes[100] = {0};

	int v = cvGetDims(&va,sizes);
	cout << "矩阵的维数:";
    cout << v << endl;
	cout << "每个维度上的大小:"<<endl;
	for(int i = 0 ; i<100&&sizes[i]!=0;i++)
	cout << sizes[i] << endl;
	getchar();
	return 0;
}

输出结果

(2)cvGetDimSize函数

其结构

int cvGetDimSize(//返回有index指定的维度的大小
	const CvArr* arr,//目标矩阵
	int index//维度索引
);

实例代码

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

int main()
{
	double a[5][4] =
	{
		{1,0,0,0},
		{0,2,0,7},
		{0,0,3,0},
		{0,9,0,4},
		{8,0,0,0}
	};

	CvMat va=cvMat(5,4, CV_64FC1,a);

	cout<<"目标矩阵:"<<endl;

	for(int i=0;i<5;i++)
	{
		for(int j=0;j<4;j++)
			printf("%f\t",cvmGet(&va,i,j));
		cout << endl;
	}

	int v = cvGetDimSize(&va,1);
	cout << "矩阵的指定维数上的大小为:";
    cout << v << endl;
	getchar();
	return 0;
}

输出结果

(3)cvGetRow函数

其结构

CvMat* cvGetRow(//取出矩阵中的一行
	const CvArr* arr,//目标矩阵
	CvMat* submat,//矩阵指针
	int row//所要取的行的索引数
);

实例代码

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

int main()
{
	double a[5][5] =
	{
		{1,0,0,0,0},
		{0,2,0,0,0},
		{0,0,3,0,0},
		{0,0,0,4,0},
		{0,0,0,0,5}
	};

	CvMat va=cvMat(5,5, CV_64FC1,a);

	cout<<"目标矩阵:"<<endl;

	for(int i=0;i<5;i++)
	{
		for(int j=0;j<5;j++)
			printf("%f\t",cvmGet(&va,i,j));
		cout << endl;
	}

	CvMat vb =cvMat(5,5, CV_64FC1);

	CvMat vc =cvMat(5,5, CV_64FC1); 

	vc = *(cvGetRow(&va,&vb,3));

	cout << "所要取的行为:"<< endl;
	for(int i=0;i<vc.rows;i++)
	{
		for(int j=0;j<vc.cols;j++)
			printf("%f\t",cvmGet(&vc,i,j));
		cout << endl;
	}
	getchar();
	return 0;
}

输出结果

(4)cvGetRows函数

其结构

CvMat* cvGetRows(//取出矩阵中的一些行
	const CvArr* arr,//目标矩阵
	CvMat* submat,//矩阵指针
	int start_row,//开始行,包含
	int end_row//结束行,不包含
);

实例代码

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

int main()
{
	double a[5][5] =
	{
		{1,0,0,0,0},
		{0,2,0,0,0},
		{0,0,3,0,0},
		{0,0,0,4,0},
		{0,0,0,0,5}
	};

	CvMat va=cvMat(5,5, CV_64FC1,a);

	cout<<"目标矩阵:"<<endl;

	for(int i=0;i<5;i++)
	{
		for(int j=0;j<5;j++)
			printf("%f\t",cvmGet(&va,i,j));
		cout << endl;
	}

	CvMat vb =cvMat(5,5, CV_64FC1);

	CvMat vc =cvMat(5,5, CV_64FC1); 

	vc = *(cvGetRows(&va,&vb,0,3));

	cout << "所要取的行为:"<< endl;
	for(int i=0;i<vc.rows;i++)
	{
		for(int j=0;j<vc.cols;j++)
			printf("%f\t",cvmGet(&vc,i,j));
		cout << endl;
	}
	getchar();
	return 0;
}

输出结果

(5)cvGetSize函数

其结构

CvSize cvGetSize(//获得图像尺寸
	const CvArr* arr
);

实例代码

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

int main()
{
	IplImage *src1;
	src1=cvLoadImage("5.jpg");
	CvSize cs = cvGetSize(src1);
	cout << "图像的尺寸为:(单位:像素)"<<endl;
	cout <<"高:"<< cs.height << endl;
	cout <<"宽:"<<cs.width << endl;
	getchar();
	return 0;
}

输出结果

(6)cvGetSubRect函数

其结构

CvSize cvGetSubRect(//返回选择区域的尺寸
	const CvArr* arr,//目标矩阵
	CvArr* submat,//矩阵指针
	CvRect rect//选择区域
);

ps:1.《学习openCV》中该函数返回值为CvSize,不过我所用的2.49中返回值是CvMat,请注意。

        2. 切勿在使用submat前初始化变量,不然会造成内存溢出。

实例代码

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

int main()
{
	IplImage *res;
	int subX = 0;
	int subY = 0;

	CvMat matSrc;

	res = cvLoadImage("1.jpg", CV_LOAD_IMAGE_COLOR);

	subX = res->width / 2;
	subY = res->height / 2;

	CvMat *pMat = cvGetSubRect(res, &matSrc, cvRect(0, 0, res->width - subX, res->height - subY));

	IplImage *pSubImg = cvCreateImageHeader(cvSize(440, 660), 8, 1);
	cvGetImage(pMat, pSubImg); 

	cvShowImage("所截图像",pSubImg);
	cvShowImage("原图像", res);
	cvWaitKey(0);
	return 0;
}

输出结果

to be continued

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

时间: 2024-11-05 15:49:52

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

《学习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》笔记——矩阵和图像操作——cvSetIdentity,cvSolve,cvSplit,cvSub,cvSubS and cvSubRS

mnesia在频繁操作数据的过程可能会报错:** WARNING ** Mnesia is overloaded: {dump_log, write_threshold},可以看出,mnesia应该是过载了.这个警告在mnesia dump操作会发生这个问题,表类型为disc_only_copies .disc_copies都可能会发生. 如何重现这个问题,例子的场景是多个进程同时在不断地mnesia:dirty_write/2 mnesia过载分析 1.抛出警告是在mnesia 增加dump

《学习opencv》笔记——矩阵和图像操作——cvAdd、cvAddS and cvAddWeighted

矩阵和图像的操作 (1)cvAdd函数 其结构 void cvAdd(//图像加和 const CvArr* src1,//第一个原矩阵 const CvArr* src2,//第二个原矩阵 CvArr* dst, //存放矩阵 const CvArr* mask = NULL: //控制点 ); 就是单纯的将两个图像加和,mask变量控制加和的元素点,相当于"开关的作用"; 程序实例 #include <cv.h> #include <highgui.h> #

《学习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》笔记——矩阵和图像操作——cvAnd、cvAndS、cvAvg and cvAvgSdv

矩阵和图像的操作 (1)cvAnd函数 其结构 void cvAnd( //将src1和src2按像素点取"位与运算" const CvArr* src1,//第一个矩阵 const CvArr* src2,//第二个矩阵 CvArr* dst,//结果矩阵 const CvArr* mask = NULL;//矩阵经行像素点与的"开关" ); 程序实例 #include <cv.h> #include <highgui.h> #includ