cvarr,cvmat,iplimage关系

合集下载

OpenCV2:总结篇cv::Mat类

OpenCV2:总结篇cv::Mat类

OpenCV2:总结篇cv::Mat类⼀.简介在OpenCV中,可以⽤C++语法的Mat类来表⽰⼀张图像也可以⽤C语法的lpllmage或CvMat结构体来表⽰⼀张图像1.单通道像素值2.多通道像素值OpenCV默认颜⾊顺序为BGR⼆.成员公有函数cv::Mat类能够⾃动管理内存,由矩阵头和指向存储所有像素值的矩阵的指针构成cv::Mat类表⽰⼀个n维的密集数值单通道或多通道数组,它可⽤于存储实数或复数值的向量和矩阵灰度和彩⾊图像体素向量场点云张量直⽅图等1.常⽤的成员函数Mat::Mat()Mat::~Mat()Mat::row // 创建⼀个具有指定了矩阵头中⾏数的参数的矩阵Mat::col // 创建⼀个具有指定了矩阵头中列数的参数的矩阵Mat::rowRange // 为指定的⾏span创建⼀个新的矩阵头,可取指定⾏区间元素Mat::colRange // 为指定的列span创建⼀个⼼得矩阵头,可取指定列区间元素Mat::clone // 创建⼀个数据及其基础数据的完整副本Mat::copyTo //Mat::convertToMat::zerosMat::onesMat::channelsMat::emptyMat::atMat::isContinuous() //判断图像存储是否连续2.不常⽤的成员函数Mat::addref()Mat::adjustROI()Mat::assignTo()Mat::at()Mat::begin()Mat::channels() Mat::checkVertor() Mat::clone() Mat::col() Mat::colRange() Mat::convertTo() Mat::copySize() Mat::copyTo() Mat::create() Mat::cross() Mat::deallocate() Mat::depth() Mat::diag() Mat::dot() Mat::elemSize() Mat::elemSize1() Mat::empty() Mat::end() Mat::eye() Mat::inv() Mat::isContinuous() Mat::isSubmatrix() Mat::locateROI() Mat::mul() Mat::ones() Mat::pop_back() Mat::ptr() Mat::push_back() Mat::push_back_() Mat::release() Mat::reserve() Mat::reshape() Mat::resize() Mat::row() Mat::rowRange() Mat::setTo() Mat::step1() Mat::t()Mat::total()Mat::type()Mat::zeros()3.成员数据class CV_EXPORTS Mat{public:// 标志位int flags;// 矩阵的维数,应该⼤于等于2int dims;// 矩阵的⾏数和列数,如果维度⼤于2,则都为-1int rows,cols;// 指向数据的指针uchar* data;// 指向引⽤计数的指针int* refcount;uchar* datastart;uchar* dataend;uchar* datalimit;MatAllocator* allocator;MSize size;MStep step;};4.构造函数Mat() // 默认构造函数Mat(int row,int cols,int type)Mat(Size size,int type)Mat(int rows,int cols,int type,const Scalar& s)Mat(Size size,int type,const Scalar& s)Mat(int ndims,const int* sizes,int type)Mat(int ndims,const int* sizes,int type,const Scalar& s)Mat(const Mat& m) // 拷贝构造函数Mat(int rows,int cols,int type,void* data,size_t step=AUTO_STEP)Mat(Size size,int type,void* data,size_t step=AUTO_SETP)Mat(int ndims,const int* sizes,int type,void* data,const size_t* steps=0)Mat(const Mat& m,const Range& rowRange,const Range& colRange=Range::all());Mat(const Mat& m,const Rect& roi);Mat(const Mat& m,const Range* ranges);Mat(const CvMat* m,bool copyData=false);Mat(const CvMatND* m,bool copyData=false);Mat(const IplImage* img,bool copyData=false);template<typename _Tp>explicit Mat(const vector<_Tp>& vec,bool copyData=false);template<typename _Tp,int n>explicit Mat(const Vec<_Tp,n>& vec,bool copyData=true);template<typename _tp,>三.cv::Mat 类型转换1.cv::Mat 类转换为 IplImage 类型和 CvMat 类型cv::Mat img;CvMat cvMatImg = img;IplImage iplImage = img;2.IpIImage 类型和 CvMat 类型转换为 cv::Mat 类型IplImage* iplImg = cvLoadImage("a.jpg");cv::Mat img(iplImg, true);。

CvArr、Mat、CvMat、IplImage、BYTE转换K

CvArr、Mat、CvMat、IplImage、BYTE转换K

CvArr、Mat、CvMat、IplImage、BYTE转换(总结而来)分类:OpenCv 2012-02-29 14:165388人阅读评论(2)收藏举报byte优化图像处理数据结构matrixvector一、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 处理。

