目标:

1.从图片文件打开图片(imread)

2.显示图片(namedWindow和imshow)

3.转换当前图片为灰色图片(cvtColor)

4.保存图片(imwrite)

代码:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/opencv.hpp>
#include <iostream> using namespace cv;
using namespace std;
int main(int argc,char ** argv)
{
Mat image;
//从文件中加载图片到image
image = imread("lena.jpg",CV_LOAD_IMAGE_COLOR);
//如果图片加载失败
if (!image.data )
{
cout<<"read image failed"<<endl;
return -;
}
//创建显示图片窗口
namedWindow("Ori Pic",WINDOW_AUTOSIZE);
//显示窗口
imshow("Ori Pic",image);
//等待用户按键
waitKey(); //创建一个新矩阵用于
Mat grayImage;
//将图片转换成灰色,保存在grayimage中
cvtColor(image,grayImage,CV_BGR2GRAY);
//保存grayimage到文件
imwrite("lena_gray.jpg",grayImage); //创建灰色图片窗口
namedWindow("Gray Pic",WINDOW_AUTOSIZE);
//显示灰色图片
imshow("Gray Pic",grayImage);
//等待用户按键
waitKey();
return ;
}

API说明:

Mat:储存图片数据的结构,后面会详细说明。

Mat imread(const string& filename, int flags= )

filename:需要加载的文件名

flags:加载图像的颜色类型,可以取以下值。

CV_LOAD_IMAGE_ANYDEPTH 如果设置了则返回16/32位图像,如果没设置,则返回8位图像
CV_LOAD_IMAGE_COLOR 返回8位图像
CV_LOAD_IMAGE_GRAYSCALE 返回灰度图像
> 返回一个三通道图像
= 返回灰色图像
< 返回带有α通道的图像
void namedWindow(const string& winname, int flags=WINDOW_AUTOSIZE )

winname:窗口名字,也是窗口的标识符

flags:创建窗口标识,可以为以下值

WINDOW_NORMAL 窗口可以无约束的修改大小
WINDOW_AUTOSIZE 自动设置窗口大小为和图片适应的大小,并且不能修改
WINDOW_OPENGL 可以创建一个支持OpenGL的窗口
void imshow(const string& winname, InputArray mat)

winname:窗口的名字

mat:显示的图片数据。

此函数一般同waitkey同用,waitKey(0) 显示窗口直到用户按下键,waitkey(10) 显示窗口10ms。

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn= )

src 输入的图片
dst 和src有着相同的尺寸和深度(depth)的输出图片缓存区
code 颜色空间转换码
dstCn 目标缓存区的颜色通道,如果为0则设置和源图像相同的通道

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

filename:保存文件名

img:保存的图片

params:指定格式的数据存储的容器,以这种格式出现,paramId_1, paramValue_1,paramId_2, paramValue_2.

对于JPEG图像:parmId可以为:CV_IMWRITE_JPEG_QUALITY表示图片质量。paramValue_1可以为0-100(越高图片质量越好),默认是95。

对于PNG图像:parmId可以为:CV_IMWRITE_PNG_COMPRESSION 表示压缩等级。paramValue_1可以为0-9(越高图片越小),默认是3。

对于PPM, PGM, 和PBM图像:parmId可以为:CV_IMWRITE_PXM_BINARY 表示二进制格式化标志(binary format flag)。paramValue_1可以为0或1。默认是1。

显示效果

运行上面代码:

首先显示彩色图片:

10秒过后

同时当前目录增加了一张名为lena_gray.jpg的图片。

本文结束。

