【opencv学习笔记五】一个简单程序:图像读取与显示
今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像。
目录
【imread】图像读取
【namedWindow】创建window窗口
【imshow】图像显示
【imwrite】图像写入文件
【waitKey】等待按键按下
前言
在说正文之前先简单介绍一下Mat类。Mat类是opencv2.0的主流图像类型,在之前opencv1.0使用的Iplimage*类型,Iplimage*是C语言接口类型,使用Iplimage*时需要考虑到关闭窗口时图形内存的释放问题。而使用Mat则在一定程度上不需要手动管理内存,窗口关闭时会自动释放图像内存。
以下两点这是我在运行程序时遇到的问题,当然如果大家没有碰到的话就可以直接无视了。
第一点是关于waitKey()函数的,在学习图像显示之前我先写了一个waitKey()等待按键按下退出的程序。
int main()
{
int c;
while ()
{
c = waitKey();
if (c == ||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
break;
}
return ;
}
发现这个程序无论我怎么按按键都没有用。一通百度之后终于发现在waitKey()函数的说明文档中有这么一段注意事项:
翻译过来就是waitKey()函数只有存在一个或一个以上highGUI窗口并且该窗口处于激活状态时才有效。于是我修改了以上代码如下:
int main()
{
int c;
Mat img1 = imread("1.jpg");
namedWindow("图像显示");
while ()
{
imshow("图像显示", img1);//显示图像
c = waitKey();
if (c == ||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
break;
}
return ;
}
测试之后发现还是不可以,于是博主又是一通折腾,将我创建的窗口移一下位置,发现我创建的窗口竟然有两个:
无论怎么点前面带图像的窗口都没有把窗口激活,只有点后面那个不带图像的才算选择窗口,然后按键才有效。到这里已经测试实现了waitKey()函数的作用。但是有强迫症的博主当然不能容忍有两个同名窗口。于是又是一通百度。发现了两个解决发法。亲测都可用:
1.之前博主是在debug模式下运行的,调到release模式下就可以。但是都说了博主有强迫症怎么就想在debug模式下使用,所以博主用的是第二这个方法。
2.在配置VS环境的时候,我们按照网上大部分的教程(包括博主自己转载的教程),在配置附加依赖项的时候将debug版本与release版本的都添加了,所以会出现上面的问题,把debug下配置的不带d的lib删掉就可以了。需要注意的是,如果勾选的从父项继承,而父项里面有不带d的lib时,上述问题还是会出现。博主取消了勾选父项继承,不知道以后会不会有问题。
正文
【imread】图像读取
Mat imread( const String& filename, int flags = IMREAD_COLOR );
第一个参数const string& filename:要读取的文件名称。需要注意的是这里给的图片名称是带有后缀的,并且后缀需要与文件后缀一致。这个文件名称可以是图片的绝对路径(F:\\2.jpg或F:/2.jpg)也可以是相对路径。当给相对路径时,必须将该图片放到工程目录与.cpp文件统一目录下。图片格式可以是一下类型之一:
- Windows bitmaps - \*.bmp, \*.dib (always supported)
- JPEG files - \*.jpeg, \*.jpg, \*.jpe (see the *Notes* section)
- JPEG 2000 files - \*.jp2 (see the *Notes* section)
- Portable Network Graphics - \*.png (see the *Notes* section)
- WebP - \*.webp (see the *Notes* section)
- Portable image format - \*.pbm, \*.pgm, \*.ppm \*.pxm, \*.pnm (always supported)
- Sun rasters - \*.sr, \*.ras (always supported)
- TIFF files - \*.tiff, \*.tif (see the *Notes* section)
- OpenEXR Image files - \*.exr (see the *Notes* section)
- Radiance HDR - \*.hdr, \*.pic (always supported)
- Raster and Vector geospatial data supported by Gdal (see the *Notes* section)
第二个参数int flags:读取的图片格式。图片格式可以是imageMode枚举:
IMREAD_UNCHANGED = -1, //读取原图
IMREAD_GRAYSCALE = 0, //灰度图像
IMREAD_COLOR = 1, //彩色图像
IMREAD_ANYDEPTH = 2, //原图图像深度
IMREAD_ANYCOLOR = 4, //原图色彩
IMREAD_LOAD_GDAL = 8, //
IMREAD_REDUCED_GRAYSCALE_2 = 16, //
IMREAD_REDUCED_COLOR_2 = 17, //
IMREAD_REDUCED_GRAYSCALE_4 = 32, //
IMREAD_REDUCED_COLOR_4 = 33, //
IMREAD_REDUCED_GRAYSCALE_8 = 64, //
IMREAD_REDUCED_COLOR_8 = 65, //
IMREAD_IGNORE_ORIENTATION = 128 //
【namedWindow】创建window窗口
void namedWindow(const String& winname, int flags = WINDOW_AUTOSIZE);
第一个参数const string& winname:要创建的窗口名称。窗口名称是窗口的唯一标识,如果要创建的窗口名称已经存在,则该函数不执行任何操作。
第二个参数int flags:窗口属性。支持WindowFlags枚举:
WINDOW_NORMAL = 0x00000000, //用户可任意调整窗口大小(无限制)
WINDOW_AUTOSIZE = 0x00000001, //根据图像自动调整窗口大小,用户不可调节
WINDOW_OPENGL = 0x00001000, //
WINDOW_FULLSCREEN = 1, //全屏
WINDOW_FREERATIO = 0x00000100, //最大化
WINDOW_KEEPRATIO = 0x00000000, //保持原图比例
WINDOW_GUI_EXPANDED=0x00000000, //
WINDOW_GUI_NORMAL = 0x00000010, //
【imshow】图像显示
void imshow(const String& winname, InputArray mat);
第一个参数const string& winname:用于显示图片的窗口。
第一个参数InputArray mat:要显示的图像数据。
【imwrite】图像写入文件
bool imwrite( const String& filename, InputArray img,
const std::vector<int>& params = std::vector<int>());
第一个参数const string& filename:文件名称。支持的文件类型与imread相同。
第二个参数InputArray img:图像数据。
第三个参数params:图像保存的参数,可以不填。
【waitKey】等待按键按下
int waitKey(int delay = 0);
等待按键按下。括号内参数为延时时间,单位是毫秒ms,有默认参数0,当参数为0时表示一直等待按键按下。需要说明的是waitKey()函数只有在至少有一个window窗口并且窗口处于激活作态时才有效。
实例
//************头文件包含*************
#include "stdafx.h"
#include<iostream>
#include<opencv.hpp>//包含opencv的头文件
//*********************************** //************命名空间***************
using namespace cv;//使用opencv命名空间
using namespace std;
//*********************************** //************主函数*****************
int main()
{
int c;
Mat img1 = imread("1.jpg"); namedWindow("图像显示");//创建窗口 while ()
{
imshow("图像显示", img1);//显示图像 c = waitKey();//等待按键按下
if (c == ||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
break;
} return ;
}
运行之后的显示结果:
下载
功能很简单,代码很少,建议自己写一下或者在博文中复制一下,当然实在是懒的不要不要的土豪可以去下面的连接直接下载。
【opencv学习笔记五】一个简单程序:图像读取与显示的更多相关文章
- OpenCV学习笔记:resize函数改变图像的大小
OpenCV提供了resize函数来改变图像的大小,函数原型如下: , , int interpolation=INTER_LINEAR ); 参数解释: src:输入,原图像,即待改变大小的图像: ...
- c++学习笔记---03---从一个小程序说起2
从一个小程序说起2 要求:编写一个程序,要求用户输入一串整数和任意数目的空格,这些整数必须位于同一行中,但允许出现在该行中的任何位置.当用户按下键盘上的"Enter"键时,数据输入 ...
- Android学习笔记_70_一个应用程序启动另一个应用程序的Activity
第一种(我自己写的) :之前在网上看来一些,很多不是我要的可以启动另外一个应用程序的主Activity. //这些代码是启动另外的一个应用程序的主Activity,当然也可以启动任意一个Activit ...
- c++学习笔记---02---从一个小程序说起
从一个小程序说起 这一讲的主要目的是帮助大家在C语言的背景知识上与C++建立联系. 问题探索 问题:对一个整型数组求和. 要求:定义一个存储着 n 个元素的数组,要求用C语言完成这个任务. 赶紧的:大 ...
- blfs(systemv版本)学习笔记-制作一个简单的桌面系统
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 大概思路: lfs(系统)+xorg(驱动)+i3-wm(窗口+桌面)+lightdm(显示管理器+登录管理器) 链接: lfs ...
- python新手第一天学习笔记-第一个ptyhon程序和python变量
一.python 的注释和第一个python 程序 : 1.单行注释 # Author Xiajq 2.多行注释 ''' ------------注释内容----------------------- ...
- Oracle学习笔记:一个简单的行转列例子
一个简单的行列转换例子,原始数据. create table temp_cwh_student ( name ), subject ), score ) ) select * from temp_cw ...
- (学习笔记3)BMP位图的读取与显示
在(学习笔记2)中.我们已经具体说明怎样去创建MFC.在这节中.主要解决BMP位图照片的读取和显示问题. 我们新建一个projectdemo1.创建步骤请看(学习笔记2)中具体说明. 创建成功后,例如 ...
- cpp学习笔记 1一个简单的小程序以及一些的知识点
今天买的cpp到了从今天開始又一次学习cpp如今发现学校发的书真的不怎莫样. <em>#include<stdio.h>//预处理命令 int main()/*第一个被调用的函 ...
随机推荐
- sqlite3常用操作命令 和mysql的区别及优缺点
SQLite 的数据库权限只依赖于文件系统,没有用户帐户的概念. sqlite3 testdb.db .databases 命令查看数据库列表 create table tbl(name char(1 ...
- php eval()计算
php中的eval()函数可以处理php代码,因此可以用此来解决:以字符串格式存储的计算公式 比如: $str='2*(3+12)'; $s=eval("return $str;" ...
- gulp的使用方法
---恢复内容开始--- 什么是gulp? Gulp.js是一个自动化构建工具,开发者可以使用它在项目开发过程中自动执行常见任务. 使用步骤: 1.全局安装gulp: npm install - ...
- 2017-2018-1 20179209《Linux内核原理与分析》第四周作业
本周学习内容为<跟踪分析MenuOS简单linux系统的启动过程>和教材中的进程调度及内核数据结构. 一.跟踪分析Linux内核的启动过程 这个实验我是在实验楼环境中完成的,最初想在自己的 ...
- Hadoop集群部署-Hadoop 运行集群后Live Nodes显示0
可以尝试以下步骤解决: 1 ,分别删除:主节点从节点的 /usr/local/hadoop-2.6.2/etc/tmp 下得所有文件; 2: 编辑cd usr/local/hadoop-2.6. ...
- Chart.js 动态图表的使用
一.相关资料 1. 简介 Chart.js 是一个基于 HTML5 的简单的面向对象的图表库,支持包括 IE7/8 和所有现代浏览器.支持六种图标:曲线图(Linecharts).柱状图(Barcha ...
- [2018-12-18]ABP中的AsyncCrudAppService介绍
前言 自从写完上次略长的<用ABP入门DDD>后,针对ABP框架的项目模板初始化,我写了个命令行工具Abp-CLI,其中子命令abplus init可以从github拉取项目模板以初始化项 ...
- PAT 天梯赛 L3-003. 社交集群 【并查集】
题目链接 https://www.patest.cn/contests/gplt/L3-003 思路 并查集 用一个 cou[i] 来表示 第 i 门课程 的第一个 感兴趣的人 并的时候 判断 cou ...
- 简单学习github代码托管
之前尝试使用阿里云code做代码托管 egret+git+阿里云code搭建团队开发 ,现在来学习一下使用 Github做代码托管服务. 总体上看使用的步骤差不多,都需要使用GIT客户端来进行相关的操 ...
- android 电池(一):锂电池基本原理篇【转】
本文转载自:http://blog.csdn.net/xubin341719/article/details/8497830 关键词:Android 电池关机充电 androidboot.mode ...