OpenCV API使用笔记 —— 3. 如何读取和保存图片
文章目录
- 读取图片数据
- 参数说明
- 支持格式
- 保存图片数据
- 参数说明
- 用例
在某些时候,我们可能需要在图像数据被处理后保存结果。对于 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> ¶ms = 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. 如何读取和保存图片相关推荐
- OpenCV API使用笔记 —— 4. 如何保存视频文件
文章目录 写入图片帧信息 C/CPP示例 Python示例 在<OpenCV API使用笔记 -- 1. 如何打开摄像头或视频文件> 介绍过使用「VideoCapture」类,可以打开摄像 ...
- Android + OpenCV 入门教程笔记(保姆级)
笔记基于Android+openCV培训进行记录 源码:github 记录不易,喜欢的可以给个三连,感谢感谢!!! OpenCV概述 什么是OpenCV OpenCV是一个基于Apache2.0许可( ...
- 角点检测(Harris Shi-Tomas)的原理及OpenCV API 的应用
角点检测(Harris & Shi-Tomas)的原理及OpenCV API 的应用 这篇博客的内容主要时对参考中多篇博客的总结. 1. 角点 在现实世界中,角点对应于物体的拐角,道路的十字路 ...
- OpenCV HDF创建,写入和读取数据集
OpenCV HDF创建,写入和读取数据集 HDF创建,写入和读取数据集 目标 源代码 解释 结果 HDF创建,写入和读取数据集 目标 本教程向您展示: 如何创建数据集? 如何将写入cv::Mat数据 ...
- 【计算机视觉】opencv入门学习笔记Part.1
[计算机视觉]opencv入门学习笔记Part.1 1 前言 1.1 opencv概述(摘取自百度百科) 1.2 图像概念引入 1.3 安装opencv库 2 图像基本操作 2.1 图像的读取 2.2 ...
- opencv进阶学习笔记3:像素运算和图像亮度对比度调节
基础版传送门: python3+opencv学习笔记汇总目录(适合基础入门学习) 进阶版目录: python+opencv进阶版学习笔记目录(适合有一定基础) 像素运算 要求两张图大小,以及格式(np ...
- Crypto API 学习笔记一
标 题: [原创]Crypto API 学习笔记一 作 者: jdxyw 时 间: 2006-09-01,16:47 链 接: http://bbs.pediy.com/showthread.php? ...
- QT+OpenCV综合示例:载入、读取图片
QT+OpenCV综合示例:载入.读取图片 1.代码: 2.运行结果: 下载1 GitHub: 下载2 1.代码: 1)opencv_imwrite_Q.pro 添加: INCLUDEPATH+= D ...
- 数据结构与算法学习笔记之 提高读取性能的链表(上)
数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...
最新文章
- android wear 兼容问题,【悲剧了】仅 1/4 安卓手机兼容 Android Wear - 爱应用
- 每日程序C语言21-递归逆序数出字符串
- 15-07-10 结构体-输入学生成绩进行排序
- 二进制安装mysql 5.7、mariadb (附yum安装方式)
- BP算法是从天上掉下来的吗?
- 返回顶部:js代码篇
- 数据库笔记12:创建与管理触发器
- Blender场景建模练习:破旧的公寓楼
- 推荐一个在Windows下可以查看文件夹大小的工具TreeSize Free
- js中继承的几种方式
- ReactNative之 Activity class {xxx/xxx.MainActivity} does not exist
- vue实现组件间通信的几种方式(父传子,子传父)
- 如何解决win10连接手机无反应情况
- [激光原理与应用-31]:典型激光器 -3- 光纤激光器
- 有一群海盗(不多于20人),在船上比拼酒量。过程如下:打开一瓶酒,所有在场的人平分喝下, 有几个人倒下了。再打开一瓶酒平分,又有倒下的,再次重复...... 直到开了第4瓶酒,坐着的已经所剩无
- 软件测试工程师笔试题
- linux usb 网络摄像头,树莓派|Linux有问必答:如何在树莓派上安装USB网络摄像头...
- 多个换行符\n替换为1个换行
- 十代i7前端总线频率_十代i5和十代i7的区别
- Firefox浏览器怎么安装adobe flash player插件
热门文章
- Failed to find provider for user 0 ; expected to find a valid ContentProvider for的解决办法
- 尚德商学院计算机系课程,UBC尚德商学院专业小百科(一):会计
- AD域服务器的搭建(4)--LADP概述
- NR PDSCH (二)频域资源
- Linux 内核交互图
- 微信小程序学习笔记(五) 云开发
- 【跟学C++】C++STL标准模板库——算法详细整理(中)(Study18)
- 4Pandas统计分析基础二
- 从技术到管理,程序员如何实现螺旋上升?
- 服务器 系统重启命令行,使用命令行重启Windows服务器的方法