openCV Mat 基础

参考:https://blog.csdn.net/qq_34963853/article/details/79746166Mat数据结构

Mat类型是opencv2.0后的类型,使用此类型无需进行内存管理,即无需手动分配内存,在不需要时自动释放内存,但因目前的许多嵌入式系统仅支持c语言,故而除了在某些嵌入式系统中使用cvMat或IplImage, 基本使用Mat类型。

注:后续的matrix均表示存储图像像素值的矩阵 。

Mat包含2个数据部分:(1)the matrix header--包含matrix大小,存储方法,存储地址等,header内存大小固定;

                  (2)指向像素matrix的指针,指向所有像素值的矩阵(根据所选存储方法不同,矩阵可以是不同的维数)的指针。

OpenCV使用的是引用计数系统:每个Mat对象都有着自己的header,但matrix可在两个实例中通过指向同一个matrix首地址的指针来共享数据。拷贝构造和赋值均只拷贝其header和指向matrix的指针,而非像素数据的本身。当拷贝一个Mat对象的header时,关于matrix的计数器数值增加,一旦header被清理了,counter减少,当counter减少到0的时候,matrix的内存空间会被释放。

可创建关于全部数据的子部分的header。例如,可通过创建一个有着新边界的header来创建ROI(感兴趣区域)。对应代码如下:

Mat D (A, Rect(10, 10, 100, 100) ); //using a rectangle
Mat E = A(Range::all(), Range(1,3)); //using row and column boundaries
OpenCV提供了clone()和copyto()两函数来拷贝matrix数据本身,示例如下:

Mat F = A.clone();
Mat G;
A.copyTo(G);
像上述示例,修改F或G不会影响A中header所指matrix。
显示创建Mat对象:

Mat类型不仅可以存储图像,还可以通过构造函数创建一个Mat对象。如:

   Mat M(2,2, CV_8UC3, Scalar(0,0,255));   

构造函数的参数含义:行大小,列大小,数据类型及每个矩阵元素的通道数(具体形式CV_[The number of bits per item][Signed or Unsigned][Type Prefix]C[The channel number]
),数据(3通道时默认为B,G,R数值,如果想设置其他颜色空间可以通过cvtColor()转换)。

已经存在的IplImage类型转换成Mat类型:
IplImage* img = cvLoadImage("greatwave.png", 1);
Mat mtx(img); // convert IplImage* -> Mat

加载,转换颜色空间,保存图像文件
 Mat image;
 image = imread( imageName, 1 );//读取图像文件
Mat gray_image;
 cvtColor( image, gray_image, COLOR_BGR2GRAY );//转换颜色空间
imwrite( "../../images/Gray_Image.jpg", gray_image );//保存图像文件

原文地址:https://www.cnblogs.com/zhibei/p/12273398.html

时间: 2024-11-08 23:51:31

openCV Mat 基础的相关文章

stream opencv mat (webcam)frame throught tcp by boost asio

客户端: ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84

OpenCV Mat数据类型及位数总结(转载)

OpenCV Mat数据类型及位数总结(转载) 前言 opencv中很多数据结构为了达到內存使用的最优化,通常都会用它最小上限的空间来分配变量,有的数据结构也会因为图像文件格式的关系而给予适当的变量,因此需要知道它们声明的空间大小来配置适当的变量.一 般标准的图片,为RGB格式它们的大小为8bits格式,范围为0~255,对一个int空间的类型来说实在是太小,整整浪费了24bits的空间,假设有个640*480的BMP文件空间存储內存,那整整浪费了640*480*3*(32-8)bits的內存空

【Opencv】Mat基础

1.Mat::imread() C++: Mat imread(const string& filename, int flags=1 ) filename – Name of file to be loaded. flags – Flags specifying the color type of a loaded image: CV_LOAD_IMAGE_ANYDEPTH - If set, return 16-bit/32-bit image when the input has the

将Opencv,Mat类型图片贴图到windows显示设备中

Opencv对图像的显示,有自带的imshow函数完成.但是,如果需要在windows程序中显示图像的时候,就有点小麻烦了. 现介绍一种方法,是在<Learning openCV Second Edition>中介绍的. 代码如下所示: void CShowPicToDlgDlg::OnBnClickedOk() { RGBTRIPLE* m_bitmapBits; //读取图片 Mat cv_pic_src = imread("11.jpg", CV_LOAD_IMAGE

OpenCV Mat 类型定义和赋值

详细介绍请参考官网相关部分链接:http://docs.opencv.org/doc/tutorials/core/mat_the_basic_image_container/mat_the_basic_image_container.html 1.一般的Mat定义方法:cv::Mat M(height,width,<Type>),例: cv::Mat M(480,640,CV_8UC3); 表示定义了一个480行640列的矩阵,矩阵的每个单元的由三个(C3:3 Channel)8位无符号整形

(转)在Mac下使用OpenCV, 在Xcode下使用OpenCV (非常基础,详细)

转自:http://blog.sciencenet.cn/home.php?COLLCC=3456986939&COLLCC=3456885714&mod=space&uid=702148&do=blog&quickforward=1&id=657754%20%E5%9C%A8Mac%E4%B8%8B%E4%BD%BF%E7%94%A8OpenCV%EF%BC%8C%20%E5%9C%A8Xcode%E4%B8%8B%E4%BD%BF%E7%94%A8Ope

opencv Mat 使用时的注意事项

下面的small tips 是我在做毕设时处理图片遇到的一些问题,先如今都已经找到了解决的方法,适合于opencv的新手看一看. 1. imread() 小陷阱 imread('img.jpg'); 这条语句读进来的是3通道,无论img.jpg是单通道的图像还是3通道的图像,所以输入图像如果是灰度图像,为了不出错,可以使用 imread("img.jpg",-1); 2.normalize() 小陷阱 要注意它的输入矩阵必须是单通道的,具体可见下方红色部分. <span styl

opencv mat flags含义

f:\opencv\opencv\sources\modules\core\src\matrix.cpp:  flags = (_type & CV_MAT_TYPE_MASK) | MAGIC_VAL;    CV_MAT_TYPE_MASK: =8*4-1=31, 5bits  #define CV_MAT_TYPE_MASK        (CV_DEPTH_MAX*CV_CN_MAX - 1)    MAGIC_VAL:  MAGIC_VAL  = 0x42FF0000    _type

Live YUV420 和 OpenCV Mat 的互相转换

1. YUV420 -> Mat 可用于转换接受到的YUV视频源到OpenCV可以识别的数据 Mat myuv( Frame_Height + Frame_Height / 2, Frame_Width, CV_8UC1, (unsigned char *) YUV420_Image_Buffer); cvtColor(myuv, mgMat, CV_YUV420p2RGB); 2. Mat -> YUV420 可用于OpenCV处理完视频信号后返回 cvtColor(mgMat, myuv,