IplImage, CvMat, Mat 的关系和相互转换

IplImage, CvMat, Mat 的关系和相互转换
CvMat * vector = cvCreateMat(1,3, CV_32SC2);CV_MAT_ELEM(*vector, CvPoint, 0, 0) = cvPoint(100,100);
CvMat * vector = cvCreateMat(1,3, CV_64FC4);CV_MAT_ELEM(*vector, CvScalar, 0, 0) =
CvMat * cvmat = cvCreateMat(4, 4, CV_32FC1); cvmat->data.fl[row * cvmat->cols + col] = (float)3.0;
CvMat * cvmat = cvCreateMat(4, 4, CV_64FC1); cvmat->data.db[row * cvmat->cols + col] = 3.0;
class CV_EXPORTS Mat {
public:
int flags;(Note :目前还不知道 flags 做什么用的) int dims; int rows,cols; uchar *data; int * refcount; ...
};
从以上结构体可以看出 Mat 也是一个矩阵头,默认不分配内存,只是指向一块内存(注意读 写保护)。初始化使用 create 函数或者 Mat 构造函数,以下整理自 opencv2.3.1 Manual: View Code
CvMat * cvmat = cvCreateMat(4, 4, CV_64FC1); CV_MAT_ELEM(*cvmat, double, row, col) = 3.0;
if (CV_MAT_DEPTH(cvmat->type) == CV_32F) CV_MAT_ELEM_CN(*cvmat, float, row, col * CV_MAT_CN(cvmat->type) + ch) = (float)3.0; // ch 为 通道值 if (CV_MAT_DEPTH(cvmat->type) == CV_64F) CV_MAT_ELEM_CN(*cvmat, double, row, col * CV_MAT_CN(cvmat->type) + ch) = 3.0; // ch 为通 道值

opencv里面CV_32FC1家族

opencv里面CV_32FC1家族

opencv⾥⾯CV_32FC1家族因为总是接触过这样⼀些#define⾥⾯的东西但是总也不知道是⼲什么⽤的。

⽽且每看⼀次梦⽐⼀次。

对于这些东西到底是什么的简写根本就不能理解。

原意是跑⼀下这个例程的:cvRectangle(myMat,cvPoint(5, 10),cvPoint(20, 30),cvScalar(50, 50, 200));可是第⼆章就练习了 IplImage这个结构,对于cvMat简直就不知所云,然后第⼀版:CvMat *myMat;cvRectangle(myMat,cvPoint(5, 10),cvPoint(20, 30),cvScalar(50, 50, 200));然后就想显⽰,这必然是不能跑,因为没有实例化,没有分配内存空间,还想在所谓的画布上画图像,应该是不⾏。

所以找来了明杰同学,他也是很热⼼的但是说对于这个cvmat也不是很熟。

于是就这样跑起来了。

IplImage *myImg=cvCreateImage(cvSize(500,500),8,3);cvZero(myImg);cvRectangle(myImg,cvPoint(5, 10),cvPoint(20, 30),cvScalar(50, 50, 200));cvNamedWindow("Example6", CV_WINDOW_AUTOSIZE);cvShowImage("Example6", myImg);cvWaitKey(0);能跑了好开⼼,然后看着他帮我调颜⾊也就是cvScalar 我想这个单词应该是读作:color的把就跟class都写成成clazz⼀样。

/*然后跟我熟悉的rgb有出⼊的点在于这个⾥⾯是bgr也就是第⼀个参数是蓝⾊第⼆个是绿⾊第三个参数是红⾊,我记得不论是我之前的ps课程还是后⾯的⼀些android的点,或者h5⾥⾯那个颜⾊都是rgb的。

对OpenCV直方图的数据结构CvHistogram的理解

对OpenCV直方图的数据结构CvHistogram的理解

前几天被OpenCV的直方图的数据结构CvHistogram弄得很纠结。

上网一搜,也没什么相关的资料。

现在有点头绪了,就写点东西,让后面的人好走一些吧。

先来看看CvHistogram的定义:typedef struct CvHistogram{int type;CvArr* bins;float thresh[CV_MAX_DIM][2]; /* For uniform histograms. */float** thresh2; /* For non-uniform histograms. */CvMatND mat; /* Embedded matrix header for array histograms. */}CvHistogram;第一个成员type,相信大家都见过很多结构都有其。

比如:CvMat、CvMatND、IplImage(图像结构中,其用nSize成员代替)。

这个成员用来区分各个类型的。

OpenCV很多函数的原型都用到了一个CvArr*类型。

这个类型说明可以接受一个CvMat或者IplImage类型的指针。

这是我们对它的最初理解。

其实,看过CvArr定义的人都知道,其实是typedef void CvArr;并非派生关系。

