bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>());

filename

待写入的文件名。保存图像的格式由扩展名决定。

img

一般为一个Mat类型的图像。

图像要求:单通道或三通道图像,8bit或16bit无符号数,其他类型输入需要用函数进行转换 (这个还是挺重要的,之前想存一个float型的Mat, 发现并没有好的办法,最后解决方案是存成xml文件):

  • convertTo: 转换数据类型不同的Mat
  • cvtColor: 转换不同通道的Mat (利用第四个参数)

params

特定格式保存的参数编码:

  • JPEG:params表示0到100的图片质量(CV_IMWRITE_JPEG_QUALITY),默认值为95;
  • PNG:params表示压缩级别(CV_IMWRITE_PNG_COMPRESSION),从0到9,其值越大,压缩尺寸越小,压缩时间越长;
  • PPM / PGM / PBM:params表示二进制格式标志(CV_IMWRITE_PXM_BINARY),取值为0或1,默认值是1。

实例:生成图片并保存到电脑

#include <opencv2/opencv.hpp>
#include <opencv2/highgui/highgui.hpp>
//#include <opencv2/imgcodecs/imgcodecs.hpp>
//#include <opencv2/imgproc/imgproc.hpp>
#include <vector> void createAlphaMat(cv::Mat &mat)
{
for (int i=; i<mat.rows; i++) {
for (int j = ; j<mat.cols; ++j) {
cv::Vec4b& rgba = mat.at<cv::Vec4b>(i,j);
rgba[] = UCHAR_MAX;
rgba[] = cv::saturate_cast<uchar>((float (mat.cols-j))/((float)mat.cols)*UCHAR_MAX);
rgba[] = cv::saturate_cast<uchar>((float (mat.rows-i))/((float)mat.rows)*UCHAR_MAX);
rgba[] = cv::saturate_cast<uchar>(0.5*(rgba[]+rgba[]));
}
}
} int main(){
// create Mat with alpha channel
cv::Mat mat(, , CV_8UC4);
createAlphaMat(mat); std::vector<int> compression_params;
if(CV_VERSION_MAJOR==)
compression_params.push_back(cv::IMWRITE_PNG_COMPRESSION);
// if OpenCV2 comment this
else
compression_params.push_back(CV_IMWRITE_PNG_COMPRESSION); // show image
try{
imwrite("alpha.png", mat, compression_params);
imshow("Created PNG", mat);
fprintf(stdout, "Finish creating image with alpha channel.\n");
cv::waitKey();
}
catch(std::runtime_error& ex){
fprintf(stderr, "Error when converting to PNG: %s\n", ex.what());
return ;
}
return ;
}

CMakeLists.txt

cmake_minimum_required (VERSION 2.8)
project (WriteImage) # find OpenCV packages
find_package( OpenCV REQUIRED PATHS /usr/local/Cellar/opencv3/3.1.0_3/share/OpenCV/)
include_directories( ${OpenCV_INCLUDE_DIRS} ) # add the executable
add_executable (WriteImage WriteImage.cxx)
target_link_libraries(WriteImage opencv_core opencv_highgui opencv_imgproc opencv_imgcodecs)

