文章目录

  • 读取图片数据
    • 参数说明
    • 支持格式
  • 保存图片数据
    • 参数说明
  • 用例

在某些时候,我们可能需要在图像数据被处理后保存结果。对于 OpenCV 来说,我们需要保存的主要有两种数据,一种是图片,还有一种是视频。在这个章节里,我们先来探讨如何读区和保存图片数据。

读取图片数据

这个功能,可以用到下面这个函数。

Mat cv::imread(const String & filename, int flags = IMREAD_COLOR)

参数说明

  • filename,读取的文件名,或文件的绝对、相对路径;
  • flags,文件读取时以什么方式读取,默认为彩色。

关于可用的flags选项,可以看下面这个表

请注意: 不同版本的OpenCV,在参数选项这块稍微有些不一样,如果你的IDE支持代码补全,可以用关键字的方式找到对应的FLAG,如果不支持这个功能,那么有可能你还是需要到官网上查看对应版本的描述信息,以上内容目前都是 OpenCV 4.5.6 的内容。

支持格式

OpenCV里自带了很多开源的,或免费使用的解码库,所以可以支持如下格式的数据读取。

  • Windows bitmaps - *.bmp, *.dib (always supported)
  • JPEG files - *.jpeg, *.jpg, *.jpe (see the Note section)
  • JPEG 2000 files - *.jp2 (see the Note section)
  • Portable Network Graphics - *.png (see the Note section)
  • WebP - *.webp (see the Note section)
  • Portable image format - *.pbm, *.pgm, *.ppm *.pxm, *.pnm (always supported)
  • PFM files - *.pfm (see the Note section)
  • Sun rasters - *.sr, *.ras (always supported)
  • TIFF files - *.tiff, *.tif (see the Note section)
  • OpenEXR Image files - *.exr (see the Note section)
  • Radiance HDR - *.hdr, *.pic (always supported)
  • Raster and Vector geospatial data supported by GDAL (see the Note section)

保存图片数据

当某个图片我们处理完毕后,可以使用如下函数保存结果。

bool cv::imwrite(const String & filename, InputArray img, const std::vector<int> &params = std::vector< int >())

参数说明

  • filename,保存的文件名,或文件的绝对、相对路径;
  • img,Mat 矩阵数据,处理后的图片数据,如果Mat要以图片形式进行保存,请确保它的底层数据格式为 uint8,通常经过一些列计算后,数据会被升格为 float32 的浮点型,如果就这样直接存起来,会导致报错或精度丢失;
  • params,图片存储辅助参数,一般不会用到,可以用来指定图片的大小、存储格式、采样率等信息。

具体的params信息,可以看下面这个表


如果你需要使用参数,参数的使用方式是这样的:

 std::vector<int> params;// set jpeg quality to 100params.push_back(IMWRITE_JPEG_QUALITY);params.push_back(100);// set luma quality to 10params.push_back(IMWRITE_JPEG_LUMA_QUALITY);params.push_back(10);// ...// save imageimwrite("foobar.jpg", mat_image, params);

用例