对于OPenCV函数内部,得到的是一个void指针,这时就有必要确切的知道得到的到底是一个什么类型(是CvMat指针还是IplImage指针,还是CvMatND指针)。

这样type的作用就体现了。

第二个成员bins。

一个CvArr(即void)指针。

大家可以先把其理解成一个快捷方式。

其等于mat成员的data成员。

等一下再说这个成员。

第三个成员是thresh。

是一个二维数组。

而且第二维是2.设想一下,这个函数是求图像的分布像素值(像素灰度值)分布情况。

而不同的人,对不同的灰度值感兴趣。

这时,OpenCV就必须能够让用户自行指定一个灰度值的范围。

这就需要一个上界和下界来指定一个范围。

opencv中Mat、cvMat、IplImage、CvvImage之间转换

opencv中Mat、cvMat、IplImage、CvvImage之间转换

opencv中Mat、cvMat、IplImage、CvvImage之间转换1、CvMat之间的复制//注意:深拷贝 - 单独分配空间,两者相互独⽴CvMat* a;CvMat* b = cvCloneMat(a); //copy a to b2、Mat之间的复制//注意:浅拷贝 - 不复制数据只创建矩阵头,数据共享(更改a,b,c的任意⼀个都会对另外2个产⽣同样的作⽤)Mat a;Mat b = a; //a "copy" to bMat c(a); //a "copy" to c//注意:深拷贝Mat a;Mat b = a.clone(); //a copy to bMat c;a.copyTo(c); //a copy to c3、CvMat转Mat//使⽤Mat的构造函数:Mat::Mat(const CvMat* m, bool copyData=false); 默认情况下copyData为falseCvMat* a;//注意:以下三种效果⼀致,均为浅拷贝Mat b(a); //a "copy" to bMat b(a, false); //a "copy" to bMat b = a; //a "copy" to b//注意:当将参数copyData设为true后,则为深拷贝(复制整个图像数据)Mat b = Mat(a, true); //a copy to b4、Mat转CvMat//注意:浅拷贝Mat a;CvMat b = a; //a "copy" to b//注意:深拷贝Mat a;CvMat *b;CvMat temp = a; //转化为CvMat类型,⽽不是复制数据cvCopy(&temp, b); //真正复制数据 cvCopy使⽤前要先开辟内存空间==========IplImage与上述⼆者间的转化和拷贝===========1、IplImage之间的复制这个不赘述了,就是cvCopy与cvCloneImage使⽤区别,贴张⽹上的图:2、IplImage转Mat//使⽤Mat的构造函数:Mat::Mat(const IplImage* img, bool copyData=false); 默认情况下copyData为falseIplImage* srcImg = cvLoadImage("Lena.jpg");//注意:以下三种效果⼀致,均为浅拷贝Mat M(srcImg);Mat M(srcImg, false);Mat M = srcImg;//注意:当将参数copyData设为true后,则为深拷贝(复制整个图像数据)Mat M(srcImg, true);3、Mat转IplImage//注意:浅拷贝 - 同样只是创建图像头,⽽没有复制数据Mat M;IplImage img = M;IplImage img = IplImage(M);//深拷贝cv::Mat img2;IplImage imgTmp = img2;IplImage *input = cvCloneImage(&imgTmp);4、IplImage转CvMat//法⼀:cvGetMat函数IplImage* img;CvMat temp;CvMat* mat = cvGetMat(img, &temp); //深拷贝//法⼆:cvConvert函数CvMat *mat = cvCreateMat(img->height, img->width, CV_64FC3); //注意height和width的顺序cvConvert(img, mat); //深拷贝5、CvMat转IplImage//法⼀:cvGetImage函数CvMat M;IplImage* img = cvCreateImageHeader(M.size(), M.depth(), M.channels());cvGetImage(&M, img); //深拷贝:函数返回img//也可写成CvMat M;IplImage* img = cvGetImage(&M, cvCreateImageHeader(M.size(), M.depth(), M.channels()));//法⼆:cvConvert函数CvMat M;IplImage* img = cvCreateImage(M.size(), M.depth(), M.channels());cvConvert(&M, img); //深拷贝6、CvvImage与IplImage相互转化利⽤CvvImage可以⽅便地在MFC中画图(DrawToHdc函数),但是在调⽤Copyof这个函数时,要写成 CvvImage img; IplImage src; img.Copyof( src, src->nChannels);否则,如果写成img.Copyof(src),src是单通道的话,会出现错误! CvvImage不仅能处理3通道,也能处理单通道。

OpenCv学习心得之程序

OpenCv学习心得之程序

