机器视觉之OpenCV教程图像容器Mat类基础一(一)
零、OpenCV概述
- 基本上在机器识别的领域 ,都有OpenCV的身影 。
- OpenCV中基本上包含了所有的机器视觉所用到的算法 , 即使没有也能利用OpenCV平台快速搭建出来。
- OpenCV核心模块(Core Module)的主要内容
- Mat基本图像容器
- 扫描图像的几种方式
- 在图像上进行掩膜操作
- 图像的基本操作
- 图像的叠加 混合操作
- 改变 图像对比度和亮度
- 基本绘图函数使用
- 随机数以及本文内容的生成
- 离散傅里叶(DFT)变换
- XML和YML格式的IO
- 如何与OpenCv1.x版本共同使用
一、Mat基本图像容器
- 数字图像在计算机中是以二维矩阵的形式 存放的
- Mat的基本结构
- Matrix Header: 矩阵头 , 占用固定大小的内存 , 描述了矩阵的基本信息 , 如:矩阵的长宽 、 数据指针的位置 , 数据类型 , 通道数量 。。。。
- Matrix Date : 指向矩阵数据(像素值)的指针 , 占用内存依据图像的大小以及图像数据类型和通道等变化 。
二、Mat类浅复制
- 图像处理最显著的特点就是计算量大 , 占用内存多 , 所以尽量避免图像的深度拷贝 。
为了避免大规模内存数据块的深度拷贝操作 , OpenCV采用了引用计数 策略 , 此策略的核心思想是每一个Mat对象都有自己的头 , 但是不同的Mat对象的数据指针可以指向同一块区域并对其进行操作。 此时拷贝构造函数和 赋值操作 只是重新开辟一个矩阵头的内存区域 , 而不再申请数据区的内存 。
Mat A , C;//创建两个矩阵头
A = imread(src);//读取图片 , 为A独到的数据开辟内存区
Mat B(A);//使用拷贝构造函数创建一个新的Mat对象B
C = A ; //使用赋值操作符把A对象复制给C
此时 A 、 B、 C三个Mat对象的矩阵头都指向了同一个数据区 。ROI: 感兴趣区域
- 你可以创建一个新的矩阵头, 指向另一个矩阵的一个子集 ,由于这是浅复制 ,, 这个新的矩阵头对ROI子集的任何修改都会直接修改源数据 。
指定ROI的两种方法:
Mat D(A , Rect(x , y , width , height));//使用矩形指定ROI的区域 Mat E = A(Range(a,b) , Range(c , d));//a、b用于指定哪行到哪行 , c、d用于指定哪列到哪列 。 使用Range限定行列的边界指定ROI
- 你可以创建一个新的矩阵头, 指向另一个矩阵的一个子集 ,由于这是浅复制 ,, 这个新的矩阵头对ROI子集的任何修改都会直接修改源数据 。
三、深层拷贝
- clone函数: Mat B = A.clone();
- copyTo函数: Mat C ; A.copyTo(A);
- A、B、C 的数据区独立存在 , 互不影响 。