CvMat数据类型是什么?为什么调用的时候都是:const CvMat* mat?为什么加const?不加可以么?

作者&投稿:门娣 (若有异议请与网页底部的电邮联系)
如何调用void colorFilter(CvMat *inputImage, CvMat *&outputImage)~

一、Mat类型:矩阵类型,Matrix。 在openCV中,Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。 Mat有3个重要的方法: 1、Mat mat = imread(const String* filename); 读取图像

在openCV中,Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。
Mat类型较CvMat与IplImage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。在计算密集型的应用当中,将CvMat与IplImage类型转化为Mat类型将大大减少计算时间花费。
在openCV中,Mat类型与CvMat和IplImage类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。
在openCV中,没有向量(vector)的数据结构。任何时候,但我们要表示向量时,用矩阵数据表示即可。但是,CvMat类型与我们在线性代数课程上学的向量概念相比,更抽象,比如CvMat的元素数据类型并不仅限于基础数据类型。
在类型关系上,我们可以说IplImage类型继承自CvMat类型,当然还包括其他的变量将之解析成图像数据。
取值0表示原点位于图片左上角,1表示左下角。dataOrder参数定义数据的格式。有IPL_DATA_ORDER_PIXEL和IPL_DATA_ORDER_PLANE两种取值,前者便是对于像素,不同的通道的数据交叉排列,后者表示所有通道按顺序平行排列。IplImage类型的所有额外变量都是对“图像”的表示与计算能力的优化。

一、Mat类型:矩阵类型,Matrix。
在openCV中,Mat是一个多维的密集数据数组。可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。
Mat有3个重要的方法:
1、Mat mat = imread(const String* filename); 读取图像
2、imshow(const string frameName, InputArray mat); 显示图像
3、imwrite (const string& filename, InputArray img); 储存图像
Mat类型较CvMat与IplImage类型来说,有更强的矩阵运算能力,支持常见的矩阵运算。在计算密集型的应用当中,将CvMat与IplImage类型转化为Mat类型将大大减少计算时间花费。
A.Mat -> IplImage
同样只是创建图像头,而没有复制数据。
例: // 假设Mat类型的imgMat图像数据存在
IplImage pImg= IplImage(imgMat);
B.Mat -> CvMat
与IplImage的转换类似,不复制数据,只创建矩阵头。
例: // 假设Mat类型的imgMat图像数据存在
CvMat cvMat = imgMat;

二、CvMat类型与IplImage类型:逗图像地类型
在openCV中,Mat类型与CvMat和IplImage类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于逗图像地,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。
补充:IplImage由CvMat派生,而CvMat由CvArr派生即CvArr -> CvMat -> IplImage
CvArr用作函数的参数,无论传入的是CvMat或IplImage,内部都是按CvMat处理。
1.CvMat
A.CvMat-> IplImage
IplImage* img = cvCreateImage(cvGetSize(mat),8,1);
cvGetImage(matI,img);
cvSaveImage("rice1.bmp",img);
B.CvMat->Mat
与IplImage的转换类似,可以选择是否复制数据。
Mat::Mat(const CvMat* m, bool copyData=false);
在openCV中,没有向量(vector)的数据结构。任何时候,但我们要表示向量时,用矩阵数据表示即可。
但是,CvMat类型与我们在线性代数课程上学的向量概念相比,更抽象,比如CvMat的元素数据类型并不仅限于基础数据类型,比如,下面创建一个二维数据矩阵:
CvMat* cvCreatMat(int rows ,int cols , int type);
这里的type可以是任意的预定义数据类型,比如RGB或者别的多通道数据。这样我们便可以在一个CvMat矩阵上表示丰富多彩的图像了。

2.IplImage
在类型关系上,我们可以说IplImage类型继承自CvMat类型,当然还包括其他的变量将之解析成图像数据。
IplImage类型较之CvMat多了很多参数,比如depth和nChannels。在普通的矩阵类型当中,通常深度和通道数被同时表示,如用32位表示RGB+Alpha.但是,在图像处理中,我们往往将深度与通道数分开处理,这样做是OpenCV对图像表示的一种优化方案。
IplImage的对图像的另一种优化是变量origin----原点。在计算机视觉处理上,一个重要的不便是对原点的定义不清楚,图像来源,编码格式,甚至操作系统都会对原地的选取产生影响。为了弥补这一点,openCV允许用户定义自己的原点设置。取值0表示原点位于图片左上角,1表示左下角。
dataOrder参数定义数据的格式。有IPL_DATA_ORDER_PIXEL和IPL_DATA_ORDER_PLANE两种取值,前者便是对于像素,不同的通道的数据交叉排列,后者表示所有通道按顺序平行排列。
IplImage类型的所有额外变量都是对逗图像地的表示与计算能力的优化。
A.IplImage -> Mat
IplImage* pImg = cvLoadImage("lena.jpg");
Mat img(pImg,0); // 0是不复制影像,也就是pImg与img的data共用同个记忆体位置,header各自有
B.IplImage -> CvMat
法1:CvMat mathdr, *mat = cvGetMat( img, &mathdr );
法2:CvMat *mat = cvCreateMat( img->height, img->width, CV_64FC3 );
cvConvert( img, mat );
C.IplImage*-> BYTE*
BYTE* data= img->imageData;