矩阵间的操作: CvMat *Ma , *Mb , *Mc; cvAdd ( Ma ,Mb , Mc ); cvSub ( Ma, Mb, Mc ); cvMatMul ( Ma, Mb, Mc ); 矩阵间元素的操作:
//Ma + Mb => Mc //Ma - Mb => Mc //Ma * Mb => Mc
其中,filename 是待载入图像的名称,包括图像的扩展名;iscolor 是一个辅助参数项,可选
正数、零和负数三种值,正数表示作为三通道图像载入,零表示该图像作为单通道图像,负
数表示载入图像的通道数由图像文件自身决定。
2.
窗口定义函数
函数 cvNamedWindow 定义一个窗口,用于显示图像。其函数原型如下:
CvScalar t = cvTrace ( Ma ); //trace ( Ma ) => t.val[0]
double d = cvDet ( Ma ); //det( Ma ) => d
cvInvert = ( Ma, Mb );
//inv ( Ma ) => Mb
向量乘法:
double res = cvDotProduct ( &Va, &Vb ); //Va·Vb => res
CvRect 矩形框 typedef struct CvRect{
int x;/*方形的最左角的 x-坐标*/ int y; /*方形的最上或者最下角的 y-坐标*/ int width;/*宽*/ int height; }CvRect; 构造函数: inline CvRect cvRect(int x,int y, int width, intheight);

数据结构操作与运算-IplImage,CvMat的算术运算_docx

数据结构操作与运算-IplImage,CvMat的算术运算_docx
cvSub() 矩阵减法运算,适用于 IplImage 及 CvMat 数据结构,输入跟输出数据结构必须同类型,同大小,同型别,且具有屏蔽的 功能. cvAdd(输入 IplImage 或 CvMat 结构,输入 IplImage 或 CvMat 结构,输出 IplImage 或 CvMat 结构,IplImage 数据结构 目标 Mask 区域)
printf("\nMatrix Mul:\n");
cvMul(&Matrix1,&Matrix2,&Matrix3,2); PrintMatrix(&Matrix3);
printf("\nMatrix Div:\n");
cvDiv(&Matrix1,&MatrintMatrix(&Matrix3);
cvSubS() 目标矩阵与全 1 矩阵的纯量积减法,也就是矩阵内全部数据减去某数,第一个自变量为 IplImage 数据结构或 CvMat 数据结构,第二个为 CvScalar 数据结构,第三个为输出数据结构,输入跟输出数据结构必须同类型,同大小,同型别. cvSubS(输入 IplImage 或 CvMat 结构,CvScalar 数据结构,输出 IplImage 或 CvMat 结构)
cvDestroyWindow("Webcam"); }
上面的程序可好玩多了,执行后会制造出残像的效果,由于前一张 frame 减后一张 frame,所制造出来的差异再跟原始 影像做相加,因此影像会因为运动后而产生差异,对于影像的相减及相加,由于 uchar 格式的图片范围界在 0~255 之间,
因此全部的最小值会为 0,最大值会为 255,不会有负号的存在,它会自动变为 0,因此,对于连续影像的运算不适合 uchar 的型别,可以用前面型别转换的方式,或是把它转成 RGB 三个 float 型别的二维数组自己做连续影像的计算.而 这边 cvQueryFrame()所撷取的视讯图片为上下颠倒的图形影像,跟 cvCreateImage()创造出来的图像是相反的,解决 的方法是把 origin 设为 1,或是用 cvFlip()来做图形的翻转.origin 的部份可以参考前面 IplImage 数据结构介绍的部份.

OpenCV中IplImage,CvMat,Mat基本使用和元素遍历

OpenCV中IplImage,CvMat,Mat基本使用和元素遍历

OpenCV中IplImage,CvMat,Mat基本使用和元素遍历OpenCV中IplImage, CvMat, Mat 基本使用和元素遍历opencv中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage,这三种类型都可以代表和显示图像。

在OpenCV的文档中说明Mat类型通过C++面向对象的方法实现的,可以进行Matlab风格的矩阵操作,IplImage类型和CvMat类型用C语言实现的,两者之间存在着类似于面向对象中的继承关系。

