opencv2库基础函数的详解

 今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像。

目录

【imread】图像读取

【namedWindow】创建window窗口

【imshow】图像显示

【imwrite】图像写入文件

【waitKey】等待按键按下

前言

 在说正文之前先简单介绍一下Mat类。Mat类是opencv2.0的主流图像类型,在之前opencv1.0使用的Iplimage*类型,Iplimage*是C语言接口类型,使用Iplimage*时需要考虑到关闭窗口时图形内存的释放问题。而使用Mat则在一定程度上不需要手动管理内存,窗口关闭时会自动释放图像内存。

以下两点这是我在运行程序时遇到的问题,当然如果大家没有碰到的话就可以直接无视了。

第一点是关于waitKey()函数的,在学习图像显示之前我先写了一个waitKey()等待按键按下退出的程序。

复制代码

 1 int main()
 2 { 
 3     int c;
 4     while (1)
 5     {
 6         c = waitKey(0);
 7         if (c == 27||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
 8             break;
 9     }
10     return 0;
11 }

复制代码

发现这个程序无论我怎么按按键都没有用。一通百度之后终于发现在waitKey()函数的说明文档中有这么一段注意事项:

翻译过来就是waitKey()函数只有存在一个或一个以上highGUI窗口并且该窗口处于激活状态时才有效。于是我修改了以上代码如下:

复制代码

 1 int main()
 2 {
 3     int c;
 4     Mat img1 = imread("1.jpg");
 5     namedWindow("图像显示");
 6     while (1)
 7     {
 8         imshow("图像显示", img1);//显示图像
 9         c = waitKey(0);
10         if (c == 27||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
11             break;
12     }
13     return 0;
14 }

复制代码

测试之后发现还是不可以,于是博主又是一通折腾,将我创建的窗口移一下位置,发现我创建的窗口竟然有两个:

无论怎么点前面带图像的窗口都没有把窗口激活,只有点后面那个不带图像的才算选择窗口,然后按键才有效。到这里已经测试实现了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窗口并且窗口处于激活作态时才有效。

实例

复制代码

 1 //************头文件包含*************
 2 #include "stdafx.h"
 3 #include<iostream>
 4 #include<opencv.hpp>//包含opencv的头文件
 5 //***********************************
 6 
 7 
 8 //************命名空间***************
 9 using namespace cv;//使用opencv命名空间
10 using namespace std;
11 //***********************************
12 
13 
14 //************主函数*****************
15 int main()
16 { 
17     int c;
18     Mat img1 = imread("1.jpg");
19 
20     namedWindow("图像显示");//创建窗口
21 
22     while (1)
23     {
24         imshow("图像显示", img1);//显示图像
25     
26         c = waitKey(0);//等待按键按下
27         if (c == 27||char(c) == 'q'|| char(c) == 'Q')//按下Q键或者ESC键退出程序
28             break;
29     }
30     
31     return 0;
32 }

复制代码

运行之后的显示结果:

转自:https://www.cnblogs.com/nicewe/p/8461983.html

猜你喜欢

转载自blog.csdn.net/yuhuqiao/article/details/83753625