Opencv Mat理解

本文深入探讨了Mat与IplImage的区别,强调了Mat在内存管理方面的优势,同时也指出在嵌入式开发系统上的局限性。通过对比分析,帮助读者了解在不同场景下选择合适的数据结构的重要性。

为什么用Mat而不用IplImage?
Mat相对IplImage的优点:Mat主要为你省去了IplImage麻烦的手动内存管理。
Mat相对IplImage的缺点:在某些嵌入式的开发系统上仅支持c。

总结:除非你是嵌入式平台,否则没有必要在使用IplImage。

Mat结构
Mat实质是由两部分数据组成的类:矩阵头和指针。

矩阵头:包含像素矩阵的信息,矩阵大小,矩阵存储方法,矩阵存储地址等。(矩阵头大小恒定)
指针 :指向了像素值的矩阵。(因图像的不同而不同)

Mat对象间的复制:只复制矩阵头,指针指向像素值的距阵,不复制像素值矩阵。

Mat A,C; //仅创建了矩阵头
A = imread(image_path,CV_LOAD_IMAGE_COLOR);//分配矩阵,并指针指向该矩阵

Mat B(A);
C = A;

以上A,C,B,都使用同一块数据矩阵,当其中一个对数据矩阵进行操作,都会对其他两个照成影响。
也许你会有疑问,多个Mat共用一块数据矩阵什么时候释放?其实在为Mat对象分配数据矩阵时,同时会创建一个计数器,当有一个指针指向这块数据矩阵,计数器就加一。当一个指针配释放,计数器就减一。到计数器为0时,就清除这块数据矩阵内存。

当然也有赋值数据矩阵本身的函数,clone(),copyto()。

### OpenCVMat 类的使用方法及常见操作 #### 创建 Mat 对象 `Mat` 是 OpenCV 库中用于表示图像和其他多维数组的核心类。创建 `Mat` 对象有多种方式,最常用的是通过构造函数或者静态工厂方法来初始化。 - **默认构造函数** 构造一个空的 `Mat` 对象,后续可以通过其他方法填充数据。 ```cpp cv::Mat mat; ``` - **指定大小和类型的构造函数** 可以直接定义矩阵的高度、宽度以及像素类型(如 CV_8UC1 表示单通道8位无符号整数)[^1]。 ```cpp cv::Mat image(480, 640, CV_8UC3); ``` #### 加载与保存图片 为了读取文件系统上的图像到内存中的 `Mat` 结构体里,可以调用 `imread()` 函数;而要将修改后的图像写回到磁盘,则可采用 `imwrite()` 方法[^2]。 ```cpp // 从文件加载图像至 Mat 对象 cv::Mat img = cv::imread("path/to/image.jpg"); // 将 Mat 对象保存为新文件 cv::imwrite("output_image.png", img); ``` #### 基础属性访问 获取有关 `Mat` 的基本信息,比如尺寸、元素数量、步幅等,可通过相应的 getter 成员函数完成: - 获取行数 (`rows`) 和列数 (`cols`) - 查询总元素数目 (`total()`) - 查看每个元素占用字节数 (`elemSize()`) 或者整个矩阵所占空间 (`step*rows`) ```cpp int rows = img.rows; // 图像高度 int cols = img.cols; // 图像宽度 size_t totalElements = img.total(); // 总像素点数 size_t elementBytes = img.elemSize(); // 单个像素占据多少字节 ``` #### 数据转换与复制 当需要改变现有 `Mat` 实例的内容而不影响原始对象时,应该先执行深拷贝操作——即克隆一份完全独立的新副本出来。此外,在不同色彩模式之间相互切换也是常见的需求之一,这通常借助于 `cvtColor()` 来达成目的[^3]。 ```cpp // 复制 Mat 对象并分配新的缓冲区 cv::Mat cloneImg = img.clone(); // 转换颜色空间 (BGR -> GrayScale) cv::Mat grayImage; cv::cvtColor(img, grayImage, cv::COLOR_BGR2GRAY); ``` #### 子区域提取与设置 有时仅需处理特定区域内的一部分而不是整张图,这时就可以利用 ROI(region of interest) 技术截取出感兴趣的部分作为临时工作区来进行编辑。同样地,也可以设定某些位置的颜色值达到绘制图形的效果。 ```cpp // 定义矩形范围内的子窗口 cv::Rect roiRect(xOffset, yOffset, width, height); cv::Mat subRegion = img(roiRect); // 设置某个坐标处的颜色 img.at<cv::Vec3b>(yPos, xPos)[channelIndex] = newValue; ``` 以上就是关于 OpenCV 中 `Mat` 类的一些基础概念及其典型应用场景概述。希望上述内容能帮助理解如何高效运用这一强大工具开展计算机视觉项目开发。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值