OpenCV读取和写入图像文件(详解版)

  • 内容
  • 评论
  • 相关

图像处理依赖于得到一幅图像(例如,一张照片和一个视频帧)并通过应用信号处理技术的“播放”(playing)来得到预期的结果。

本节展示如何使用由 OpenCV 提供的函数从文件中读取图像。

OpenCV 基本 API 概念

Mat 类是存储和操作 OpenCV 中图像的主要数据结构。这个类是在 core 模块中定义的。OpenCV 已经实现了对于这些数据结构自动分配和释放内存的机制。但是,当数据结构共享相同的缓冲存储器时,程序员仍然应该特别注意。

例如,赋值运算符并没有从一个对象(Mat A)到另一个对象(Mat B)复制内存内容;而只是对其引用(相应内容的存储地址)的复制。之后,一个对象(A 或 B)的改变对两个对象都有影响。为了复制一个 Mat 对象的内存内容,应该使用成员函数 Mat::clone()。

注意,OpenCV 中的许多函数在处理密集的单通道或多通道数组时,常使用 Mat 类。但是在某些场合,使用一个不同的数据类型可能很方便。例如,std::vector<>、Matx<>、Vec<> 或 Scalar。为此,OpenCV 提供了代理类 InputArray 和 OutputArray,允许前面的任意类型作为函数的参数使用。

Mat 类用于密集的 n 维单通道或多通道数组。实际上它可以存储实数或复数值向量和矩阵、彩色图像或灰度图像、直方图、点云等。

有许多种不同的方式可用来创建一个 Mat 对象,最流行的方法是构造函数,其数组的大小和类型被指定为:

Mat(nrows,ncols,type,fillValue)

数组元素的初始值可以由 Scalar 类设置为一个典型的四元素向量(对于存储在数组中的图像的每个 RGB 和透明度分量)。下面展示 Mat 的一个使用示例:

Mat img_A(4,4,CV_8U,Scalar(255));
//白色图像;
//具有 8 位无符号整数的 4x4 单个通道数组
//(最多 255 个值,对灰度图像有效,例如,255=白色)

DataType 类定义 OpenCV 的基本数据类型。基本数据类型可以是 bool、unsigned char、signed char、unsigned short、signed short、int、float、double 或者是以这些基本类型之一的值构成的一个元组(或称数组)。任何基本类型都可以用一个标识符以下面的形式定义:

CV_<bit depth>{U|S|F}C(<number of channels>)

在上面的代码中,U、S 和 F 分别代表 unsigned、signed 和 float 数据类型。

对于单通道数组,可应用下面的枚举类型,其数据类型的描述为:

enum{CV_8U=0,CV_8S=1,CV_16U=2,CV_16S=3,CV_32S=4,CV_32F=5,CV_64F=6};

需要注意的是,这三个声明是等价的:CV_8U、CV_8UC1 和 CV_8UC(1)。该单通道声明最适合于灰度图像的整型数组,然而一个数组的三通道声明更适合于具有三个分量(例如,RGB、BRG、HSV 等)的图像。对于线性代数运算,可以使用 float(F) 类型的数组。

我们可以为多通道数组(高达 512 个通道)定义上面所有的数据类型。图 1 说明一幅具有单个通道(CV_8U,灰度)图像的内部表示和具有三个通道(CV_8UC3,RGB)的同一幅图像。图 1 是通过在一个 OpenCV 可执行文件(showImage 示例)的窗口中所显示的一幅图像的放大来获得的:


一幅 RGB 彩色图像和灰度图像的一个 8 位表示
图 1 一幅 RGB 彩色图像和灰度图像的一个 8 位表示

本文标题:OpenCV读取和写入图像文件(详解版)

本文地址:https://www.hosteonscn.com/4120.html

评论

0条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注