CvMat和IplImage创建时的一个小区别:
1、建立矩阵时,第一个参数为行数,第二个参数为列数。
CvMat* cvCreateMat( int rows, int cols, int type );
2、建立图像时,CvSize第一个参数为宽度,即列数;第二个参数为高度,即行数。这 个和CvMat矩阵正好相反。
IplImage* cvCreateImage(CvSize size, int depth, int channels );
CvSize cvSize( int width, int height );

IplImage内部buffer每行是按4字节对齐的,CvMat没有这个限制

补充:
A.BYTE*-> IplImage*
img= cvCreateImageHeader(cvSize(width,height),depth,channels);
cvSetData(img,data,step);
//首先由cvCreateImageHeader()创建IplImage图像头,制定图像的尺寸,深度和通道数;
//然后由cvSetData()根据BYTE*图像数据指针设置IplImage图像头的数据数据,
//其中step指定该IplImage图像每行占的字节数,对于1通道的IPL_DEPTH_8U图像,step可以等于width。


imrtimrt和vmat哪个好
1、英文缩写 _ IMRT _ IMRT是什么意思2、imrt中文简称3、imrt与vmate有什么区别英文缩写 _ IMRT _ IMRT是什么意思英文缩写 IMRT英文全称 intensity-modulated radiation therapy中文解释 强度调控放射治疗缩写分类 医药卫生缩写简介 强度调控放射治疗(intensity-modulated radiation therapy)imrt,简称IMRTimrt...

癌症患者5年生存率达75%!12年大样本数据力证质子治疗头颈部肿瘤的高光时...
癌症患者的五年生存率已经达到了75%,这得益于一项历时12年的大型样本数据研究,证实了质子治疗在头颈部肿瘤治疗中的卓越表现。头颈部肿瘤作为全球第六大癌症,对人类健康构成严重威胁,尤其是喉癌、甲状腺癌等,发病率持续上升。头颈部肿瘤的复杂性在于其涉及众多重要器官,放射治疗作为主要治疗手段,质子治疗...

老年早期肺癌无法手术怎么办
然而,随着放疗技术的提高,3D及4D如适形放疗3DCRT、图像引导放疗IGRT、旋转调强放疗VMAT、呼吸门控等精确放疗技术的开展,使放疗靶区剂量高度集中,剂量高度适形,及靶区外剂量迅速下降等,做到了提高病灶剂量,降低周围正常组织受照量,从而提高局控率,降低不良反应,延长患者生存期,提高生活质量。 2、老年局部晚期肺癌治疗...

体部立体定向放射治疗肿瘤
体部立体定向放射治疗(SBRT)技术通常指疗程短、分次剂量大的精确放疗技术,其实现的方式有三维适形放疗(3D-CRT)、容积弧形调强治疗(VMAT)、赛博刀全方位旋转跟踪治疗(Cyber-knife)三种。随着放射物理学技术和放射生物学理论的不断发展和完善,以及体部定位技术和靶器官运动或呼吸控制技术的不断提高,SBRT...