#include <opencv2/imgcodecs.hpp>
using namespace cv;
using namespace std;static void paintAlphaMat(Mat &mat)
{CV_Assert(mat.channels() == 4);for (int i = 0; i < mat.rows; ++i){for (int j = 0; j < mat.cols; ++j){Vec4b& bgra = mat.at<Vec4b>(i, j);bgra[0] = UCHAR_MAX; // Bluebgra[1] = saturate_cast<uchar>((float (mat.cols - j)) / ((float)mat.cols) * UCHAR_MAX); // Greenbgra[2] = saturate_cast<uchar>((float (mat.rows - i)) / ((float)mat.rows) * UCHAR_MAX); // Redbgra[3] = saturate_cast<uchar>(0.5 * (bgra[1] + bgra[2])); // Alpha}}
}
int main()
{Mat mat(480, 640, CV_8UC4); // Create a matrix with alpha channelpaintAlphaMat(mat);vector<int> compression_params;compression_params.push_back(IMWRITE_PNG_COMPRESSION);compression_params.push_back(9);bool result = false;try{result = imwrite("alpha.png", mat, compression_params);}catch (const cv::Exception& ex){fprintf(stderr, "Exception converting image to PNG format: %s\n", ex.what());}if (result)printf("Saved PNG file with alpha data.\n");elseprintf("ERROR: Can't save PNG file.\n");vector<Mat> imgs;imgs.push_back(mat);imgs.push_back(~mat);imgs.push_back(mat(Rect(0, 0, mat.cols / 2, mat.rows / 2)));imwrite("test.tiff", imgs);printf("Multiple files saved in test.tiff\n");return result ? 0 : 1;
}

OpenCV API使用笔记 —— 3. 如何读取和保存图片相关推荐

  1. OpenCV API使用笔记 —— 4. 如何保存视频文件

    文章目录 写入图片帧信息 C/CPP示例 Python示例 在<OpenCV API使用笔记 -- 1. 如何打开摄像头或视频文件> 介绍过使用「VideoCapture」类,可以打开摄像 ...

  2. Android + OpenCV 入门教程笔记(保姆级)

    笔记基于Android+openCV培训进行记录 源码:github 记录不易,喜欢的可以给个三连,感谢感谢!!! OpenCV概述 什么是OpenCV OpenCV是一个基于Apache2.0许可( ...

  3. 角点检测(Harris Shi-Tomas)的原理及OpenCV API 的应用

    角点检测(Harris & Shi-Tomas)的原理及OpenCV API 的应用 这篇博客的内容主要时对参考中多篇博客的总结. 1. 角点 在现实世界中,角点对应于物体的拐角,道路的十字路 ...

  4. OpenCV HDF创建,写入和读取数据集

    OpenCV HDF创建,写入和读取数据集 HDF创建,写入和读取数据集 目标 源代码 解释 结果 HDF创建,写入和读取数据集 目标 本教程向您展示: 如何创建数据集? 如何将写入cv::Mat数据 ...

  5. 【计算机视觉】opencv入门学习笔记Part.1

    [计算机视觉]opencv入门学习笔记Part.1 1 前言 1.1 opencv概述(摘取自百度百科) 1.2 图像概念引入 1.3 安装opencv库 2 图像基本操作 2.1 图像的读取 2.2 ...

  6. opencv进阶学习笔记3:像素运算和图像亮度对比度调节

    基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版目录: python+opencv进阶版学习笔记目录(适合有一定基础) 像素运算 要求两张图大小,以及格式(np ...

  7. Crypto API 学习笔记一

    标 题: [原创]Crypto API 学习笔记一 作 者: jdxyw 时 间: 2006-09-01,16:47 链 接: http://bbs.pediy.com/showthread.php? ...

  8. QT+OpenCV综合示例:载入、读取图片

    QT+OpenCV综合示例:载入.读取图片 1.代码: 2.运行结果: 下载1 GitHub: 下载2 1.代码: 1)opencv_imwrite_Q.pro 添加: INCLUDEPATH+= D ...

  9. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

最新文章

  1. android wear 兼容问题,【悲剧了】仅 1/4 安卓手机兼容 Android Wear - 爱应用
  2. 每日程序C语言21-递归逆序数出字符串
  3. 15-07-10 结构体-输入学生成绩进行排序
  4. 二进制安装mysql 5.7、mariadb (附yum安装方式)
  5. BP算法是从天上掉下来的吗?
  6. 返回顶部:js代码篇
  7. 数据库笔记12:创建与管理触发器
  8. Blender场景建模练习:破旧的公寓楼
  9. 推荐一个在Windows下可以查看文件夹大小的工具TreeSize Free
  10. js中继承的几种方式
  11. ReactNative之 Activity class {xxx/xxx.MainActivity} does not exist
  12. vue实现组件间通信的几种方式(父传子,子传父)
  13. 如何解决win10连接手机无反应情况
  14. [激光原理与应用-31]:典型激光器 -3- 光纤激光器
  15. 有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下, 有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无
  16. 软件测试工程师笔试题
  17. linux usb 网络摄像头,树莓派|Linux有问必答:如何在树莓派上安装USB网络摄像头...
  18. 多个换行符\n替换为1个换行
  19. 十代i7前端总线频率_十代i5和十代i7的区别
  20. Firefox浏览器怎么安装adobe flash player插件

热门文章

  1. Failed to find provider for user 0 ; expected to find a valid ContentProvider for的解决办法
  2. 尚德商学院计算机系课程,UBC尚德商学院专业小百科(一):会计
  3. AD域服务器的搭建(4)--LADP概述
  4. NR PDSCH (二)频域资源
  5. Linux 内核交互图
  6. 微信小程序学习笔记(五) 云开发
  7. 【跟学C++】C++STL标准模板库——算法详细整理(中)(Study18)
  8. 4Pandas统计分析基础二
  9. 从技术到管理,程序员如何实现螺旋上升?
  10. 服务器 系统重启命令行,使用命令行重启Windows服务器的方法