资源描述:
《OpenCV学习之CvMat的用法详解及实例.doc》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、OpenCV学习之CvMat的用法详解及实例目录1.初始化矩阵:12.IplImage到cvMat的转换13.cvArr(IplImage或者cvMat)转化为cvMat14.图像直接操作25.cvMat的直接操作36.间接访问cvMat47.修改矩阵的形状——cvReshape的操作58.计算色彩距离7CvMat是OpenCV比较基础的函数。初学者应该掌握并熟练应用。但是我认为计算机专业学习的方法是,不断的总结并且提炼,同时还要做大量的实践,如编码,才能记忆深刻,体会深刻,从而引导自己想更高层次迈进。1.初始化矩阵:方式一、逐点赋值式:CvMat*m
2、at=cvCreateMat(2,2,CV_64FC1);cvZero(mat);cvmSet(mat,0,0,1);cvmSet(mat,0,1,2);cvmSet(mat,1,0,3);cvmSet(mat,2,2,4);cvReleaseMat(&mat);方式二、连接现有数组式:doublea[]={1,2,3,4, 5,6,7,8, 9,10,11,12};CvMatmat=cvMat(3,4,CV_64FC1,a);//64FC1fordouble//不需要cvReleaseMat,因为数
3、据内存分配是由double定义的数组进行的。2.IplImage到cvMat的转换方式一、cvGetMat方式:CvMatmathdr,*mat=cvGetMat(img,&mathdr);方式二、cvConvert方式:CvMat*mat=cvCreateMat(img->height,img->width,CV_64FC3);cvConvert(img,mat);//#definecvConvert(src,dst)cvConvertScale((src),(dst),1,0)3.cvArr(IplImage或者cvMat)转化为cvMat方式一、
4、cvGetMat方式:intcoi=0;cvMat*mat=(CvMat*)arr;if(!CV_IS_MAT(mat)){ mat=cvGetMat(mat,&matstub,&coi); if(coi!=0)reutn;//CV_ERROR_FROM_CODE(CV_BadCOI);}写成函数为://Thisisjustanexampleoffunction//tosupportbothIplImageandcvMatasaninputCVAPI(void)cvIamArr(constCvArr*arr){ CV_FUNCNAME("c
5、vIamArr"); __BEGIN__; CV_ASSERT(mat==NULL); CvMatmatstub,*mat=(CvMat*)arr; intcoi=0; if(!CV_IS_MAT(mat)) { CV_CALL(mat=cvGetMat(mat,&matstub,&coi)); if(coi!=0)CV_ERROR_FROM_CODE(CV_BadCOI); } //ProcessascvMat __END__;}4.图像直接操作方式一:直接数组操作intcol,row,z;
6、ucharb,g,r;for(y=0;rowheight;y++){ for(col=0;colwidth;col++) { b=img->imageData[img->widthStep*row+col*3] g=img->imageData[img->widthStep*row+col*3+1]; r=img->imageData[img->widthStep*row+col*3+2]; }}方式二:宏操作:introw,col;ucharb,g,r;for(row=0;rowheight
7、;row++){ for(col=0;colwidth;col++) { b=CV_IMAGE_ELEM(img,uchar,row,col*3); g=CV_IMAGE_ELEM(img,uchar,row,col*3+1); r=CV_IMAGE_ELEM(img,uchar,row,col*3+2); }}注:CV_IMAGE_ELEM(img,uchar,row,col*img->nChannels+ch)5.cvMat的直接操作数组的直接操作比较郁闷,这是由于其决定于数组的数据类型。对于CV_32FC1(1
8、channelfloat):CvMat*M=cvCreateMat(4,4,CV_32FC1)