输出图像到文件 imwrite()[OpenCV 笔记7]的更多相关文章

  1. OpenCV基本架构[OpenCV 笔记0]

    最近正在系统学习OpenCV,将不定期发布笔记,主要按照毛星云的<OpenCV3编程入门>的顺序学习,会参考官方教程和文档.学习工具是Xcode+CMake,会对书中一部分内容更正,并加入 ...

  2. 图像显示 imshow()[OpenCV 笔记5]

    void imshow(const string& winname InputArray mat); winname 窗口表识名称 mat 需要显示的图像.InputArray类型,声明如下 ...

  3. 查找并绘制轮廓[OpenCV 笔记XX]

    好久没有更新了,原谅自己放了个假最近又在赶进度,所以...更新的内容是很靠后的第八章,因为最近工作要用就先跳了,后面会更新笔记编号...加油加油! 在二值图像中寻找轮廓 void cv::findCo ...

  4. 实例:图形绘制[OpenCV 笔记15]

    DrawShapes.cxx # include "DrawShapes_utils.h" #define WINDOW_NAME1 "Painting 1" ...

  5. 颜色空间转换 cvtColor()[OpenCV 笔记13]

    void cvtColor(InputArray src, OutputArray dst, ) src: 输入图像 dst: 输出图像 code: 颜色空间转换标识符 OpenCV2的CV_前缀宏命 ...

  6. 鼠标操作[OpenCV 笔记10]

    ) winname 窗口名字 onMouse 指定窗口每次鼠标事件发生的时候,被调用的函数指针.函数的原型应为void Foo(int event, int x, int y, int flags, ...

  7. 实例:图像载入、显示、混合与输出[OpenCV 笔记8]

    是的是的,忍着尿意努力更新,就是为了更到wuli男神的部分,当然要把男神放在前面镇楼,欢迎下载配图,具体操作见code wuliEddie.jpg logo.png results.jpg LoadS ...

  8. OpenCV Tricks[OpenCV 笔记3]

    官方例程 事例程序位于opencv-3.1.0/samples/cpp/ 目录下,可以通过编译整个工程,编译所有的Sample Code 显示当前使用的OpenCV版本 CV_VERSION为标识当前 ...

  9. 视频处理简单实例 [OpenCV 笔记2]

    VideoCapture是OpenCV 2.X中新增的类,提供从摄像机或视频文件捕获视频的C++接口.利用它读入视频的方法一般有两种: // method 1 VideoCapture capture ...

随机推荐

  1. Floyd-Warshall算法的理解

    Floyd算法可以求图内任意两点之间的最短路径,三重循环搞定,虽然暴力,但是属于算法当中最难的动态规划的一种,很有必要理解. 花了一晚上和半个下午专门看这个,才看个一知半解,智商被碾压没办法. 我一直 ...

  2. POJ3009 Curling 2.0

    正式做POJ的第一题,做出来后又看了别人的代码,就又完善了一下,也通过了.参考 http://blog.sina.com.cn/s/blog_4abcd9bc0100phzb.html 改了之后觉得写 ...

  3. <转>Windows 各种计时函数总结

    本文转自MoreWindows 特此标识感谢 http://blog.csdn.net/morewindows/article/details/6854764 本文对Windows平台下常用的计时函数 ...

  4. poj1273--Drainage Ditches(最大流Edmond-Karp算法 邻接表实现)

    最大流模板题 大部分Edmond-Karp算法代码都是邻接矩阵实现,试着改成了邻接表. #include <iostream> #include <cstdio> #inclu ...

  5. CSS 中常用的选择器(选择符)

    一.标签选择器:直接将HTML标签(Tag)作为选择器,可以是p.h1.dl.strong等HTML标签.如: p { font:12px;}em { color:blue;}dl { float:l ...

  6. Android学习之 博客专栏 与 资料

    android | Android Developers Android学习系列 - 谦虚的天下 - 博客园 android基础 - 生如夏花之灿烂 - 博客园 Android开发 - 皓月繁星 - ...

  7. Android Developers:拖动和缩放

    这个课程描述了如何使用手势来拖拽和缩放屏幕的对象,使用onTouchEvent()方法来获取触摸事件.这里是这节课程使用的源代码. 拖动一个对象 ——————————————————————————— ...

  8. DevExpress MessageBox 弹出框 底层类

    效果图: 前台调用: //图一的前台调用 MessageBox.Show("测试", "标题", MessageBoxButtons.OK); //图二的前台调 ...

  9. WINFORM跟随WPF窗体移动

    <Window x:Name="mainWindow1" x:Class="WpfApplication9.MainWindow"         xml ...

  10. POJ 3670 , 3671 LIS

    题意:两题意思差不多,都是给你一个序列,然后求最少需要改变多少个数字,使得成为一个最长不升,或者最长不降子序列. 当然3671是只能升序,所以更简单一点. 然后就没有什么了,用二分的方法求LIS即可. ...