OPenCV3.2中Mat对象常用函数属性总结
OpenCV的Mat数据格式及其遍历的程序资料说明
OpenCV 的Mat 数据格式及其遍历的程序资料说明
在opencv 早期的版本中,图像通过一个叫做IplImage 的结构(structure)存储在内存中。
由于C 语言对程序员高度的信任,因此它需要手动地对内存
进行管理,比如内存的分配和回收,这在大型程序设计中是比较麻烦的。
幸
运地是,C++可以很好地帮助程序员管理内存,因此opencv2.0 后就引入了
C++接口。
但是C++也有缺点,比如说目前大部分的嵌入式系统只支持C 语言,在这些平台上开发opencv 程序的话用C++就不是很好。
cv::Mat 是一个C++类,包含两部分:1)Matrix header,包括矩阵的size、存储方式、矩阵的存储地址等信息;2)指向Marix 的指针ji。
由于图
像处理算法通常都是计算密集型算法,出于程序速度上的考虑,opencv 的设
计应尽可能地避免拷贝大图像,为了解决这个问题,opencv 使用了引用计数
机制(reference counter system)【python 也使用了这个机制,参考之前的博客】。
简单来说,灭个Mat 对象都有自己的header,在进行copy 运算时,只
有headers 和指向矩阵的指针会被拷贝,而矩阵本身不会被拷贝,举个栗子:
上面的三个Mat 对象srcImg,dstImg,C 最终都只想同一个数据矩阵,虽然
它们的headers 是不同的。
对它们其中的任意一个进行修改都会影响另外两个对象。
上面程序的运行结果如图:
当然,如果想拷贝矩阵本身也是有办法的,opencv 提供了两个方法:。
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);。
CV::Mat介绍
CV::Mat介绍cv::Mat是OpenCV2和OpenCV3中基本的数据类型,在cv::Mat类中,关于cv::Mat的定义和初始化有多种不同的形式,这⾥,将对其进⾏详尽的总结和介绍。
⼀、⽆数据拷贝的cv::Mat的定义和初始化1、默认形式cv::Mat m;2、指定类型和⼤⼩(⾏列)的⼆维数组cv::Mat m(int rows, int cols, int type);3、有初始化值的指定类型和⼤⼩(⾏列)的⼆维数组cv::Mat m(int rows, int cols, int type, const Scalar& s);4、使⽤预先存在数据定义的指定类型和⼤⼩(⾏列)的⼆维数组cv::Mat m(int rows, int cols, int type, void* data, size_t step = AUTO_STEP);5、指定⼤⼩(size)和类型的⼆维数组cv::Mat m(cv::Size sz, int type, const Scalar& s);6、使⽤预先存在的数据定义的指定⼤⼩(size)和类型的⼆维数组cv::Mat m(cv::Size sz, int type, void* data, size_t step = AUTO_STEP);7、指定类型的多维数组cv::Mat m(int ndims, const int* sizes, int type);8、有初始化值的指定类型多维数组cv::Mat m(int ndims, const int* sizes, int type, const Scalar& s);9、使⽤预先存在的数据定义的指定类型的多维数组cv::Mat m(int ndims, const int* sizes, int type, void* data, size_t step = AUTO_STEP);⼆、从其他cv::Mat进⾏数据拷贝的定义和初始化1、拷贝构造形式cv::Mat m(const cv::Mat& mat);2、指定⾏列范围的拷贝构造cv::Mat m(const cv::Mat& mat, const cv::Range& rows, const cv::Range& cols);3、指定ROI的拷贝构造cv::Mat m(const cv::Mat& mat, const cv::Rect& roi);4、使⽤多维数组中指定范围内的数据的拷贝构造cv::Mat(const cv::Mat& mat, const cv::Range* ranges);三、使⽤OpenCV中的模板进⾏定义和初始化1、使⽤cv::Vec定义相同类型、⼤⼩为n的⼀维数组cv::Mat m(const cv::Vec<T, n>& vec, bool = copyData = true);2、使⽤cv::Matx定义相同类型、⼤⼩为mxn的⼆维数组cv::Mat(const cv::Matx<T, m, n>& vec, bool copyData = true);3、使⽤STL vector定义相同类型的⼀维数组cv::Mat(const std::vector<T>& vec, bool copyData = true);四、直接使⽤静态函数创建cv::Mat1、使⽤zeros()函数定义指定⼤⼩和类型的cv::Mat(全为0)cv::Mat m = cv::Mat::zeros(int rows, int cols, int type);2、使⽤ones()函数定义指定⼤⼩和类型的cv::Mat(全为0)cv::Mat m = cv::Mat::ones(int rows, int cols, int type);3、使⽤eye()函数定义指定⼤⼩和类型的cv::Mat(恒等矩阵)cv::Mat m = cv::Mat::eye(int rows, int cols, int type);五. IplImage与CV::Mat之间的转换A. 将IplImage-----> Mat类型Mat::Mat(const IplImage* img, bool copyData=false);默认情况下,新的Mat类型与原来的IplImage类型共享图像数据,转换只是创建⼀个Mat矩阵头。
OPENCV对于Mat的理解和操作
OPENCV对于Mat的理解和操作1,Mat 是⽤来存储图⽚的数据他会把图⽚变成矩阵Mat src;int main(int argc, char** argv){src = imread("F:\\视觉\\opencv\\pic\\MatTest.png");//读图⽚cout << "灰度化后" << endl;cout << src << endl;}矩阵的格式如下图⽚时这样的:⽤dos显⽰是这样的灰度化之后是这样的怎么样是不是看上去有点熟悉没错,灰度化后直接把每个位置的像素的值,组成⼀个矩阵,⽽没有灰度化时是如图⼀所⽰。
2,Mat获取某⼀点坐标的值cout << (int)src.ptr<uchar>(1)[1] << endl;锐化的案例:int cols = (src.cols-1)*src.channels();int rows = src.rows;int channels = src.channels();int offsetx = src.channels();Mat dst1 = Mat::zeros(src.size(), src.type());for (int row = 1; row < (rows - 1); row++){const uchar* previous = src.ptr<uchar>(row - 1);const uchar* current = src.ptr<uchar>(row);const uchar* next = src.ptr<uchar>(row + 1);uchar* output = dst1.ptr<uchar>(row);for (int col = offsetx; col < cols; col++) {output[col] = saturate_cast<uchar>(5 * current[col] - (current[col - offsetx] + current[col + offsetx] + previous[col] + next[col])); }}imshow("锐化转化后", dst1);src.ptr<uchar>(row);是获取第⼏⾏的指针src.ptr<uchar>(1)[1];默认是char类型,所以要转成int类型输出才能看得到,不然会输出Hex码表对于的字符信息。
mat(mat m, rect roi)用法
mat(mat m, rect roi)用法您提到的`mat(mat m, rect roi)` 看起来像是OpenCV 中`cv::Mat` 类的构造函数的一部分,但它实际上并不完全正确。
在 OpenCV 中,`cv::Mat` 是所有矩阵/图像数据的基类。
这个类有许多构造函数,其中一些允许您创建一个新的 `cv::Mat` 对象,该对象是另一个 `cv::Mat` 对象的子集(或称为“ROI”或“Region of Interest”)。
以下是几个相关构造函数:1. `cv::Mat::Mat(const Mat& m, const Rect& roi)`* 这个构造函数从给定的 `cv::Mat` 对象 `m` 中创建一个子矩阵,该子矩阵由 `roi`(矩形区域)定义。
* 参数 `m` 是原始矩阵,而 `roi` 是一个 `cv::Rect` 对象,它定义了子矩阵的边界矩形。
2. `cv::Mat::Mat(const Mat& m, const Range& rowRange, const Range& colRange)`* 这个构造函数从给定的 `cv::Mat` 对象 `m` 中创建一个子矩阵,该子矩阵由行范围和列范围定义。
* 参数 `m` 是原始矩阵,而 `rowRange` 和 `colRange` 是`cv::Range` 对象,分别定义了子矩阵的行范围和列范围。
例如:```cppcv::Mat image = cv::imread("path_to_image.jpg");cv::Rect roi(100, 100, 200, 200); // x, y, width, height cv::Mat subimage = image(roi); // 从image中提取一个矩形区域```在上面的例子中,我们从图像中提取了一个从 (100, 100) 开始,宽度和高度都为 200 的矩形区域。
opencv mat类运算
opencv mat类运算OpenCVMat类是OpenCV中最基本的数据类型之一。
它代表一个多维数组,可以用于存储图像、矩阵、点云等数据。
在实际应用中,我们经常需要对Mat对象进行各种运算,本文将介绍一些常用的Mat 类运算。
1. Mat对象的创建和初始化在使用Mat对象之前,我们需要创建它并对其进行初始化。
创建Mat对象的方法如下:Mat image;//创建一个空的Mat对象Mat image(rows,cols,type);//创建指定大小和类型的Mat对象其中,rows表示矩阵的行数,cols表示矩阵的列数,type表示矩阵的数据类型,常用的类型有CV_8UC1(8位无符号单通道)、CV_8UC3(8位无符号三通道)、CV_32FC1(32位浮点单通道)等。
Mat对象的初始化可以通过赋值、拷贝、从文件读取等方式进行。
2. Mat对象的运算Mat对象支持各种数学运算,包括加、减、乘、除、逻辑运算等。
下面以加法运算为例,介绍Mat对象的运算。
Mat a(rows,cols,CV_8UC1,Scalar(1));//创建一个大小为rows*cols,类型为CV_8UC1,值为1的Mat对象Mat b(rows,cols,CV_8UC1,Scalar(2));//创建一个大小为rows*cols,类型为CV_8UC1,值为2的Mat对象Mat result = a + b;//将a和b相加,结果保存在result中在进行运算时,需要注意Mat对象的大小和数据类型必须相同,否则会导致运算失败。
此外,Mat对象的运算速度较慢,应尽量避免在循环中使用。
3. Mat对象的转换Mat对象可以进行类型转换和通道分离,以便在不同的应用场景中使用。
下面以类型转换为例,介绍Mat对象的转换。
Mat a(rows,cols,CV_8UC1,Scalar(1));//创建一个大小为rows*cols,类型为CV_8UC1,值为1的Mat对象Mat b;//创建一个空的Mat对象a.convertTo(b, CV_32FC1);//将a转换为CV_32FC1类型,结果保存在b中在进行类型转换时,需要注意目标类型应该能够容纳源类型的值,否则会丢失精度。
mat常用函数
mat常用函数MATLAB是一种流行的数学软件,广泛应用于科学、工程、金融等领域。
它提供了许多常用的函数,用于数据处理、图像处理、信号处理等各种应用。
本文将介绍一些MATLAB常用的函数及其应用。
1. linspace函数linspace函数用于生成指定区间内的等间隔向量。
它的用法为:```x = linspace(start, end, n)```其中,start和end分别表示区间的起始值和终止值,n表示向量的长度。
linspace函数可以用于生成等间隔的时间序列,或者在一定范围内均匀采样。
2. numel函数numel函数用于计算数组的元素个数。
它的用法为:```n = numel(array)```其中,array表示输入的数组。
numel函数对于多维数组也适用,可以用于计算矩阵的总元素个数。
3. max函数和min函数max函数和min函数分别用于计算数组或矩阵的最大值和最小值。
它们的用法为:```m = max(array)n = min(array)```其中,array表示输入的数组或矩阵。
max函数和min函数可以用于查找数据集中的最大值和最小值,帮助我们分析数据的特征。
4. mean函数和median函数mean函数用于计算数组或矩阵的平均值,而median函数用于计算数组或矩阵的中位数。
它们的用法为:```m = mean(array)n = median(array)```其中,array表示输入的数组或矩阵。
mean函数和median函数可以用于描述数据的集中趋势,帮助我们了解数据的分布情况。
5. sort函数sort函数用于对数组或矩阵进行排序。
它的用法为:```sorted_array = sort(array)```其中,array表示输入的数组或矩阵。
sort函数可以按照升序将数据进行排序,帮助我们对数据进行整理和分析。
6. find函数find函数用于查找数组或矩阵中满足条件的元素的索引。
OpenCV中Mat总结
OpenCV中Mat总结⼀、数字图像存储概述数字图像存储时,我们存储的是图像每个像素点的数值,对应的是⼀个数字矩阵。
⼆、Mat的存储1、OpenCV1基于C接⼝定义的图像存储格式IplImage*,直接暴露内存,如果忘记释放内存,就会造成内存泄漏。
2、从OpenCV2开始,开始使⽤Mat类存储图像,具有以下优势:(1)图像的内存分配和释放由Mat类⾃动管理(2)Mat类由两部分数据组成:矩阵头(包含矩阵尺⼨、存储⽅法、存储地址等)和⼀个指向存储所有像素值的矩阵(根据所选存储⽅法的不同,矩阵可以是不同的维数)的指针。
Mat在进⾏赋值和拷贝时,只复制矩阵头,⽽不复制矩阵,提⾼效率。
如果矩阵属于多个Mat对象,则通过引⽤计数来判断,当最后⼀个使⽤它的对象,则负责释放矩阵。
(3)可以使⽤clone和copyTo函数,不仅复制矩阵头还复制矩阵。
三、Mat创建1、使⽤Mat构造函数Mat test(2,2,CV_8UC3,Scalar(0,0,255));2、使⽤Mat构造函数2int sizes[3] = {2,2,2};Mat test(3,sizes,CV_8UC3,Scalar::all(0));3、为已存在的IplImage指针创建信息头IplImage* img = cvLoadImage("1.jpg",1);Mat test(img);4、利⽤create函数Mat test;test.create(4,4,CV_8UC2);5、采⽤Matlab形式的初始化⽅式(1)Mat me = Mat::eye(4,4,CV_64F);(2)Mat mo = Mat::ones(2,2,CV_32F);(3)Mat mz = Mat::zeros(3,3,CV_8UC1);注:元素类型,即CV_[位数][带符号与否][类型前缀]C[通道数]四、Mat中相关成员的意义1、dataMat对象中的⼀个指针,指向存放矩阵数据的内存(uchar* data)2、dims矩阵的维度,3*4的矩阵维度为2维,3*4*5的矩阵维度为3维3、channels矩阵通道,矩阵中的每⼀个矩阵元素拥有的值的个数,⽐如说 3 * 4 矩阵中⼀共 12 个元素,如果每个元素有三个值,那么就说这个矩阵是 3通道的,即 channels = 3。
opencv mat 运算符 操作 详解
在 OpenCV 中,cv::Mat类型是表示矩阵(图像)的核心数据结构。
它支持各种矩阵运算和操作,可以进行像素级别的图像处理和计算。
以下是一些常见的cv::Mat运算符和操作的详解:
创建cv::Mat对象:
1.创建空白矩阵:
2.通过数据创建矩阵:
3.复制矩阵:
基本运算:
1.矩阵加法:
2.矩阵减法:
3.矩阵乘法:
4.标量乘法:
逐元素运算:
1.逐元素加法:
2.逐元素减法:
3.逐元素乘法:
4.逐元素除法:
转置和翻转:
1.矩阵转置:
2.水平翻转:
3.垂直翻转:
其他操作:
1.矩阵元素访问:
2.改变矩阵大小:
3.提取子矩阵:
4.通道拆分与合并:
这些是一些常见的cv::Mat运算符和操作的示例。
OpenCV 提供了丰富的功能,允许进行更复杂的图像处理和计算。
具体的操作和运算可以根据具体需求进行查阅OpenCV 文档。
opencv mat 尺寸
opencv mat 尺寸让我们了解一下Mat类的尺寸属性是如何表示的。
在OpenCV中,Mat类的尺寸由两个整数值表示,分别是行数和列数。
行数通常表示图像的高度,列数表示图像的宽度。
例如,一个尺寸为640x480的图像意味着图像的高度为640个像素,宽度为480个像素。
在实际的图像处理和计算机视觉任务中,我们经常需要获取和修改图像的尺寸。
为了获取图像的尺寸,我们可以使用Mat类的成员函数rows()和cols()来获取图像的行数和列数。
例如,对于一个名为image的Mat对象,我们可以使用image.rows()和image.cols()来分别获取图像的行数和列数。
同样,我们也可以使用这两个成员函数来修改图像的尺寸。
通过将期望的行数和列数作为参数传递给Mat类的成员函数resize(),我们可以实现对图像尺寸的调整。
在图像处理和计算机视觉任务中,对图像尺寸的调整是非常常见的操作。
例如,当我们需要将一组图像进行拼接时,我们通常需要将它们的尺寸调整为相同的大小。
我们可以使用OpenCV中的resize()函数来实现这一目标。
通过将目标图像的尺寸作为参数传递给resize()函数,我们可以将所有图像调整为相同的尺寸。
这样做有助于使图像在进行拼接或其他处理操作时保持一致。
除了调整图像的尺寸外,Mat类的尺寸属性还可以用于图像的裁剪和缩放。
对于图像的裁剪,我们可以通过修改图像的尺寸来实现。
通过将期望的裁剪尺寸作为参数传递给Mat类的resize()函数,我们可以实现对图像的裁剪。
对于图像的缩放,我们可以通过调整图像的尺寸来实现。
通过将期望的缩放尺寸作为参数传递给resize()函数,我们可以实现对图像的缩放。
除了上述应用之外,图像的尺寸属性还可以用于计算图像的面积和长宽比。
通过将图像的行数和列数相乘,我们可以得到图像的总像素数,从而计算出图像的面积。
而通过将图像的行数除以列数,我们可以得到图像的长宽比。
opencv mat 构造函数
一、介绍opencv mat 构造函数opencv是一个开源计算机视觉库,提供了丰富的图像处理和计算机视觉功能。
在opencv中,mat是一个非常重要的类,代表了二维矩阵,可以用来表示图像和其他的二维数据。
在实际应用中,我们经常需要使用opencv mat类来创建、操作和处理图像数据。
而opencv mat类的构造函数则是创建mat对象的重要方法之一。
二、opencv mat 构造函数的基本用法在opencv中,mat类的构造函数有多种重载形式,可以用来创建不同类型和尺寸的mat对象。
下面我们来介绍一些常用的opencv mat构造函数的基本用法。
1.构造一个空的mat对象当我们需要创建一个空的mat对象时,可以使用默认构造函数来实现。
```cppcv::Mat emptyMat;```上面的代码创建了一个空的mat对象emptyMat,该对象不包含任何数据,但已经分配了相应的内存空间。
2.通过指定尺寸和类型创建mat对象在实际应用中,我们经常需要根据图像的尺寸和数据类型来创建mat对象。
在opencv中,可以使用以下构造函数来实现。
```cppcv::Mat imageMat(rows, cols, type);```其中,rows和cols分别表示mat对象的行数和列数,type表示mat 对象的数据类型。
通过这种方式可以方便地创建指定尺寸和数据类型的mat对象。
3.通过指定初始值创建mat对象有时候,我们需要创建一个初始值已经赋值的mat对象。
在opencv 中,可以使用以下构造函数来实现。
```cppcv::Mat onesMat = cv::Mat::ones(rows, cols, type);```该构造函数可以创建一个所有元素都为指定值的mat对象。
这在一些图像处理操作中非常有用。
4.通过直接赋值创建mat对象除了上述的构造函数外,我们还可以通过直接赋值的方式来创建mat 对象。
OpenCV中与matlab中相对应的函数
OpenCV中与matlab中相对应的函数OpenCV中与matlab中相对应的函数1、matlab中的imread相当于OpenCV中的cvLoadImage(imageName, CV_LOAD_IAMGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR):读出的图像信息保持了原有图像的信息(包括通道信息和位深信息);rgb2gray相当于cvLoadImage(imageName, CV_LOAD_IMAGE_GRAYSCALE):单通道灰度图;或用cvCreateImage、cvCvtColor两函数实现图像的灰度化。
2、matlab中的zeros函数相当于OpenCV中的cvSetZero函数。
3、matlab中的两矩阵点乘 .* 相当于OpenCV中的cvMul函数。
4、matlab中的两矩阵点除 ./ 相当于OpenCV中的cvDiv函数。
5、matlab中的两矩阵相加 + 相当于OpenCV中的cvAdd函数。
6、matlab中的两矩阵相减 - 相当于OpenCV中的cvSub函数。
7、matlab中的矩阵和一个常量相加 A + a 相当于OpenCV中的cvAddS函数 cvAdds(matA, cvScalar(a), matB)。
8、matlab中的矩阵和一个常量相减 A - a 相当于OpenCV中的cvSubS函数 cvSubS(matA, cvScalar(a), matB)。
9、matlab中的给矩阵赋一初值 A(:, :) = a 相当于OpenCV中的cvSet函数 cvSet(matA, cvScalar(a))。
10、matlab中取矩阵某一部分赋给另一矩阵 A = B(i : j, m : n) 相当于OpenCV中的cvGetSubRect 函数,cvGetSubRect(mat1, mat2, rect)。
11、matlab中取矩阵最大值、最小值max(max(A))、min(min(A)) 相当于OpenCV中的cvMinMaxLoc函数cvMinMaxLoc(A, minloc, maxloc)。
pencv中mat的数学运算和基本操作
pencv中mat的数学运算和基本操作在OpenCV中,Mat是一个多维数组,被广泛用于图像处理和计算机视觉领域。
Mat类提供了各种数学运算和基本操作,用于处理图像的像素值、形状和数据类型等。
1.创建和初始化Mat对象:Mat可以通过多种方法进行创建和初始化。
常见的方法包括:-使用默认构造函数创建一个空的Mat对象:Mat()-使用指定的行数、列数和数据类型创建一个Mat对象:Mat(int rows, int cols, int type)-复制一个已有的Mat对象:Mat(Mat m)-从数组、向量或指针初始化Mat对象:Mat(int rows, int cols, int type, void* data)2.访问和修改元素:可以使用at()方法或操作符()来访问和修改Mat对象的元素。
at()方法具有边界检查,而操作符()没有。
例如:-获取指定位置的像素值:int value = mat.at<int>(row, col);-修改指定位置的像素值:mat.at<int>(row, col) = newValue;3.像素值的常见运算:Mat对象可以进行各种常见的数学运算,包括像素值的加法、减法、乘法和除法。
这些运算可以对整个图像进行,也可以对指定区域进行。
例如:-对整个图像进行像素值加法:mat1 = mat1 + mat2;-对指定区域进行像素值减法:mat1(Rect(x, y, width, height)) -= Scalar(b, g, r);4.形状和尺寸操作:Mat对象提供了各种方法来获取和修改图像的形状和尺寸。
常见的方法包括:-获取图像的行数和列数:int rows = mat.rows; int cols = mat.cols;-获取图像的尺寸:Size size = mat.size();-修改图像的尺寸:mat.resize(height, width);-转置图像:mat = mat.t();5.通道操作:对于多通道的图像,Mat对象还提供了通道的操作方法。
opencv常用函数
opencv常用函数OpenCV是一款开源的计算机视觉库,其中提供了许多常用的函数,可以用于图像处理,机器视觉等领域。
下面就介绍一些OpenCV中常用的函数:1.cv::Mat函数:它是OpenCV中最常用的函数,用于表示图像的像素信息。
它是一种多维数组,可以用来存放像素值。
2.cv::imread函数:它用于读取图像文件,并将其转换成cv::Mat格式的对象。
3.cv::imshow函数:它用于将读取的图像显示出来,以便可以查看其内容。
4.cv::cvtColor函数:它用于将图像从一种颜色空间转换到另一种颜色空间,例如从灰度图像转换为彩色图像。
5.cv::GaussianBlur函数:它用于对图像进行高斯模糊处理,可以有效地去除噪声,平滑图像。
6.cv::Sobel函数:它用于实现Sobel算子,用于检测图像中的边缘。
7.cv::threshold函数:它用于将图像中的像素值转换为二值图像,以便更容易识别图像中的物体。
8.cv::findContours函数:它用于在二值图像中查找轮廓,可以用于物体检测和跟踪。
9.cv::HoughLines函数:它用于检测图像中的直线,可以用于检测图像中的线条。
10.cv::calcHist函数:它用于计算图像的直方图,以便可以更好地了解图像的特征。
11.cv::kmeans函数:它用于对图像进行聚类,可以将图像分割成不同的区域,以便进行进一步的处理。
12.cv::rectangle函数:它用于在图像中画出矩形,可以用于标注图像中的物体,或者实现图像裁剪。
以上就是OpenCV中常用的一些函数,它们可以帮助我们快速实现一些复杂的图像处理任务。
cv::Mat构造函数说明
cv::Mat构造函数说明#include <opencv2/core/mat.hpp>构造函数列表:()(int , int , int )( , int )(int , int , int , const &s)( , int , const &s)(int ndims, const int *sizes, int )(const std::vector< int > &sizes, int )(int ndims, const int *sizes, int , const &s)(const std::vector< int > &sizes, int , const &s)(const &m)(int , int , int , void *, size_t =)( , int , void *, size_t =)(int ndims, const int *sizes, int , void *, const size_t *steps=0)(const std::vector< int > &sizes, int , void *, const size_t *steps=0)(const &m, const &, const &=())(const &m, const &roi)(const &m, const *ranges)(const &m, const std::vector< > &ranges)template<typename _Tp >(const std::vector< _Tp > &vec, bool copyData=false)template<typename _Tp , int n>(const < _Tp, n > &vec, bool copyData=true)template<typename _Tp , int m, int n>(const < _Tp, m, n > &mtx, bool copyData=true)template<typename _Tp >(const < _Tp > &pt, bool copyData=true)template<typename _Tp >(const < _Tp > &pt, bool copyData=true)template<typename _Tp >(const < _Tp > &commaInitializer)(const &m)cv::Mat::Mat(const Mat& m) (引⽤传参场景)cv::Mat::Mat(const & m)This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. Parametersm Array that (as a whole or partly) is assigned to the constructed matrix. No data is copied by these constructors. Instead, the header pointing to m data or its sub-array is constructed and associated with it. The reference counter, if any, is incremented. So, when you modify the matrix formed using such a constructor, you also modify the corresponding elements of m . If you want to have an independent copy of the sub-array, use Mat::clone() .Mat& operator= (const Mat &m) 赋值运算符重载& (const &m)assignment operatorsThese are available assignment operators. Since they all are very different, make sure to read the operator parameters description. Parametersm Assigned, right-hand-side matrix. Matrix assignment is an O(1) operation. This means that no data is copied but the data is shared and the reference counter, if any, is incremented. Before assigning new data, the old data is de-referenced via Mat::release .通过外部void * data指针构造cv::Mat对象是浅拷贝cv::Mat::Mat( int rows,int cols,int type,void * data,size_t step = )This is an overloaded member function, provided for convenience. It differs from the above function only in what argument(s) it accepts. Parametersrows Number of rows in a 2D array.cols Number of columns in a 2D array.type Array type. Use CV_8UC1, ..., CV_64FC4 to create 1-4 channel matrices, or CV_8UC(n), ..., CV_64FC(n) to create multi-channel (up to CV_CN_MAX channels) matrices.data Pointer to the user data. Matrix constructors that take data and step parameters do not allocate matrix data. Instead, they just initialize the matrix header that points to the specified data, which means that no data is copied. This operation is very efficient and can be used to process external data using OpenCV functions. The external data is not automatically deallocated, so you should take care of it. step Number of bytes each matrix row occupies. The value should include the padding bytes at the end of each row, if any. If the parameter is missing (set to AUTO_STEP ), no padding is assumed and the actual step is calculated as cols*elemSize().See Mat::elemSize.cv::Mat::clone()函数cv::Mat::clone()constCreates a full copy of the array and the underlying data.The method creates a full copy of the array. The original step[] is not taken into account. So, the array copy is a continuous array occupying *elemSize() bytes.参考:。
OpenCV-C++Mat对象的使用
OpenCV-C++Mat对象的使⽤这⼀篇⽂章中主要介绍有关Mat类的使⽤,主要包括:通过构造函数定义Mat对象;Mat对象常⽤属性以及⽅法创建⼀个空⽩图像并进⾏赋值创建⼀个⼩数组通过构造函数定义Mat对象Mat中提供了很多的构造函数,这⾥使⽤两种⽅式:Mat(Size size, int type);Mat(int rows, int cols, int type, const Scalar& s);第⼀种⽅式的⽰例如下:// 1. 通过构造函数定义Mat对象Mat dst = Mat(Size(512, 512), CV_8UC3); // 创建Mat对象dst = Scalar(127, 0, 255); // 填充值// 显⽰图像namedWindow("dst image", WINDOW_AUTOSIZE);imshow("dst image", dst);waitKey(0);结果如下图所⽰:当然,其中构造函数的两个参数也可以来⾃已有Mat对象,如:Mat dst = Mat(src.size(), src.type());第⼆种使⽤构造函数定义Mat对象的⽰例如下:// 2. 通过构造函数定义Mat对象Mat dst = Mat(128, 128, CV_8UC3, Scalar(0, 0, 255));Mat对象常⽤属性以及⽅法1. 展⽰以下Mat对象常⽤的属性:// 1. 通过构造函数定义Mat对象Mat dst = Mat(Size(512, 512), CV_8UC3); // 创建Mat对象dst = Scalar(127, 0, 255); // 填充值// 3. Mat对象常⽤属性int rows = dst.rows; // 获取矩阵⾏int cols = dst.cols; // 获取矩阵列int dims = dst.dims; // 获取矩阵维度printf("rows: %d, cols: %d, dims: %d\n", rows, cols, dims);输出:rows: 128, cols: 128, dims: 2需要注意的是,OpenCV中维度dims与通道channels是两个不同概念:维度dims表⽰矩阵的维度,如上⾯⽰例是128×128⼤⼩的矩阵,它的维度是2;通过channels表⽰矩阵中每个元素有⼏个值,这个⽰例是3个值,通道数为3;ix2. 演⽰⼀些Mat对象常⽤的⽅法:// 4. Mat对象常⽤⽅法int channels = dst.channels(); // 获取矩阵元素通道数int depth = dst.depth(); // 获取每个像素的深度,0: CV_8U, 1: CV_8S,...bool isEmpty = dst.empty();printf("channels: %d, depth: %d, isEmpty: %d \n", channels, depth, isEmpty);输出:channels: 3, depth: 0, isEmpty: 03. 演⽰⼀下如何复制Mat对象分成两种情况,⼀种是对原始对象多了⼀个tmp暂存对象,原始对象改变,tmp对象也改变;另⼀种是完全构造⼀个新Mat对象;第⼀种,有两种⽅式,分别是:使⽤赋值运算符和使⽤Mat类复制构造函数;// 5. 复制Mat对象// 5.1. tmp对象与原始对象绑定Mat tmp = src; // 通过赋值运算符Mat tmp2(src); // 通过复制构造函数第⼆种,通过Mat::clone()与copyTo()⽅法:获得⼀个全新的Mat对象;// 5.2 获得⼀个新的Mat对象Mat dst1 = src.clone();Mat dst2;src.copyTo(dst2);4. .prt访问矩阵元素获取图像第⼀⾏的第⼀个元素:// 6. prt的使⽤const uchar * firstRowElement = src.ptr<uchar>(0);printf("First Row Element: %d\n", *firstRowElement);5. 其他⽅法// 7. 其他⽅法Mat dstOther1 = Mat::zeros(src.size(), src.type()); // 创建全1矩阵Mat dstOther2 = Mat::ones(src.size(), src.type()); // 创建零矩阵Mat dstOther3 = Mat::eye(src.size(), src.type()); // 创建单位矩阵Mat dstOther4 = Mat:: zeros(2, 2, CV_8UC1);创建⼀个空⽩图像并进⾏赋值1. 创建⼀个空⽩图像,并进⾏赋值, ⽅法如下:// 8. 创建空⽩图像并进⾏赋值Mat emptyImage; // 创建Mat对象emptyImage.create(src.size(), src.type());emptyImage = Scalar(0, 0, 255);2. 创建多维数组// 9. 创建多维数组int sz[3] = {3, 2, 2}; // 三维矩阵,3x2x2Mat dstMultiMat(3, sz, CV_8UC1, Scalar::all(0));表⽰创建⼀个三维(3×2×2)的矩阵,通道数为1,并全部以0填充;创建⼩数组⽤于创建⼀些kernel,⽤于图像的掩模计算:// 10. 创建⼩数组Mat smallMat = (Mat_<float>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);cout << smallMat << endl;输出:[0, -1, 0;-1, 5, -1;0, -1, 0]Processing math: 100%。
open cv中的Mat详解
基本上讲 Mat 是一个类,由两个数据部分组成:矩阵头(包含矩阵尺寸,存储方法, 存储地址等信息)和一个指向存储所有像素值的矩阵(根据所选存储方法的不同矩阵可以是 不同的维数)的指针。矩阵头的尺寸是常数值,但矩阵本身的尺寸会依图像的不同而不同,
• CV_8U - 8-bit unsigned integers ( 0..255 )
• CV_8S - 8-bit signed integers ( -128..127 )
• CV_16U - 16-bit unsigned integers ( 0..65535 )
• CV_16S - 16-bit signed integers ( -32768..32767 )
需要注意的是,copy 这样的操作只是 copy 了矩阵的 matrix header 和那个指针,而不是矩 阵的本身,也就意味着两个矩阵的数据指针指向的是同一个地址,需要开发者格外注意。比 如上面这段程序,A、B、C 指向的是同一块数据,他们的 header 不同,但对于 A 的操作 同样也影响着 B、C 的结果。刚刚提高了内存自动释放的问题,那么当我不再使用 A 的时 候就把内存释放了,那时候再操作 B 和 C 岂不是很危险。不用担心,OpenCV 的大神为我 们已经考虑了这个问题,是在最后一个 Mat 不再使用的时候才会释放内存,咱们就放心用 就行了。
分类: OpenCV2011-12-28 10:33 26348 人阅读 评论(16) 收藏 举报 数据结构 matrixheadernumbers 存储 matlab
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
OPenCV3.2中Mat对象常用函数属性总结Mat对象是OpenCV2.0之后引进的图像数据结构,它能自动分配内存、不存在内存泄漏的问题,是面向对象的数据结构。
分了两个部分,头部与数据部分。
在使用Mat对象时,有以下四个要点需要注意:
1、输出图像的内存是自动分配的
2、使用OpenCV的C++接口,不需要考虑内存分配问题
3、赋值操作和拷贝构造函数只会复制头部分
4、使用clone与copyTo两个函数实现数据完全复制
下面我们就具体介绍一下公共成员函数和公共属性。
公共成员函数:
1、cv::Mat::Mat ( int rows,
int cols,
int type
)
参数:
rows2D数组中的行数
cols2D数组中的列数。
type数组类型。
使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。
2、cv::Mat::Mat ( Size size,
int type
)
参数:
size 2D数组大小:Size(cols, rows)。
在Size()构造函数中,行数和列数以相反的顺序排列。
type 数组类型。
使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。
3、cv::Mat::Mat ( int rows,
int cols,
int type,
const Scalar & s
)
参数:
rows2D数组中的行数。
cols 2D数组中的列数。
type数组类型。
使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。
s 初始化每个矩阵元素的可选值。
在构建后将所有矩阵元素设置为特定值, 使用赋值运算符Mat::operator=(const Scalar& value) 。
4、cv::Mat::Mat ( Size size,
int type,
const Scalar & s
)
参数:
size二维数组的大小: Size(cols, rows) .在Size()构造函数中,行数和列数以相反的顺序排列。
type 数组类型。
使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。
s 初始化每个矩阵元素的可选值。
在构建后将所有矩阵元素设置为特定值,使用赋值操作符Mat::operator=(const Scalar& value) .
5、cv::Mat::Mat ( int ndims,
const int * sizes,
int type
)
参数:
ndims数组维数。
sizes 指定n维数组形状的整数数组。
type 数组类型。
使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。
6、cv::Mat::Mat ( int ndims,
const int * sizes,
int type,
const Scalar & s
)
参数:
ndims数组维数。
sizes指定n维数组形状的整数数组。
type数组类型。
使用CV_8UC1,…,CV_64FC4创建1 - 4通道矩阵,或CV_8UC(n),…,CV_64FC(n)创建多通道(向上到CV_CN_MAX通道)矩阵。
s初始化每个矩阵元素的可选值。
在构建后将所有矩阵元素设置为特定值,使用赋值操作符Mat::operator=(const Scalar& value) .
7、cv::Mat::Mat ( const Mat & m )
参数:
m被分配给被构造的矩阵的数组(作为一个整体或部分)。
没有数据被这些构造函数复制。
而是指向m数据或它的子数组的头指针被构造并与之关联。
如果有引用计数器的话,计数器是递增的。
因此,当您使用这样的构造函数修改生成的矩阵时,您也会修改相应的m元素。
如果你想要一个独立的子数组拷贝,使用Mat::clone() .
8、cv::Mat::Mat ( const Mat & m,
const Range & rowRange,
const Range & colRange = Range::all()
)
参数:
m被分配给被构造的矩阵的数组(作为一个整体或部分)。
没有数据被这些构造函数复制。
而是指向m数据或它的子数组的头指针被构造并与之关联。
如果有
引用计数器的话,计数器是递增的。
因此,当您使用这样的构造函数修改生成的矩阵时,您也会修改相应的m元素。
如果你想要一个独立的子数组拷贝,使用Mat::clone() .
RowRange 要取的m的行范围。
通常,范围开始是包含的,范围结束是除外的。
使用Range::all() 获取所有行。
colRange要取m的列范围。
使用Range::all() 获取所有的列。
9、cv::Mat::Mat ( const Mat & m,
const Rect & roi
)
参数:
m被分配给被构造的矩阵的数组(作为一个整体或部分)。
没有数据被这些构造函数复制。
而是指向m数据或它的子数组的头指针被构造并与之关联。
如果有引用计数器的话,计数器是递增的。
因此,当您使用这样的构造函数修改生成的矩阵时,您也会修改相应的m元素。
如果你想要一个独立的子数组拷贝,使用Mat::clone() .
roi感兴趣区域.
10、_Tp& cv::Mat::at ( int i0 = 0 )
返回指定数组元素的引用。
下面的示例初始化一个Hilbert矩阵:
Mat H(100, 100, CV_64F);
for(int i = 0; i < H.rows; i++)
for(int j = 0; j < H.cols; j++)
H.at<double>(i,j)=1./(i+j+1);
11、int channels () const
返回矩阵通道的数目。
12、Mat clone () const
创建数组的完整副本和底层数据。
13、void copyTo (OutputArray m) const
将矩阵复制到另一个矩阵。
参数
m目标矩阵。
如果在操作前没有适当的大小或类型,则重新分配
14、void create (int rows, int cols, int type)
分配新的数组数据
参数:
rows新的的行数。
cols 新列数。
type 新的矩阵类型。
15、int cv::Mat::depth ( ) const
返回矩阵元素的深度
该方法返回矩阵元素深度的标识符(每个单独通道的类型)。
例如,对于一个16位有符号的元素数组,该方法返回CV_16S。
矩阵类型的完整列表包含以下值: •CV_8U - 8-bit unsigned integers ( 0..255 )
•CV_8S - 8-bit signed integers ( -128..127 )
•CV_16U - 16-bit unsigned integers ( 0..65535 )
•CV_16S - 16-bit signed integers ( -32768..32767 )
•CV_32S - 32-bit signed integers ( -2147483648..2147483647 )
•CV_32F - 32-bit floating-point numbers ( -FLT_MAX..FLT_MAX, INF, NAN ) •CV_64F - 64-bit floating-point numbers ( -DBL_MAX..DBL_MAX, INF, NAN ) 16、uchar* cv::Mat::ptr ( int i0 = 0 )
返回指定的矩阵行的指针。
参数:
i0 一个基于行的索引。
公共属性
1、int cv::Mat::cols
矩阵的列
2、uchar* cv::Mat::data
指向数据的指针
3、int cv::Mat::dims
矩阵维数,> = 2
4、int cv::Mat::rows
当矩阵有超过2个维度时,行数和列(- 1,- 1)的数目。