来叩网
请输入搜索词:
  

opencv-OpenCV读取和写入图像文件

以下是www.hotellico.com大数据处理后,找到符合从资源中取图像 opencv-OpenCV读取和写入图像文件的所有相关结果,可以点击标题打开https://www.hotellico.com查看!

opencv-OpenCV读取和写入图像文件2019年09月20日 19:51:00阅读数:974博客 / 弘德誉曦的博客/ C笔记

图像处理依赖于得到一幅图像(例如,一张照片和一个视频帧)并通过应用信号处理技术的“播放”(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_{U|S|F}C()

在上面的代码中,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 函数正确地保存一幅 RGB 图像是很重要的,该图像必须按照 BGR 通道顺序在内存中存储。按照同样的方式,当从一个文件中读取一幅 RGB 图像时,应按照 BGR 通道顺序将其存储在内存中。而且,需要补充第四个通道(alpha)来处理具有三个通道(RGB)的图像,加上了一个透明度。对于 RGB 图像,整数值越大,意味着像素更亮或 alpha 通道更透明。

所有的 OpenCV 类和函数都在 cv 命名空间(namespace)中,因此,在源代码中还有如下两个选项:

在包含头文件后还应添加使用命名空间 cv 的声明(using namespace cv)(这是本书所有代码示例所使用的选项)。对用到的所有 OpenCV 类、函数和数据结构上附加 cv:: 前缀。如果由 OpenCV 提供的外部名字与常用的标准模块库(standard template library,STL)或其他库冲突,那么就推荐使用这个选项。OpenCV支持图像文件的格式

OpenCV 支持最常见的图像格式。但是,某些图像格式需要(免费提供的)第三方类库。由 OpenCV 支持的主要格式有:

Windows bitmaps(*.bmp、*dib);Portable image formats(*.pbm、*.pgm、*.ppm);Sun rasters(*.sr、*.ras);

需要辅助库的格式有:

JPEG(*.jpeg、*.jpg、*.jpe);JPEG 2000(*.jp2);Portable Network Graphics(*.png);TIFF(*.tiff、*.tif);WebP(*.webp);

对于 OpenCV 3.0 版本,除了上面列出的格式外,它还包含一个由地理数据抽象库(Geographic Data Abstraction Library,GDAL)所支持格式(NITF、DTED、SRTM等)的驱动器,通过 CMake 的选项 WITH_GDAL 来设置。注意,在 Windows OS 上,对 GDAL 的支持还没有经过广泛测试。

在 Windows 和 OS X 中,默认对这些格式(libjpeg、libjasper、libpng和libtiff)使用 OpenCV 附带的编解码器。之后,在这些操作系统中,可以读取 JPEG、PNG 和 TIFF 格式。Linux(和其他类 UNIX 开源操作系统)会寻找安装在系统中的编解码器。在 OpenCV 之前,可以安装编解码器或从 OpenCV 包中通过在 CMake 中设置正确的选项(例如,BUILD_JASPER、BUILD_JPEG、BUILD_PNG 和 BUILD_TIFF)来构建其他库。

OpenCV示例代码

为了说明如何使用 OpenCV 读、写图像文件,现在,我们将描述 showImage 示例,如图 2 所示。

showImage示例的输出窗口图 2 showImage示例的输出窗口

从命令行执行该示例,对应的输出窗口如下:

\showImage.exe fruits.jpg fruits_bw.jpg

在本示例中,两个文件名称作为参数给出。第一个是读取的输入图像文件。第二个是使用输入图像的一个灰度副本写入的图像文件,接下来,展示源代码及其说明:

#include #include using namespace std;using namespace cv;int main(int, char *argv[]){Mat in_image, out_image;// Usage: //读取原始图像in_image = imread(argv[1], IMREAD_UNCHANGED);if (in_image.empty()) {//检查是否读取图像cout ;//在之前创建的窗口中显示图片imshow(argv[1], in_image);cvtColor(in_image, out_image, COLOR BGR2GRAY);imshow(argv[2], in_image);cout 0)内等待一个按键操作,并返回键的编码,如果延迟结束时没有按键则返回 -1。如果 delay 是 0 或负数,那么函数一直等待直到一个键被按下。

记住,只有至少创建和激活一个窗口时,函数 waitKey 才会工作。

OpenCV写入图像文件

imgcodecs 模块中的另一个重要函数是:

bool imwrite(const String& filename,InputArray img,const vector& params=vector())

这个函数将一幅图像(img)保存到一个文件(filename),作为第三个可选参数,一个“属性-值”对的向量指定编解码器的参数(为使用默认值将其设置为空)。编解码器由文件的扩展名决定。

版权申明:本博文版权归博主所有,转载请注明地址!如有侵权、违法,请联系admin@php.cn举报处理!

全部评论

文明上网理性发言,请遵守新闻评论服务协议

0 条评论
相关搜索
网友推荐
日本为了 九十年代日本 日本闹鬼 日本品牌有哪些 日本烟花视频 日本奶粉进口 日本川崎市 日本窒息 日本酒瓶 日本艺术类留学
口述和狗狗爱爱小说 新版龙腾小说 重生成西方神明的小说 时光隔山海小说七 免费七界武神全文小说 母奴小说 爸爸和女友辣文小说 小说林志玲 虚无的焦点小说 美少女屠宰场小说