opencv里面 怎么把多个Mat合成为一个Mat?例如有100个1行128列的矩阵...
vector<Mat> vMatSet( 100 );\/ 这里读入数据到vMatSet里,每个vMatSet[i]都是一行128列,例如:for( int i = 0; i < 100; ++i )vMatSet[i] = imread( "图像文件" );\/ \/\/下面要将多个Mat合成到comineMat里 for( int i = 0; i < 100; ++i ){ combineMat.push_back( vMatSet...

ug二次开发怎么把不同数据写在一起
如果是大量的数据,可以采用KF,如果数据小,可以采用属性的方式。与表达时候相关的部分函数:UF_MODL_ask_exp。UF_MODL_ask_exp_desc_of_feat。UF_MODL_ask_exp_desc_of_frec。UF_MODL_ask_exp_tag_string。UF_MODL_ask_exp_tag_value。UF_MODL_ask_exps_of_feature。UF_MODL_ask_exps...

安川机器人movs命令怎么用
MOVJ 功能 再生运转时,移动至所教点之路径为关节路径 (VJ=0.01至100%,PL=0或4CONT)。范例 MOVJ VJ=50.00 PL=2 关节路径移动,速度50.00%精度等级2。MOVL 功能 再生运转时,移动至所教点之路径为直线路径(V=0.1至 1500.0mm\/s或V=0.6至9000.0cm\/min PL=0至4CONT)范例 MOVL V=...

阿克陶县14767893772: CvMat数据类型是什么?为什么调用的时候都是:const CvMat* mat?为什么加const?不加可以么? -
照咏氢溴: 一、Mat类型:矩阵类型,Matrix.在openCV中,Mat是一个多维的密集数据数组.可以用来处理向量和矩阵、图像、直方图等等常见的多维数据.Mat有3个重要的方法:1、Mat mat = imread(const String* filename); 读取图像2、imshow(...

阿克陶县14767893772: opencv中CvMat - >data.ptr是什么意思? -
照咏氢溴: CvMat是一个结构体,结构体如下:typedef struct CvMat{ int type;//表示矩阵的数据类型 int step;//表示每一行的数据的字节数 int *refcount;//内部使用,不必了解 union{//联合体data,联合体里的成员共用一个空间 uchar* ptr;//ptr指向data数据...

阿克陶县14767893772: “C语言”的三种基本数据类型是什么? -
照咏氢溴: C语言的三种基本数据类型为整型,实型,字符型.1 整型,包括short, int, long等,用以表示一个整数,默认为有符号型,配合unsigned关键字,可以表示为无符号型. 2 实型,即浮点型,包括float, double等,用来表示实数,相对于整型,该类型可以表示带有小数部分的数值.需要注意的是,实型在计算机语言中为近似值表示,并非准确值,在多次计算后可能会出现真值偏差. 3 字符型,即char型,用来表示各种字符,与ascii码表一一对应.除可以用来表示各类字符外,char型的其它规则与整型相同,可以认为char是一种特殊的整型.

阿克陶县14767893772: cvMat - >data.ptr -
照咏氢溴: #include struct Date { int ptr[10]; }; struct veMat { struct Date date; }; veMat* Frame;//int p=i*m_width+j;//Frame->data.ptr[p]; main() { veMat v1; Frame=&v1; Frame->date.ptr[1]=1; printf("%d",Frame->date.ptr[1]); } 像这样一个程序,cvMat* Frame...

阿克陶县14767893772: CV令一个Mat等于0有什么意义 -
照咏氢溴: cv::Mat是一个类(Class),而CvMat是一个Struct,从类型上就可以知道二者存在很大区别.前者除了几个成员变量之外还有很多的成员函数和重载函数,可以实现很多的图像数据处理功能,而后者只有几个成员变量,要对其成员进行一些处理,需要借用别的函数.

阿克陶县14767893772: typedef CvMat* (*ransac - xform - fn)( CvPoint2D64f* pts, CvPoint2D64f* mpts, int n );什么意思啊! -
照咏氢溴: 定义一个函数指针,它指向的函数返回值为 CvMat* 参数列表为( CvPoint2D64f* pts, CvPoint2D64f* mpts, int n ); 函数指针类型为ransac_xform_fn 这个类型就是像int,int*这种一样,是类型 它可以指向参数相同,返回值相同的函数

阿克陶县14767893772: opencv里面有的函数以cv开头,有的没有.有什么区别 -
照咏氢溴: Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化.而CvMat和IplImage类型更侧重于“图像”,opencv对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化.在opencv2.0以前,只有cv,比如cvmat,...

阿克陶县14767893772: opencv怎么将图像数据存入矩阵 -
照咏氢溴: 我也不是很熟,但是Mat存图像也用过,试着说一下我的理解:一般的图像文件格式使用的是 Unsigned 8bits吧,CvMat矩阵对应的参数类型就是 CV_8UC1,CV_8UC2,CV_8UC3.(最后的1、2、3表示通道数,譬如RGB3通道就用CV_8UC3) ...

阿克陶县14767893772: OpenCV 16位图像保存问题 -
照咏氢溴: opencv中的Ipimage、 CvMat和Mat类型都是可以存储图像数据的,他们三个其实都是图像头与图像数据分开保存的.内部指向图像存储空间的指针基本都是char*的,我觉得直接把你的unsigned short指针赋值给图像存储对象的存储空间char指针就可以.关键是需要计算存储数据的长宽、位深等等.以便存储为图像文件.

阿克陶县14767893772: OpenCV中的指针 -
照咏氢溴: 这个是结构体指针,这样可以通过指针来引用结构体类型变量.举个例子,比如最常见的IplImage*,如果定义了IplImage* img,那么就可以引用结构体的变量(具体变量看一下IplImage结构体),例如img->width就是图像的宽,img->height就是图像高等等.比如你的第一个CvMat结构体,按照你的定义可以引用M->rows矩阵行数,M->cols矩阵列数,rows和cols都是在CvMat结构体里面定义的.你查找下手册看看结构体是怎么定义的,里面的变量都可以通过这种方式引用. 至于你说的空格问题,两种写法是一样的.空格在前在后无所谓.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网