•IplImage一、先上OpenCV中的图像信息头,该结构体的定义如下:[cpp]view plaincopy1.typedef struct _IplImage2.{3.int nSize; /* IplImage大小 */4.int ID; /* 版本 (=0)*/5.int nChannels; /* 大多数OPENCV函数支持1,2,3 或 4 个通道 */6.int alphaChannel; /* 被OpenCV忽略 */7.int depth; /* 像素的位深度: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16U,8.IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F and IPL_ DEPTH_64F 可支持 */9.10.char colorModel[4]; /* 被OpenCV忽略 */11.char channelSeq[4]; /* 被OpenCV忽略 */12.int dataOrder; /* 0 - 交叉存取颜色通道, 1 - 分开的颜色通道. cvCreateImage只能创建交叉存取图像 */13.int origin; /* 0 - 顶—左结构,1 - 底—左结构 (Windows bitmaps 风格) */14.int align; /* 图像行排列 (4 or 8). OpenCV 忽略它,使用 widthStep 代替 */15.16.int width; /* 图像宽像素数 */17.int height; /* 图像高像素数*/18.19.struct _IplROI *roi; /* 图像感兴趣区域. 当该值非空只对该区域进行处理 */20.struct _IplImage *maskROI; /* 在 OpenCV中必须置NULL */21.void *imageId; /* 同上*/22.struct _IplTileInfo *tileInfo; /*同上*/23.24.int imageSize; /* 图像数据大小(在交叉存取格式下imageSize=image->height*image->widthStep),单位字节*/25.char *imageData; /* 指向排列的图像数据 */26.int widthStep; /* 排列的图像行大小,以字节为单位 */27.int BorderMode[4]; /* 边际结束模式, 被OpenCV忽略 */28.int BorderConst[4]; /* 同上 */29.30.char *imageDataOrigin; /* 指针指向一个不同的图像数据结构(不是必须排列的),是为了纠正图像内存分配准备的 */31.} IplImage;特别说明:(1)dataOrder这个可以取两个不同的值(0/1),其中交叉存取颜色通道:指颜色数据排列会是BGRBGR....分开颜色通道:几个颜色通道就分几个颜色平面存储。

opencv中cvarrcvmatiplimagecvmat和cvinputarray的相关总结

opencv中cvarrcvmatiplimagecvmat和cvinputarray的相关总结

opencv中cvarrcvmatiplimagecvmat和cvinputarray的相关总结1.CvArr* :[cpp] view plain copy print?typedef void CvArr;可以认为CvArr*是一个万能指针,例如某个函数参数是CvArr*,该函数内部会强制转换回该函数需要的数据类型,所以在调用该函数时,传入的参数类型就必须与该函数要求的类型一致,否则就会出错。

2.cv::Mat:我们可以认为cv::Mat类型把向量、矩阵、图像等都统一了操作。

cv::Mat有更强大的矩阵运算能力,支持常见的矩阵运算。

对于图像数据的运算,将IplImage和CvMat 类型转换成cv::Mat类型可大大提高运算效率(后面会将cv::Mat与IplImage和CvMat类型之间的转换)。

2.1 cv::Mat的一些操作[cpp] view plain copy print?cv::Mat mat = imread(const string* filename); //读取图像imshow(const string Window's name, mat); //显示图像imwrite(const string&amp;filename, mat); //将mat图像保存到固定路径中3.IplImage:现在OpenCV的很多处理图像的函数中都使用IplImage* 这个数据类型,下面是它的一些重要的操作:[cpp] view plain copy print?IplImage* img =cvLoadImage(PathName); //从路径中加载图像到img cvShowImage("WindowName", img); //显示图像img cvWaitKey();//按任意键退出窗口4.CvMat:因为CvMat是矩阵结构,无法像IplImage和Mat一样直接读取图像数据,而是要先创建Mat类的空矩阵(cvCreateMat());再利用宏CV_MAT_ELEM()存放数据,或者提取数据。

opencv中cvarrcvmatiplimagecvmat和cvinputarray的相关总结

opencv中cvarrcvmatiplimagecvmat和cvinputarray的相关总结

opencv中cvarrcvmatiplimagecvmat和cvinputarray的相关总结在OpenCV中,有几种不同的数据类型可以用来存储图像和矩阵数据。

这些数据类型包括`cv::Mat`、`cv::InputArray`和`cv::_InputArray`。

1. `cv::Mat`:- `cv::Mat`是OpenCV中最常用的数据类型之一,它用于存储图像和矩阵数据。

- `cv::Mat`是一个N维数组,可以包含任意类型的元素。

- `cv::Mat`是一个自包含对象,包含了数据指针、数据尺寸和其他元数据。

- `cv::Mat`提供了丰富的成员函数,用于对图像和矩阵进行操作和处理。

2. `cv::InputArray`:- `cv::InputArray`是OpenCV中的一个输入参数类型,用于接受不同的数据类型作为输入。

- `cv::InputArray`可以接受各种类型的数据作为输入,包括`cv::Mat`、`cv::Mat_`、`cv::UMat`、`cv::STDVECTOR`和原始数组。

- `cv::InputArray`是一个轻量级对象,通常只传递给函数作为输入参数,而不会对其进行修改或处理。

- `cv::InputArray`提供了一些方法,用于将输入数据转换为`cv::Mat`对象,以便在算法中使用。

3. `cv::_InputArray`:- `cv::_InputArray`是`cv::InputArray`的基类,用于在OpenCV内部处理输入参数。

- `cv::_InputArray`提供了一些方法,用于在OpenCV内部将不同类型的输入参数转换为`cv::Mat`对象。

- `cv::_InputArray`还提供了一些辅助方法,用于获取或设置输入参数的相关属性。

