作者:gnuhpc
出處:http://www.cnblogs.com/gnuhpc/
#include "highgui.h" #include "cv.h" #include <iostream> #include <iomanip> using namespace std; void main() { int i=0; int j=0; CvRect mat_rect=cvRect(1,1,3,3);//指定取得數組子集的范圍 CvMat *mat=cvCreateMat(6,6,CV_64FC1);//原數組 CvMat *submat=cvCreateMat(3,3,CV_64FC1);//按mat_rect指定取得的數組子集 CvMat *mat_rows=cvCreateMat(2,6,CV_64FC1);//按一定跨度內的行取得的數組子集 /*對這個6*6的矩陣初始化*/ for (i=0;i<6;i++) { for (j=0;j<6;j++) { CV_MAT_ELEM(*mat,double,i,j)=i*6+j; } } /*打印源矩陣*/ for (i=0;i<6;i++) { for (j=0;j<6;j++) { cout<<setw(3)<<CV_MAT_ELEM(*mat,double,i,j); } cout<<endl; } cout<<endl; /*取子數組,大小根據mat_rect來決定,然后打印*/ cvGetSubRect(mat,submat,mat_rect); for (i=0;i<3;i++) { for (j=0;j<3;j++) { cout<<setw(3)<<CV_MAT_ELEM(*submat,double,i,j); } cout<<endl; } cout<<endl; /*取第一行(從0開始)取到第(3-1=)2行,並打印*/ cvGetRows(mat,mat_rows,1,3,1); for (i=0;i<2;i++) { for (j=0;j<6;j++) { cout<<setw(3)<<CV_MAT_ELEM(*mat_rows,double,i,j); } cout<<endl; } cvReleaseMat(&mat); cvReleaseMat(&submat); cvReleaseMat(&mat_rows); }
在OpenCV中一般取元素都用定義好的宏:
取Mat結構的元素的宏為CV_MAT_ELEM,它取2D的矩陣最方便。
取IplImage元素的宏為CV_IMAGE_ELEM,如取一個圖像(x,y)點的灰度值:
uchar *ptr=CV_IAMGE_ELEM(image,uchar,i,j*3);
ptr[0],ptr[1],ptr[2]就是對應的B/G/R三個分量了。