首页 > 代码库 > 《学习opencv》笔记——矩阵和图像操作——cvGertDims,cvGetDimSize,cvGetRow,cvGetRow,cvGetSize and cvGetSubRect

《学习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