总结:- `cv::Mat`是OpenCV中用于存储图像和矩阵数据的最常用数据类型。

- `cv::InputArray`是一个接受不同数据类型作为输入的参数类型,通常用于函数参数。

OpenCV简介

OpenCV简介

江西财经大学
OpenCV数据结构 数据结构
CvPoint 二维坐标系下的点, 二维坐标系下的点,类型为整型 typedef struct CvPoint { int x; /* X坐标 通常以 为基点 */ 坐标, 坐标 通常以0为基点 int y; /* y坐标, 通常以0为基点 */ y坐标 通常以0为基点 坐标, }CvPoint; 构造函数 inline CvPoint cvPoint( int x, int y ); /* 从 CvPoint2D32f类型转换得来 */ 类型转换得来 inline CvPoint cvPointFrom32f( CvPoint2D32f point ) 变体类型: 变体类型:CvPoint2D32f和CvPoint3D32f 和
江西财经大学
CvMat数据的存取 数据的存取3 数据的存取
由于计算机视觉是一种运算密集型的任务, 由于计算机视觉是一种运算密集型的任务,通过移动指针 来访问矩阵元素能够提高效率。 来访问矩阵元素能够提高效率。 通过指针访问矩阵元素是通过step元素和指针来实现的, 元素和指针来实现的, 通过指针访问矩阵元素是通过 元素和指针来实现的 step元素是矩阵行的长度,单位是字节,出于效率的考 元素是矩阵行的长度, 元素是矩阵行的长度 单位是字节, 矩阵或图像的内存分配都是4字节的整数倍 因此, 字节的整数倍, 虑,矩阵或图像的内存分配都是 字节的整数倍,因此, 三个字节宽度的矩阵将被分配成4个字节 个字节, 三个字节宽度的矩阵将被分配成4个字节,最后一个字节 将被忽略。 将被忽略。 一个指向数据元素的指针与step相加可以得到指向这个 相加可以得到指向这个 一个指向数据元素的指针与 点的下一行元素的指针。 点的下一行元素的指针。

Matimread与IplImagecvLoadImage区别

Matimread与IplImagecvLoadImage区别

Matimread与IplImagecvLoadImage区别Q : I have two options to load images: 来源11- Mat and Imread2- IplImage and CvLoadImageWhich one is better to use?A : They are the two different interfaces (Mat/imread for C++ and Ipl... and Cv.. for C interface). The C++ interface is nicer, safer and easier to use. It automatically handles memory for you, and allows you to write less code for the same task. The OpenCV guys advocate for the usage of C++, unless some very specific project requirements force you to C.Example (C++)cv::Mat image = imread("path/to/myimage.jpg")if(image.empty())return;cv::imshow("Image", image);cv::Mat bw = image > 128; // threshold imagecv::Mat crop = image(cv::Rect(0, 0, 100, 100)); // a 100px x 100px cropcrop= 0; // set image to 0cv::waitKey();Note that if not stated otherwise, all matrix assignments reference the same data. In the example above, the crop matrix points to image, and setting it to zero will set that specific part of the image to 0.To create a new copy of data, use Mat::copyTo, or Mat::clone();And the C interfaceIplImage* pImg = CvLoadImage("path/to/myimage.jpg");if(pImg == NULL)return;// ... big bloat to do the same operations with IplImageCvShowImage("Image", pImg);cvWaitKey();CvReleaseImage(&pImg); // Do not forget to release memory.另:来源21.imread是C++接口,cvloadimage是c接口。

Opencv的数据结构

Opencv的数据结构

Opencv的数据结构opencv的基本数据结构结构成员意义CvPoint int x,y图像中的点CvPoint2D32f float x,y⼆维空间中的点CvPoint3D32f float x,y,z三维空间中的点CvSize int width,height图像的尺⼨CvRect int x,y,width,height图像的部分区域CvScalar double val[4]RGBA值Mat 数据结构1. Mat类型侧重于计算,数学性较⾼,openCV对Mat类型的计算也进⾏了优化。

⽽CvMat和IplImage类型更侧重于“图像”,opencv对其中的图像操作(缩放、单通道提取、图像阈值操作等)进⾏了优化。

在opencv2.0之前,opencv是完全⽤C实现的,但是,IplImage类型与CvMat类型的关系类似于⾯向对象中的继承关系。

实际上,CvMat之上还有⼀个更抽象的基类----CvArr,这在源代码中会常见。