OpenCV入门:(二:加载,显示,修改以及保存图片)的更多相关文章

  1. SDWebImage 加载显示 GIF 与性能问题

    SDWebImage 加载显示 GIF 与性能问题 SDWebImage 4.0 之前,可以用 UIImageView 显示 GIF 图.如果 SDWebImage 4.0 还这么做,只会显示静态图. ...

  2. SDWebImage 加载显示 WebP 与性能问题

    SDWebImage 加载显示 WebP 与性能问题 本文包含自定义下载操作 SDWebImageDownloaderOperation 与编码器 SDWebImageCoder.SDWebImage ...

  3. 一个页面从输入URL到加载显示完成,发生了什么?

    面试经典题--URL加载 一.涉及基本知识点: 1. 计算机网络 五层因特尔协议栈: 应用层(dns.http):DNS解析成IP并完成http请求发送: 传输层(tcp.udp):三次握手四次挥手模 ...

  4. bootstrap模态框modal使用remote第二次加载显示相同内容解决办法

    bootstrap模态框modal使用remote动态加载内容,第二次加载显示相同内容解决办法 bootstrap的modal中,使用remote可以动态加载页面到modal-body中,并弹窗显示 ...

  5. [ActionScript 3.0] AS3.0 动态加载显示内容

    可以将下列任何外部显示资源加载到 ActionScript 3.0 应用程序中: 在 ActionScript 3.0 中创作的 SWF 文件 — 此文件可以是 Sprite.MovieClip 或扩 ...

  6. 一个页面从输入url到页面加载显示完成,中间都经历了什么

    第一种解释: 一般会经历以下几个过程: 1.首先,在浏览器地址栏中输入url 2.浏览器先查看浏览器缓存-系统缓存-路由器缓存,如果缓存中有,会直接在屏幕中显示页面内容.若没有,则跳到第三步操作. 3 ...

  7. 浏览器加载显示html页面内容的顺序

    我们经常看到浏览器在加载某个页面时,部分内容先显示出来,又有些内容后显示.那么浏览器加载显示html究竟是按什么顺序进行的呢 其实浏览器加载显示html的顺序是按下面的顺序进行的:1.IE下载的顺序是 ...

  8. Mybatis源码解析(二) —— 加载 Configuration

    Mybatis源码解析(二) -- 加载 Configuration    正如上文所看到的 Configuration 对象保存了所有Mybatis的配置信息,也就是说mybatis-config. ...

  9. jquery预加载显示百分比

    jquery预加载显示百分比 <pre> <img class="bj loadimg" loadimg="/weiqingshu/images/1/b ...

  10. 1.BMap(百度地图)第二次加载显示不全

    问题: bmap第一次加载显示没问题: 第二次 再次加载这个页面时,地图的显示出现了问题: . 分析问题出现原因:你要确保dom创建后且处于显示状态(即display不能为none)才能再次初始化地图 ...

随机推荐

  1. linux服务基础之CentOS6编译安装mariadb

    1. 下载mariadb https://downloads.mariadb.org/mariadb/+releases/ 2. 解压到指定目录 # tar xf mariadb--linux-x86 ...

  2. 2018.12.26 Mac下的Eclipse在编辑Spring配置文件xml时自动提示类class包名配置

    1.先查看下自己的Eclipse是什么版本,步骤如下: 2.选择Install New Software 3.输入网址 http://dist.springsource.com/release/TOO ...

  3. 2017.9.5 Java知识点总结

    1.*程序的数据操作往往都在内存中操作的,也就是说数据运算都在内存中完成. 2.*什么是变量? --变量就是内存中的一块用来存放数据的存储单元. --变量中的值可变 --我们通过变量名就可以找到内存中 ...

  4. c#运用this.invoke() 在多线程时对UI进行修改

    什么是进程呢?当一个程序开始运行时,它就是一个进程,进程所指包括运行中的程序和程序所使用到的内存和系统资源.而一个进程又是由多个线程所组成的,线程是程序中的一个执行流,每个线程都有自己的专有寄存器(栈 ...

  5. Webstorm 添加新建.vue文件功能并支持高亮vue语法和es6语法

    添加新建.vue文件功能 ①Webstorm 右上角File-Plugins 搜索vue如果没有就去下载 点击serch in repositories ②点击安装vue.js ③安装成功后点击右下角 ...

  6. 创建git项目的feature分支以及下载特定分支的仓库代码

    在掌握了基础git的使用后可以按照这个步骤来: 下载项目:git clone <仓库地址>如果要下载非master的某分支代码:git clone -b <分支名> <仓 ...

  7. 百练oj 2815:城堡问题(dfs)

    传送门: http://bailian.openjudge.cn/practice/2815 2815:城堡问题 查看 提交 统计 提示 提问 总时间限制: 1000ms 内存限制: 65536kB ...

  8. ng-repeat 指令(带有数组)

    <!DOCTYPE html><html><head><meta http-equiv="Content-Type" content=&q ...

  9. springboot 整合dubbo 消费模块引入springboot 之后自动注入jdbc 模块导致启动报错问题

    方案一: 排除方法 pom文件直接将数据起步模块内排除数据源自动注入 jdbc jar <!--mybatis-plus 集成 --><!--mybitis--><dep ...

  10. Sass 基础(八)

    @import Sass 支持所有css 的@规则,以及一些Sass 专属的规则,也被称为“指令(directive)”.这些规则在Sass 中具有不同的 功效,详细解释如下. @import Sas ...