opencv中resize函数 中的resize会不会影响图像的内部结构

[转载]OpenCV&Resize()缩放图像
图像大小变换
void cvResize( const CvArr* src, CvArr* dst, int
interpolation=CV_INTER_LINEAR );
输入图像.&
输出图像.&
interpolation&
差值方法:&
& CV_INTER_NN - 最近邻差值,&
& CV_INTER_LINEAR -& 双线性差值
(缺省使用)&
& CV_INTER_AREA -& 使用象素关系重采样。当图像缩小时候,该方法
可以避免波纹出现。当图像放大时,类似于& CV_INTER_NN&
& CV_INTER_CUBIC -& 立方差值.&
函数& cvResize 将图像& src
改变尺寸得到与& dst 同样大小。若设定
ROI,函数将按常规支持 ROI.
"highgui.h"
#include "cv.h"
#include "cxcore.h"
#include &stdlib.h&
#include &stdio.h&
main(int argc,char **argv)
&IplImage *
&IplImage *
&double scale = 0.5;
&if((src = cvLoadImage( argv[1], 3)) != 0 )
&&sz.width =
src-&width*
&&sz.height =
src-&height*
cvCreateImage(sz,src-&depth,src-&nChannels);
&&cvResize(src,desc,CV_INTER_CUBIC);
&&cvNamedWindow("src",CV_WINDOW_AUTOSIZE);
&&cvNamedWindow("desc",CV_WINDOW_AUTOSIZE);
&&cvShowImage("src",src);
&&cvShowImage("desc",desc);
&&cvWaitKey(0);
&&cvReleaseImage(&src);
&&cvReleaseImage(&desc);
&&cvDestroyWindow("src");
&&cvDestroyWindow("desc");
&&return 0;
&return -1;
图像如下:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
阳光男孩不久将走进社会了,他也不知道自己要做的是什么事情,困惑迷茫困扰着他,他要去面对还有三年的大学生活,2.3.4,一组平凡的数字,hpu一个平凡的2批本科院校,脚下的路延伸到哪里,谁知道?除了用年轻的激情和澎湃的血液去迎接未来,张阳一个平凡人,爱情的奢望用远也不可以得到
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
opencv中常见的与图像操作有关的数据容器有Mat,cvMat和
IplImage,这三种类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而
CvMat和IplImage类型更侧重于“图像”,opencv对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。在
opencv2.0之前,opencv是完全用C实现的,但是,IplImage类型与CvMat类型的关系类似于面向对象中的继承关系。实际
上,CvMat之上还有一个更抽象的基类----CvArr,这在源代码中会常见。
1. IplImage
opencv中的图像信息头,该结构体定义:&
typedef struct _IplImage
int alphaC
char colorModel[4];
char channelSeq[4];
struct _IplROI *
struct _IplImage *maskROI;
void *imageId;
struct _IplTileInfo *tileI
int imageS
char *imageD
int widthS
int BorderMode[4];
int BorderConst[4];
char *imageDataO
dataOrder中的两个取值:交叉存取颜色通道是颜色数据排列将会是BGRBGR...的交错排列。分开的颜色通道是有几个颜色通道就分几个颜色平面存储。roi是IplROI结构体,该结构体包含了xOffset,yOffset,height,width,coi成员变量,其中xOffset,yOffset是x,y坐标,coi代表channel
of interest(感兴趣的通道),非0的时候才有效。访问图像中的数据元素,分间接存储和直接存储,当图像元素为浮点型时,(uchar *) 改为
(float *):&
<img src="/blog7style/images/common/sg_trans.gif"
name="code_img_closed_6e2e3fa5-28f9-4fc1-a9d1-7be45f0b6d45"
style="border-style:"
title="opencv中mat,cvmat,Iplimage结构体定义以及格式互相转换&(转载)"
><img src="/OutliningIndicators/ExpandedBlockStart.gif"
name="code_img_opened_6e2e3fa5-28f9-4fc1-a9d1-7be45f0b6d45"
style="border-style:"
title="opencv中mat,cvmat,Iplimage结构体定义以及格式互相转换&(转载)"
IplImage* img=cvLoadImage("lena.jpg", 1);
s=cvGet2D(img,i,j);
cvSet2D(img,i,j,s);
IplImage* //malloc memory by cvLoadImage or cvCreateImage
for(int row = 0; row & img-& row++)
for (int col = 0; col & img-& col++)
b = CV_IMAGE_ELEM(img, UCHAR, row, col * img-&nChannels + 0);
g = CV_IMAGE_ELEM(img, UCHAR, row, col * img-&nChannels + 1);
r = CV_IMAGE_ELEM(img, UCHAR, row, col * img-&nChannels + 2);
IplImage* //malloc memory by cvLoadImage or cvCreateImage
uchar b, g, // 3 channels
for(int row = 0; row & img-& row++)
for (int col = 0; col & img-& col++)
b = ((uchar *)(img-&imageData + row * img-&widthStep))[col * img-&nChannels + 0];
g = ((uchar *)(img-&imageData + row * img-&widthStep))[col * img-&nChannels + 1];
r = ((uchar *)(img-&imageData + row * img-&widthStep))[col * img-&nChannels + 2];
&初始化使用IplImage&*,是一个指向结构体IplImage的指针:&
IplImage * cvLoadImage(constchar * filename, int//load images from specified image
IplImage * cvCreateImage(CvSize size, int depth, int channels); //allocate memory
首先,我们需要知道,第一,在OpenCV中没有向量(vector)结构。任何时候需
要向量,都只需要一个列矩阵(如果需要一个转置或者共轭向量,则需要一个行矩阵)。第二,OpenCV矩阵的概念与我们在线性代数课上学习的概念相比,更
抽象,尤其是矩阵的元素,并非只能取简单的数值类型,可以是多通道的值。CvMat
typedef struct CvMat
&创建CvMat数据:&
<img src="/blog7style/images/common/sg_trans.gif"
name="code_img_closed_26-42ae-9ea7-9ec"
style="border-style:"
title="opencv中mat,cvmat,Iplimage结构体定义以及格式互相转换&(转载)"
><img src="/OutliningIndicators/ExpandedBlockStart.gif"
name="code_img_opened_26-42ae-9ea7-9ec"
style="border-style:"
title="opencv中mat,cvmat,Iplimage结构体定义以及格式互相转换&(转载)"
>View Code
CvMat * cvCreateMat(int rows, int cols, int type);
CV_INLine CvMat cvMat((int rows, int cols, int type, void* data CV_DEFAULT);
CvMat * cvInitMatHeader(CvMat * mat, int rows, int cols, int type, void * data CV_DEFAULT(NULL), int step CV_DEFAULT(CV_AUTOSTEP));
&对矩阵数据进行访问:&
cvmSet( CvMat* mat, int row, int col, double value);
cvmGet( const CvMat* mat, int row, int col );
CvScalar cvGet2D(const CvArr * arr, int idx0, int idx1); //CvArr只作为函数的形参void cvSet2D(CvArr* arr, int idx0, int idx1, CvScalar value);
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;
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为通道值
for (int row = 0; row & cvmat-& row++)
p = cvmat -&data.fl + row * (cvmat-&step / 4);
for (int col = 0; col & cvmat-& col++)
*p = (float) row +
*(p+1) = (float)row + col + 1;
*(p+2) = (float)row + col + 2;
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) = CvScalar(0, 0, 0, 0);
CvMat* M1 = cvCreateMat(4,4,CV_32FC1);
CvMat* M2;
M2=cvCloneMat(M1);
Mat是opencv2.0推出的处理图像的新的数据结构,现在越来越有趋势取代之前的
cvMat和lplImage,相比之下Mat最大的好处就是能够更加方便的进行内存管理,不再需要程序员手动管理内存的释放。opencv2.3中提到
Mat是一个多维的密集数据数组,可以用来处理向量和矩阵、图像、直方图等等常见的多维数据。&
<img src="/blog7style/images/common/sg_trans.gif"
name="code_img_closed_9a71e488-938a--b7"
style="border-style:"
title="opencv中mat,cvmat,Iplimage结构体定义以及格式互相转换&(转载)"
class CV_EXPORTS Mat
int(Note :目前还不知道flags做什么用的)
&从以上结构体可以看出Mat也是一个矩阵头,默认不分配内存,只是指向一块内存(注意读写保护)。初始化使用create函数或者Mat构造函数,以下整理自opencv2.3.1
Mat(nrows, ncols, type, fillValue]);
M.create(nrows, ncols, type);
Mat M(7,7,CV_32FC2,Scalar(1,3));
M.create(100, 60, CV_8UC(15));
int sz[] = {100, 100, 100};
Mat bigCube(3, sz, CV_8U, Scalar:all(0));
double m[3][3] = {{a, b, c}, {d, e, f}, {g, h, i}};
Mat M = Mat(3, 3, CV_64F, m).inv();
Mat img(Size(320,240),CV_8UC3);
Mat img(height, width, CV_8UC3, pixels, step);
IplImage* img = cvLoadImage("greatwave.jpg", 1);
Mat mtx(img,0); // convert IplImage* -& M
访问Mat的数据元素:
M.row(3) = M.row(3) + M.row(5) * 3;
Mat M1 = M.col(1);
M.col(7).copyTo(M1);
M.at&&span style="color: rgb(0, 0, 255); "&double&(i,j);
M.at(uchar)(i,j);
Vec3i bgr1 = M.at(Vec3b)(i,j)
Vec3s bgr2 = M.at(Vec3s)(i,j)
Vec3w bgr3 = M.at(Vec3w)(i,j)
double sum = 0.0f;
for(int row = 0; row & M. row++)
constdouble * Mi = M.ptr&&span style="color: rgb(0, 0, 255); "&double&(row);
for (int col = 0; col & M. col++)
sum += std::max(Mi[j], 0.);
double sum=0;
MatConstIterator&&span style="color: rgb(0, 0, 255); "&double& it = M.begin&&span style="color: rgb(0, 0, 255); "&double&(), it_end = M.end&&span style="color: rgb(0, 0, 255); "&double&();
for(; it != it_ ++it)
sum += std::max(*it, 0.);
Mat可进行Matlab风格的矩阵操作,如初始化的时候可以用initializers,zeros(), ones(),
eye(). 除以上内容之外,Mat还有有3个重要的方法:
<img src="/blog7style/images/common/sg_trans.gif"
name="code_img_closed_0529bae9-64f2-44c6-b940-276f20a18ded"
style="border-style:"
title="opencv中mat,cvmat,Iplimage结构体定义以及格式互相转换&(转载)"
><img src="/OutliningIndicators/ExpandedBlockStart.gif"
name="code_img_opened_0529bae9-64f2-44c6-b940-276f20a18ded"
style="border-style:"
title="opencv中mat,cvmat,Iplimage结构体定义以及格式互相转换&(转载)"
>View Code
Mat mat = imread(const String* filename); // 读取图像
imshow(conststring frameName, InputArray mat); // 显示图像
imwrite (conststring& filename, InputArray img); //储存图像
4. CvMat, Mat, IplImage之间的互相转换
IpIImage -& CvMat
Mat image;
IplImage *iplimage = cvCreateImage(cvSize(image.cols,image.rows), 8, 3);
memcpy(iplimage-&imageData, image.data, image.cols*image.rows*3*sizeof(uchar));CvM
CvMat * mat = cvGetMat(img, &matheader);
CvMat * mat = cvCreateMat(img-&height, img-&width, CV_64FC3);
cvConvert(img, mat)
IplImage -& Mat
Mat::Mat(const IplImage* img, bool copyData=false);
IplImage* iplImg = cvLoadImage("greatwave.jpg", 1);
Mat mtx(iplImg);
Mat -& IplImage
IplImage iplimage = M;
CvMat -& Mat
Mat::Mat(const CvMat* m, bool copyData=false);
Mat -& CvMat
例子(假设Mat类型的imgMat图像数据存在):
CvMat cvMat = imgM/*Mat -& CvMat, 类似转换到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类型将大大减少计算时间花费。
关于Mat的数学方面的函数略过。
二、CvMat类型与IplImage类型:“图像”类型
&&&&&& 在openCV中,Mat类型与CvMat和IplImage类型都可以代表和显示图像,但是,Mat类型侧重于计算,数学性较高,openCV对Mat类型的计算也进行了优化。而CvMat和IplImage类型更侧重于“图像”,openCV对其中的图像操作(缩放、单通道提取、图像阈值操作等)进行了优化。
&&&&&& 我们知道openCV是完全用C实现的,但是,IplImage类型与CvMat类型的关系就像是java(C++?)中的继承关系。实际上,CvMat之上还有一个更抽象的基类----CvArr,这在源代码中会常见。
&&&&&& 关于CvMat:
其定义如下:
Cpp代码 &&span&style="font-size:&"&typedef&struct&CvMat&&{&&&&&&int&&&&&&&int&&&&&&&&&/*&for&internal&use&only&*/&&&&&&int*&&&&&&&int&hdr_&&&&&&&&union&&&&&&{&&&&&&&&&&uchar*&&&&&&&&&&&short*&s;&&&&&&&&&&int*&i;&&&&&&&&&&float*&&&&&&&&&&&double*&&&&&&&}&&&&&#ifdef&__cplusplus&&&&&&union&&&&&&{&&&&&&&&&&int&&&&&&&&&&&int&&&&&&&};&&&&&&&&union&&&&&&{&&&&&&&&&&int&&&&&&&&&&&int&&&&&&&};&&#else&&&&&&int&&&&&&&int&&&#endif&&&&}&&CvM&/span&&&
在openCV中,没有向量(vector)的数据结构。任何时候,但我们要表示向量时,用矩阵数据表示即可。但是,CvMat类型与我们在线性代数课程上学的向量概念相比,更抽象,比如CvMat的元素数据类型并不仅限于基础数据类型,比如,下面创建一个二维数据矩阵:
&&&&&&&&&&&&& CvMat*
cvCreatMat(int rows ,int cols , int type);
这里的type可以是任意的预定义数据类型,比如RGB或者别的多通道数据。这样我们便可以在一个CvMat矩阵上表示丰富多彩的图像了。
关于IplImage:
在类型关系上,我们可以说IplImage类型继承自CvMat类型,当然还包括其他的变量将之解析成图像数据。
其定义如下:
Cpp代码 &&span&style="font-size:&"&typedef&struct&_IplImage&&{&&&&&&int&&nS&&&&&&&&&&&&&/*&sizeof(IplImage)&*/&&&&&&int&&ID;&&&&&&&&&&&&&&&&/*&version&(=0)*/&&&&&&int&&nC&&&&&&&&&/*&Most&of&OpenCV&functions&support&1,2,3&or&4&channels&*/&&&&&&int&&alphaC&&&&&&/*&Ignored&by&OpenCV&*/&&&&&&int&&&&&&&&&&&&&&&/*&Pixel&depth&in&bits:&IPL_DEPTH_8U,&IPL_DEPTH_8S,&IPL_DEPTH_16S,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&IPL_DEPTH_32S,&IPL_DEPTH_32F&and&IPL_DEPTH_64F&are&supported.&&*/&&&&&&char&colorModel[4];&&&&&/*&Ignored&by&OpenCV&*/&&&&&&char&channelSeq[4];&&&&&/*&ditto&*/&&&&&&int&&dataO&&&&&&&&&/*&0&-&interleaved&color&channels,&1&-&separate&color&channels.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&cvCreateImage&can&only&create&interleaved&images&*/&&&&&&int&&&&&&&&&&&&&&/*&0&-&top-left&origin,&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&1&-&bottom-left&origin&(Windows&bitmaps&style).&&*/&&&&&&int&&&&&&&&&&&&&&&/*&Alignment&of&image&rows&(4&or&8).&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&OpenCV&ignores&it&and&uses&widthStep&instead.&&&&*/&&&&&&int&&&&&&&&&&&&&&&/*&Image&width&in&pixels.&&&&&&&&&&&&&&&&&&&&&&&&&&&*/&&&&&&int&&&&&&&&&&&&&&/*&Image&height&in&pixels.&&&&&&&&&&&&&&&&&&&&&&&&&&*/&&&&&&struct&_IplROI&*&&&&/*&Image&ROI.&If&NULL,&the&whole&image&is&selected.&*/&&&&&&struct&_IplImage&*maskROI;&&&&&&/*&Must&be&NULL.&*/&&&&&&void&&*imageId;&&&&&&&&&&&&&&&&&/*&"&&&&&&&&&&&"&*/&&&&&&struct&_IplTileInfo&*tileI&&/*&"&&&&&&&&&&&"&*/&&&&&&int&&imageS&&&&&&&&&/*&Image&data&size&in&bytes&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(==image-&height*image-&widthStep&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&in&case&of&interleaved&data)*/&&&&&&char&*imageD&&&&&&&&/*&Pointer&to&aligned&image&data.&&&&&&&&&*/&&&&&&int&&widthS&&&&&&&&&/*&Size&of&aligned&image&row&in&bytes.&&&&*/&&&&&&int&&BorderMode[4];&&&&&/*&Ignored&by&OpenCV.&&&&&&&&&&&&&&&&&&&&&*/&&&&&&int&&BorderConst[4];&&&&/*&Ditto.&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&*/&&&&&&char&*imageDataO&&/*&Pointer&to&very&origin&of&image&data&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&(not&necessarily&aligned)&-&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&needed&for&correct&deallocation&*/&&}&&IplI&/span&&&
& 我们可以看到,IplImage类型较之CvMat多了很多参数,比如depth和nChannels。在普通的矩阵类型当中,通常深度和通道数被同时表示,如用32位表示RGB+Alpha.但是,在图像处理中,我们往往将深度与通道数分开处理,这样做是OpenCV对图像表示的一种优化方案。
的对图像的另一种优化是变量origin----原点。在计算机视觉处理上,一个重要的不便是对原点的定义不清楚,图像来源,编码格式,甚至操作系统都会
对原地的选取产生影响。为了弥补这一点,openCV允许用户定义自己的原点设置。取值0表示原点位于图片左上角,1表示左下角。
dataOrder参数定义数据的格式。有IPL_DATA_ORDER_PIXEL和IPL_DATA_ORDER_PLANE两种取值,前者便是对于像素,不同的通道的数据交叉排列,后者表示所有通道按顺序平行排列。
IplImage类型的所有额外变量都是对“图像”的表示与计算能力的优化。不小心看到,幫忙答一下IplImage -& cv::Mat這個範例程式裡 image.cpp有啊,做個簡單的範例。Ex.
IplImage* pImg = cvLoadImage("lena.jpg");cv::Mat img(pImg,0);
//0是不複製影像,也就是pImg與img的data共用同個記憶體位置,header各自有cv::Mat -& IplImagecxcore.hpp裡,class cv::Mat裡面第831、832有寫
// converts header to IplI no data is copied
operator IplImage() 範例接上面的過來..Ex.IplImage* pImg = cvLoadImage("lena.jpg");cv::Mat img(pImg,0);
//img拿到pImg的dataIplImage qIqImg = IplImage(img);
//一樣檔案沒複製,所以qImg.imageData就是指向pImg-&imageData希望這對你有用。Mat::~MatMat的析构函数。C++: Mat::~Mat()析构函数调用Mat::release()。Mat::operator =提供矩阵赋值操作。C++: Mat& Mat::operator=(const Mat& m)C++: Mat& Mat::operator=(const MatExpr_Base& expr)C++: Mat& Mat::operator=(const Scalar& s)参数:m&– 被赋值的右侧的矩阵。 矩阵的赋值是一个复杂度为O(1) 的操作。 这就意味着没有数据段复制并且有数量的递增两矩阵将使用同一引用计数器。在给矩阵赋新数据之前先由Mat::release()释放引用。expr&–被赋值的矩阵表达式对象。 作为第一种赋值方式的逆操作第二种形式可以被重新用到具有适当大小和尺寸的已分配空间的矩阵上以适应表达式的结果。矩阵表达式扩展得到的实函数将自动处理这个分配过程。例如:C=A+B 扩展成add(A, B, C) , andadd() 要当心C重新分配数据的操作。.s&– 标量赋值给每一个矩阵元,矩阵的大小和类型将不会改变。有现成的赋值运算符。由于他们各不相同请阅读运算符参数说明。Mat::operator MatExpr提供一种Mat-to-MatExpr转换运算符C++: Mat::operator MatExpr_&Mat, Mat&() const转
换运算符不能显示调用而是由矩阵表达式引擎(Matrix Expression engine)内部调用The cast operator
should not be called explicitly. It is used internally by the Matrix
Expressions engine.Mat::row创建一个指定行数的矩阵头。.C++: Mat Mat::row(int i) const参数:i –&一个0基的行索引.该方法创建一个具有指定了行数的新矩阵头的矩阵并返回它。这是一个复杂度为O(1) 的操作,无须考虑矩阵的尺寸。新矩阵和原矩阵共享一份基础数据。这是一个典型基本矩阵处理操作的例子, axpy是LU和许多其它算法都使用的一个函数inline void matrix_axpy(Mat& A, int i, int j, double alpha){A.row(i) += A.row(j)*}Note:在当前实现中,下面的代码不会无法按预期的效果工作:Mat A ;...A.row(i) = A.row(j) ;/ /不起作用发
生这种情况是因为 A.row(i)
形成临时矩阵头进一步分配给另一个矩阵头。请记住,每个操作复杂度为O(1),即没有复制任何数据。因此,如果你预期第 j行被复制到第
i行,那么上述赋值不成立。要做到这一点,应该把这种简单的赋值转换到表达式中或使用 Mat::copyTo() 方法:Mat A ;.../ / 可行,但看上去有点目的不明确。A.row(i) = A.row(j) + 0;/ / 这是有点儿长,但这是推荐的方法。A.row(j).copyTo(A.row(i)) ;Mat::col创建一个具有指定了矩阵头中列数这个参数的矩阵C++: Mat Mat::col(int j) const参数:j&–一个0基(从0开始)的列索引该方法创建一个具有指定了矩阵头中列数这个参数的新矩阵并作为函数返回值。这是一种复杂度为O(1)的操作,不用考虑矩阵的尺寸大小。新矩阵和原始矩阵共享一份基础数据。参看Mat::row()说明信息。Mat::rowRange为指定的行span创建一个新的矩阵头。C++: Mat Mat::rowRange(int startrow, int endrow) constC++: Mat Mat::rowRange(const Range& r) const参数:startrow&– 一个包容性的0基(从0开始)的行span起始索引.。endrow&– 一个0基的独占性的行span.终止索引。r&– Range 结构包含着起始和终止的索引值。该方法给矩阵指定的行span创建了新的头。 与Mat::row() 和 Mat::col()相类似这是一个复杂度为O(1)的操作。Mat::colRange为指定的行span创建一个矩阵头。C++: Mat Mat::colRange(int startcol, int endcol) constC++: Mat Mat::colRange(const Range& r) const参数:startcol&– 一个包容性的0基(从0开始)的span列起始索引。endcol&–一个0基的独占性的列span.终止索引。r&–Range 结构包含着起始和终止的索引值。该方法给矩阵指定的列span创建了新的头。 与Mat::row() 和 Mat::col()相类似这是一个复杂度为O(1)的操作。Mat::diag提取或创建矩阵对角线。C++: Mat Mat::diag(int d) constC++: static Mat Mat::diag(const Mat& matD)参数:d&– 对角线的索引值,可以是以下的值:– d=0 是主对角线– d&0表示下半部的对角线。例如:d=1对角线是紧挨着住对角线并位于矩阵下方。– d&0表示来自矩阵上半部的对角线。例如:d= 1表示对角线被设置在对角线的上方并紧挨着。matD&– 单列用于形成矩阵对角线的列。该方法为指定的矩阵创建一个新的头。然后新矩阵被分割为单独的列矩阵。类似于Mat::row() 和Mat::col() ,它是复杂度为O(1)操作。Mat::clone创建一个数组及其基础数据的完整副本。C++: Mat Mat::clone() const该方法创建了一个完整的数组副本。原始的step[]不会被考虑在内的。因此数组的副本是一占用total()*elemSize()字节的连续阵列。Mat::copyTo把矩阵复制到另一个矩阵中。C++: void Mat::copyTo(OutputArray m) constC++: void Mat::copyTo(OutputArray m, InputArray mask) const参数:m&– 目标矩阵。如果它的尺寸和类型不正确,在操作之前会重新分配。mask&– 操作掩码。它的非零元素表示矩阵中某个要被复制。该方法把矩阵的复制到另一个新的矩阵中在复制之前该方法会调用m.create(this-&size(), this-&type);因此,目标矩阵会在必要的情况下重新分配尽管m.copyTo(m) works ?awlessly,该函数并不处理源矩阵和目标矩阵之间有重叠的部分的情况。当操作掩码指定以及上述的Mat::create重新分配矩阵,新分配的矩阵在数据复制到里面之前全都被初始化为0。Mat::convertTo在缩放或不缩放的情况下转换为另一种数据类型。C++:void Mat::convertTo(OutputArray m,int rtype,double alpha=1,double beta=0)const参数:m&– 目标矩阵。如果它的尺寸和类型不正确,在操作之前会重新分配。rtype&– 要求是目标矩阵的类型,或者在当前通道数与源矩阵通道数相同的情况下的depth。如果rtype 为负,目标矩阵与源矩阵类型相同。beta&– 可选的delta加到缩放值中去。该方法将源像素值转化为目标类型saturate_cast&& 要放在最后以避免溢出m(y) = saturate_cast & rType & ( α*( *this)(y) +β)Mat::assignTo提供了一个convertTo的功能形式。C++: void Mat::assignTo(Mat& m, int type=-1 ) constParametersm&– 目标阵列。type&– 要求是目标阵列depth或-1(如果阵列的类型和源矩阵类型相同)这是一个 internally 使用的由 Matrix Expressions引擎调用的方法。Mat::setTo将阵列中所有的或部分的元素设置为指定的值。C++: Mat& Mat::setTo(const Scalar& s, InputArray mask=noArray())参数:s&– 把标量赋给阵列并转化到阵列的实际类型。mask&– 与 *this尺寸相同的操作掩码。这是Mat::operator=(const Scalar& s)运算符的一个高级变量。Mat::reshape在无需复制数据的前提下改变2D矩阵的形状和通道数或其中之一。C++: Mat Mat::reshape(int cn, int rows=0) const参数:cn&– 新的通道数。若cn=0,那么通道数就保持不变。rows&–新的行数。 若rows = 0, 那么行数保持不变。该方法为*this元素创建新的矩阵头。这新的矩阵头尺寸和通道数或其中之一发生改变,在以下的情况任意组合都是有可能的:ü& 新的矩阵没有新增或减少元素。通常,rows*cols*channels()在转换过程中保持一致。.ü& 无数据的复制。也就是说,这是一个复杂度为 O(1)的操作。通常,如果该操作改变行数或透过其他方式改变元素行索引,那么矩阵必定是连续的。参见Mat::isContinuous()。例如,有一存储了STL向量的三维点集,你想用3xN的矩阵来完成下面的操作:std::vector&Point3f&...Mat pointMat = Mat(vec). //把向量转化成Mat, 复杂度为O(1)的运算reshape(1). // 从Nx1的3通道矩阵得出Nx3 的单通道矩阵//同样是复杂度为O(1)的运算t(); // 最后转置Nx3 的矩阵//这个过程要复制所有的元素Mat::t转置矩阵。.C++: MatExpr Mat::t() const该
方法通过矩阵表达式(matrix expression)实现矩阵的转置The method performs matrix
transposition by means of matrix expressions.
它并未真正完成了转置但却返回一个临时的可以进一步用在更复杂的矩阵表达式中或赋给一个矩阵的转置矩阵对象:Mat A1 = A + Mat::eye(A.size(), A.type)*Mat C = A1.t()*A1; //计算(A + lambda*I)^t * (A + lamda*I).Mat::inv反转矩阵C++: MatExpr Mat::inv(int method=DECOMP_LU) const参数:method&– 反转矩阵的方法。有以下几种可能的值:– DECOMP_LU是 LU 分解一定不能是单数的。– DECOMP_CHOLESKY 是 Cholesky LLT只适用于对称正矩阵的分解。该类型在处理大的矩阵时的速度是LU的两倍左右。– DECOMP_SVD是 SVD 分解。如果矩阵是单数或甚至不是2维,函数就会计算伪反转矩阵。该方法执行矩阵的反转矩阵表达。这意味着该方法返回一个临时矩阵反转对象并可进一步用于更复杂的矩阵表达式的中或分配给一个矩阵。Mat::mul执行两个矩阵按元素相乘或这两个矩阵的除法。C++: MatExpr Mat::mul(InputArray m, double scale=1) const参数:m&– 与*this具有相同类型和大小的矩阵,或矩阵表达式。scale&– 可选缩放系数。该方法返回一个用可选的缩放比率编码了每个元素的数组乘法的临时的对象。 注意:这不是一个对应“*”运算符的简单的矩阵乘法。.例::Mat C = A.mul(5/B); // 等价于divide(A, B, C, 5)Mat::cross计算3元素向量的一个叉乘积。C++: Mat Mat::cross(InputArray m) const参数:m&–另一个叉乘操作对象。该方法计算了两个3元素向量的叉乘的积被操作向量必须是3元素浮点型的具有相同形状和尺寸的向量。结果也是一语被操作对象的具有相同形状和大小的浮点型3元素向量。Mat::dot计算两向量的点乘。C++: double Mat::dot(InputArray m) const参数:m&–另一个点积操作对象。方法计算两个矩阵的点积。如果矩阵不单列或单行的向量,用顶部到底部从左到右扫描次序将它们视为 1 D向量。这些向量必须具有相同的大小和类型。如果矩阵有多个通道,从所有通道得到的点积会被加在一起。Mat::zeros返回指定的大小和类型的零数组。C++: static MatExpr Mat::zeros(int rows, int cols, int type)C++: static MatExpr Mat::zeros(Size size, int type)C++: static MatExpr Mat::zeros(int ndims, const int* sizes, int type)参数ndims&– 数组的维数。rows–行数。cols &–列数。size–替代矩阵大小规格Size(cols, rows)的方法。sizes– 指定数组的形状的整数数组。type– 创建的矩阵的类型。该方法返回一个 Matlab 式的零数组初始值设定项。它可以用于快速形成一个常数数组作为函数参数,作为矩阵的表达式或矩阵初始值设定项的一部分。Mat A;A = Mat::zeros (3,3,CV_32F);在上面的示例中,只要A不是 3 x 3浮点矩阵它就会被分配新的矩阵。否则为现有的矩阵 A填充零。Mat::ones返回一个指定的大小和类型的全为1的数组。C++: static MatExpr Mat::ones(int rows, int cols, int type)C++: static MatExpr Mat::ones(Size size, int type)C++: static MatExpr Mat::ones(int ndims, const int* sizes, int type)参数:ndims&–数组的维数。rows&–行数。.cols&–列数。size&–替代矩阵大小规格Size(cols, rows)的方法。sizes&–指定数组的形状的整数数组。type&–创建的矩阵的类型。该方法返回一个 Matlab 样式 1 的数组初始值设定项,类似Mat::zeros()。请注意,这种方法中你可以使用任意一个值和Matlab 语法初始化数组如下:Mat A = Mat::ones (100,100,CV_8U) * 3 ;/ / 使100 x 100 矩阵里充满 3。上述操作不会形成一个 100 x 100 1 的矩阵,然后乘以 3。相反,它只是记住缩放因子(在本例中 3)在实际调用矩阵初始值设定项时使用它。class CV_EXPORTS Mat
// constructors
// constructs matrix of the specified size and type
// (_type is CV_8UC1, CV_64FC3, CV_32SC(12) etc.)
Mat(int _rows, int _cols, int _type);
Mat(Size _size, int _type);
// constucts matrix and fills it with the specified value _s.
Mat(int _rows, int _cols, int _type, const Scalar& _s);
Mat(Size _size, int _type, const Scalar& _s);
// copy constructor
Mat(const Mat& m);
// constructor for matrix headers pointing to user-allocated data
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_STEP);
// creates a matrix header for a part of the bigger matrix
Mat(const Mat& m, const Range& rowRange, const Range& colRange);
Mat(const Mat& m, const Rect& roi);
// converts old-style CvM the data is not copied by default
Mat(const CvMat* m, bool copyData=false);
// converts old-style IplIma the data is not copied by default
Mat(const IplImage* img, bool copyData=false);
// builds matrix from std::vector with or without copying the data
template&typename _Tp& explicit Mat(const vector&_Tp&& vec, bool copyData=false);
// helper constructor to compile matrix expressions
Mat(const MatExpr_Base& expr);
// destructor - calls release()
// assignment operators
Mat& operator = (const Mat& m);
Mat& operator = (const MatExpr_Base& expr);
operator MatExpr_&Mat, Mat&() const;
// returns a new matrix header for the specified row
Mat row(int y) const;
// returns a new matrix header for the specified column
Mat col(int x) const;
// ... for the specified row span
Mat rowRange(int startrow, int endrow) const;
Mat rowRange(const Range& r) const;
// ... for the specified column span
Mat colRange(int startcol, int endcol) const;
Mat colRange(const Range& r) const;
// ... for the specified diagonal
// (d=0 - the main diagonal,
&0 - a diagonal from the lower half,
&0 - a diagonal from the upper half)
Mat diag(int d=0) const;
// constructs a square diagonal matrix which main diagonal is vector "d"
static Mat diag(const Mat& d);
// returns deep copy of the matrix, i.e. the data is copied
Mat clone() const;
// copies the matrix content to "m".
// It calls m.create(this-&size(), this-&type()).
void copyTo( Mat& m ) const;
// copies those matrix elements to "m" that are marked with non-zero mask elements.
void copyTo( Mat& m, const Mat& mask ) const;
// converts matrix to another datatype with optional scalng. See cvConvertScale.
void convertTo( Mat& m, int rtype, double alpha=1, double beta=0 ) const;
void assignTo( Mat& m, int type=-1 ) const;
// sets every matrix element to s
Mat& operator = (const Scalar& s);
// sets some of the matrix elements to s, according to the mask
Mat& setTo(const Scalar& s, const Mat& mask=Mat());
// creates alternative matrix header for the same data, with different
// number of channels and/or different number of rows. see cvReshape.
Mat reshape(int _cn, int _rows=0) const;
// matrix transposition by means of matrix expressions
MatExpr_&MatExpr_Op2_&Mat, double, Mat, MatOp_T_&Mat& &, Mat&
t() const;
// matrix inversion by means of matrix expressions
MatExpr_&MatExpr_Op2_&Mat, int, Mat, MatOp_Inv_&Mat& &, Mat&
inv(int method=DECOMP_LU) const;
MatExpr_&MatExpr_Op4_&Mat, Mat, double, char, Mat, MatOp_MulDiv_&Mat& &, Mat&
// per-element matrix multiplication by means of matrix expressions
mul(const Mat& m, double scale=1) const;
MatExpr_&MatExpr_Op4_&Mat, Mat, double, char, Mat, MatOp_MulDiv_&Mat& &, Mat&
mul(const MatExpr_&MatExpr_Op2_&Mat, double, Mat, MatOp_Scale_&Mat& &, Mat&& m, double scale=1) const;
MatExpr_&MatExpr_Op4_&Mat, Mat, double, char, Mat, MatOp_MulDiv_&Mat& &, Mat&
mul(const MatExpr_&MatExpr_Op2_&Mat, double, Mat, MatOp_DivRS_&Mat& &, Mat&& m, double scale=1) const;
// computes cross-product of 2 3D vectors
Mat cross(const Mat& m) const;
// computes dot-product
double dot(const Mat& m) const;
// Matlab-style matrix initialization
static MatExpr_Initializer zeros(int rows, int cols, int type);
static MatExpr_Initializer zeros(Size size, int type);
static MatExpr_Initializer ones(int rows, int cols, int type);
static MatExpr_Initializer ones(Size size, int type);
static MatExpr_Initializer eye(int rows, int cols, int type);
static MatExpr_Initializer eye(Size size, int type);
// allocates new matrix data unless the matrix already has specified size and type.
// previous data is unreferenced if needed.
void create(int _rows, int _cols, int _type);
void create(Size _size, int _type);
// increases t use with care to avoid memleaks
void addref();
// decreas
// deallocate the data when reference counter reaches 0.
void release();
// locates matrix header within a parent matrix. See below
void locateROI( Size& wholeSize, Point& ofs ) const;
// moves/resizes the current matrix ROI inside the parent matrix.
Mat& adjustROI( int dtop, int dbottom, int dleft, int dright );
// extracts a rectangular sub-matrix
// (this is a generalized form of row, rowRange etc.)
Mat operator()( Range rowRange, Range colRange ) const;
Mat operator()( const Rect& roi ) const;
// converts header to CvM no data is copied
operator CvMat() const;
// converts header to IplI no data is copied
operator IplImage() const;
// returns true iff the matrix data is continuous
// (i.e. when there are no gaps between successive rows).
// similar to CV_IS_MAT_CONT(cvmat-&type)
bool isContinuous() const;
// returns element size in bytes,
// similar to CV_ELEM_SIZE(cvmat-&type)
size_t elemSize() const;
// returns the size of element channel in bytes.
size_t elemSize1() const;
// returns element type, similar to CV_MAT_TYPE(cvmat-&type)
int type() const;
// returns element type, similar to CV_MAT_DEPTH(cvmat-&type)
int depth() const;
// returns element type, similar to CV_MAT_CN(cvmat-&type)
int channels() const;
// returns step/elemSize1()
size_t step1() const;
// returns matrix size:
// width == number of columns, height == number of rows
Size size() const;
// returns true if matrix data is NULL
bool empty() const;
// returns pointer to y-th row
uchar* ptr(int y=0);
const uchar* ptr(int y=0) const;
// template version of the above method
template&typename _Tp& _Tp* ptr(int y=0);
template&typename _Tp& const _Tp* ptr(int y=0) const;
// template methods for read-write or read-only element access.
// note that _Tp must match the actual matrix type -
// the functions do not do any on-fly type conversion
template&typename _Tp& _Tp& at(int y, int x);
template&typename _Tp& _Tp& at(Point pt);
template&typename _Tp& const _Tp& at(int y, int x) const;
template&typename _Tp& const _Tp& at(Point pt) const;
// template methods for iteration over matrix elements.
// the iterators take care of skipping gaps in the end of rows (if any)
template&typename _Tp& MatIterator_&_Tp& begin();
template&typename _Tp& MatIterator_&_Tp& end();
template&typename _Tp& MatConstIterator_&_Tp& begin() const;
template&typename _Tp& MatConstIterator_&_Tp& end() const;
enum { MAGIC_VAL=0x42FF0000, AUTO_STEP=0, CONTINUOUS_FLAG=CV_MAT_CONT_FLAG };
// includes several bit-fields:
* the magic signature
* continuity flag
* number of channels
int flags;
// the number of rows and columns
int rows, cols;
// a distance between succ includes the gap if any
size_t step;
// pointer to the data
uchar* data;
// pointer to t
// when matrix points to user-allocated data, the pointer is NULL
int* refcount;
// helper fields used in locateROI and adjustROI
uchar* datastart;
uchar* dataend;
阅读(4509)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_',
blogTitle:'OpenCV中常见的与图像操作有关的数据容器有Mat,cvMat和IplImage',
blogAbstract:'\t由于在写上一篇图像的数据结构时,发现自己只知道CvMat,竟然还有Mat数据结构,真是无知了,看了这么多程序,貌似没有看到这个结构。有可能那些程序都是些老版本的例子,这是在2.0以后加上的,所以我也得紧跟呀!以下是自己的学习心得。。。。\n一、Mat简介\n&& &在2001年刚刚出现的时候,OpenCV基于 C 语言接口而建。为了在内存(memory)中存放图像,当时采用名为 IplImage 的C语言结构体,时至今日这仍出现在大多数的旧版教程和教学材料。但这种方法必须接受C语言',
blogTag:'opencv应用,转载',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:2,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'阳光男孩不久将走进社会了,他也不知道自己要做的是什么事情,困惑迷茫困扰着他,他要去面对还有三年的大学生活,2.3.4,一组平凡的数字,hpu一个平凡的2批本科院校,脚下的路延伸到哪里,谁知道?除了用年轻的激情和澎湃的血液去迎接未来,张阳一个平凡人,爱情的奢望用远也不可以得到',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}

我要回帖

更多关于 opencv resize 的文章

 

随机推荐