2. Mat是opencv2.0推出的处理图像的新的数据结构,现在越来越有趋势取代之前的cvMat和lplImage,相⽐之下Mat最⼤的好处就是能够更加⽅便的进⾏内存管理,不再需要程序员⼿动管理内存的释放3. IplImage,CvMat,Mat的关系Mat的结构,是⼀个类,本⾝就带有很多的函数,成员,重载class CV_EXPORTS Mat{public:// ... a lot of methods ....../*! includes several bit-fields:- the magic signature- continuity flag- depth- number of channels*/int flags;//! the array dimensionality, >= 2int dims;//! the number of rows and columns or (-1, -1) when the array has more than 2 dimensionsint rows, cols;//! pointer to the datauchar* data;//! pointer to the reference counter;// when array points to user-allocated data, the pointer is NULLint* refcount;// other members...};以上结构体可以看出Mat也是⼀个矩阵头,,由两个数据部分组成:矩阵头(包含矩阵尺⼨,存储⽅法,存储地址等信息)和⼀个指向存储所有像素值的矩阵(根据所选存储⽅法的不同矩阵可以是不同的维数)的指针。

【OpenCV学习笔记】2.1OpenCV基本数据类型

【OpenCV学习笔记】2.1OpenCV基本数据类型

【OpenCV学习笔记】2.1OpenCV基本数据类型OpenCV提供了多种基本数据类型。

虽然这些数据类型在C语⾔中不是基本类型,但结构都很简单,可将它们作为原⼦类型。

可以在“…/OpenCV/cxcore/include”⽬录下的cxtypes.h⽂件中查看其详细定义。

数据类型中最简单的就是CvPoint。

CvPoint是⼀个包含integer类型成员x和y的简单结构体。

CvPoint有两个变体类型:CvPoint2D32f和CvPoint3D32f。

前者同样有两个成员x,y,但它们是浮点类型;⽽后者却多了⼀个浮点类型的成员z。

CvSize类型与CvPoint⾮常相似,但它的数据成员是integer类型的width和height。

如果希望使⽤浮点类型,则选⽤CvSize的变体类型CvSize2D32f。

CvRect类型派⽣于CvPoint和CvSize,它包含4个数据成员:x,y,width和height。

(正如你所想的那样,该类型是⼀个复合类型)。

下⼀个(但不是最后⼀个)是包含4个整型成员的CvScalar类型,当内存不是问题时,CvScalar经常⽤来代替1,2或者3个实数成员(在这个情况下,不需要的分量被忽略)。

CvScalar有⼀个单独的成员val,它是⼀个指向4个双精度浮点数数组的指针。

所有这些数据类型具有以其名称来定义的构造函数,例如cvSize()。

(构造函数通常具有与结构类型⼀样的名称,只是⾸字母不⼤写)。

记住,这是C⽽不是C++,所以这些构造函数只是内联函数,它们⾸先提取参数列表,然后返回被赋予相关值的结构。

各数据类型的内联构造函数被列在下表中:cvPoint(),cvSize(),cvRect()和cvScalar()。

这些结构都⼗分有⽤,因为它们不仅使代码更容易编写,⽽且也更易于阅读。

假设要在(5,10)和(20,30)之间画⼀个⽩⾊矩形,只需简单调⽤:1. cvRectangle(2.3. myImg,4.5. cvPoint(5,10),6.7. cvPoint(20,30),8.9. cvScalar(255,255,255)10.11. );表3-1:points, size, rectangles和calar三元组的结构结构成员意义CvPoint int x, y图像中的点CvPoint2D32f float x, y⼆维空间中的点CvPoint3D32f float x, y, z三维空间中的点CvSize int width, height图像的尺⼨CvRect int x, y, width, height图像的部分区域CvScalar double val[4]RGBA 值cvScalar是⼀个特殊的例⼦:它有3个构造函数。

opencv中的几种常见的图像类型

opencv中的几种常见的图像类型

1 opencv中的几种常见的图像类型opencv中,几种常见的图像类型有:IplImage,Mat,CvMat,CvArrCvArr :老版本的结构了。

是一个抽象基类,在函数原型中,常见到CvArr(CvArr*),这就允许吧CvMar* 或者IplImage* 传递到程序或函数参数中了。

CvMat :矩阵结构,IplImage :是较老版本的一种类型了,对图像进行”编码“的基本结构。

这些图像可能是灰度,彩色,4通道的(RGB+ alpha),其中,每个通道可以包含任意的整数或浮点数。

Mat:新版本中的强大的一个图像容器,是和Matlab中的函数对应的。

基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法,存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是不同的维数)的指针。

矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,通常比矩阵头的尺寸大数个数量级。

2 opencv中存储图像类型转换(1)将IplImage类型转换到Mat类型Mat::Mat(const IplImage* img, bool copyData=false);默认情况下,新的Mat类型与原来的IplImage类型共享图像数据,转换只是创建一个Mat矩阵头。

当将参数copyData设为true后,就会复制整个图像数据。

