矩阵和图像的操作
(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