例:IplImage*iplImg = cvLoadImage("greatwave.jpg", 1);Matmtx(iplImg); // IplImage* ->Mat 共享数据// or : Mat mtx = iplImg;(2)将Mat类型转换到IplImage类型同样只是创建图像头,而没有复制数据。

例:IplImage ipl_img = img; // Mat -> IplImage(3)将CvMat类型转换为Mat类型与IplImage的转换类似,可以选择是否复制数据。

opencv的基本数据结构(一)(转)

opencv的基本数据结构(一)(转)

opencv的基本数据结构(⼀)(转)从2001年以来,opencv的函数库⼀直是基于C接⼝构建的,因此在opencv1.0版本中,⼀般使⽤IplImage的C结构体在内存中存储图像,因此,我们在很多较经典的书籍或者开源项⽬中依然可见IplImage。

但是⽤其存储图像的时候必须在退出前将图像内存⼿动release掉,即添加语句cvReleaseImage(&IplImage);,否则会造成内存泄漏。

Mat类带来了⾃动的内存管理,同时它的操作也更加简单,⽐如⽤imshow显⽰图像,imread读取图像等等,跟Matlab有点接近。

下⾯是将图像容器类mat转化成IplImage结构体的⼀种⽅法,最后别忘了cvReleaseImage(&pImg)。

Mat frame,frame1;IplImage* pImg;frame=capture.read();frame1=frame.clone();pImg=cvCreateImage(cvSize(frame.cols,frame.rows),8,3);pImg->imageData=(char*)frame1.data;...Mat是⼀个类,它由两个数据部分组成:矩阵头和⼀个指向存储所有像素值的矩阵的指针。

其中矩阵头包含了矩阵的尺⼨、存储⽅法、储存地址等信息,由此可以看出矩阵头所占的内存很⼩,通常是⼀个常数值,⽽具体存储所有像素值的矩阵则⾮常⼤。

因此,在程序中传递图像并创建副本时,⼤的开销是由矩阵造成的,⽽不是信息头。

其实上⾯给的mat转IplImage结构体就是⼀个例⼦,显然复制图像会增加算法的复杂度,降低程序的性能。

形象点说,在⼀个班级⾥,矩阵头就相当于存储了班级⾥有多少⼈、男⼥⽐多少、平均⾝⾼等信息,⽽矩阵就储存了班级中所有同学的所有基本信息,每⼀个同学就相当于是⼀个像素矩阵中的⼀个元素,那么根据不同的存储⽅法就得到了不同的元素表⽰⽅法,显然矩阵要⽐矩阵头复杂得多。

XilinxFPGA-Zynq设计中使用HLS实现OpenCV的开发流程

XilinxFPGA-Zynq设计中使用HLS实现OpenCV的开发流程

Xilinx FPGA/Zynq设计中使用HLS实现OpenCV的开发流程摘要:首先介绍OpenCV中图像类型和函数处理方法,之后通过设计实例描述在VivadoHLS中调用OpenCV库函数实现图像处理的几个基本步骤,阐述从OpenCV设计到RTL转换综合的开发流程。

本文网络版地址:http:///article/233872.htm关键词:可编程;处理器;VivadoHLS;OpenCV;Zynq AP SOCDOI:10.3969/j.issn.1005-5517.2014.2.011郭丰收:Xilinx DSP专家,主要从事在Xilinx器件上实现数字信号处理的系统方案、架构和算法应用。

开源计算机视觉(OpenCV)被广泛用于开发计算机视觉应用,它包含2500多个优化的视频函数的函数库并且专门针对台式机处理器和GPU进行优化。

Xilinx VivadoHLS高层次综合工具能够使用C/C++ 编写的代码直接创建RTL硬件,显著提高设计生产力,同时,Xilinx Zynq全可编程SoC系列器件嵌入双核ARM Cortex-A9处理器将软件可编程能力与FPGA的硬件可编程能力实现完美结合,以低功耗和低成本等系统优势实现单芯片高的系统性能、灵活性、可扩展性,加速图形处理产品设计上市时间。

OpenCV拥有成千上万的用户,而且OpenCV的设计无需修改即可在Zynq器件的ARM处理器上运行,但是利用OpenCV 实现的高清处理经常受外部存储器的限制,尤其是存储带宽会成为性能瓶颈,存储访问也限制了功耗效率。

使用Xilinx公司的V ivadoHLS高级语言综合工具,可以轻松实现OpenCV C++视频处理设计到RTL代码的转换,输出Zynq的硬件加速器或者直接在FPGA上实现实时硬件视频处理功能。

同时,Xilinx公司的Zynq Allprogrammable SoC是实现嵌入式计算机视觉应用的好方法,解决了在单一处理器上实现视频处理性能低功耗高的限制,Zynq高性能可编程逻辑和嵌入式ARM内核,是一款性能功耗优化的图像处理集成式解决方案。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
相关文档
最新文档