OpenCV从入门到放弃(四):HighGui组件细讲

来源:互联网 发布:康耐视视觉检测软件 编辑:程序博客网 时间:2024/05/16 15:20

一.基本操作

Ⅰ.窗口创建和销毁

把窗口创建放在最前面讲是因为窗口创建应该是最基础最基础的了。而且窗口创建会让很多人搞晕,没错,这么简单的地方能够让很多人搞晕。更多的应该是因为不熟悉。
一般来说,在前面的一些简单例子中,我们并没有用到创建窗口这个函数,因为imshow()就会创建窗口了(也许你现在也不知道imshow()到底是什么东西,后面马上就会讲到)
我习惯于创建窗口之后然后进行显示,因为这样能够更加清楚一个程序中各个部件的构成。
http://docs.opencv.org/3.1.0/d7/dfc/group__highgui.html#ga851ccdd6961022d1d5b4c4f255dbab34

有关的函数:
创建窗口(namedWindow()):
作用:创建一个窗口作为图像或者轨迹条的”安置处”,(要是已经有一个同名的窗口,那么这个函数什么也不做)

原型void cv::namedWindow ( const String &  winname,            int  flags = WINDOW_AUTOSIZE                 )     winname:窗口名,你自己指定.且以后这个名字就和这个窗口联系起来了!    Flags:窗口类型,有WINDOW_NORMAL(用户能够改变窗口大小),WINDOW_AUTOSIZE(窗口适应显示的图像),WINDOW_OPENGL(窗口支持openGL)

销毁窗口:

//销毁所有的window    cv::destroyAllWindows ()//销毁某个window    void cv::destroyWindow (const String &  winname)    Winname:待销毁的窗口名称

更多的,还有moveWindow(),resizeWindow(),setWindowproperty(),setWindowTitle()这些函数来改变窗口的一些性质,可以自己根据需要看文档来使用.

Ⅱ.图像载入,显示和输出

1.图像的载入:imread()函数

原型:Mat cv::imread ( const String &  filename,int  flags = IMREAD_COLOR )        Filename:就是图片完整的路径和文件名(当然在工作目录下面写个完整的文件名就行了)    Flags:载入类型,指定的是加载图像的颜色的类型(自带默认值为1,所以常常很多时候调用的时候没有加上这个参数).注意!OpenCV2的flag和OpenCV3的flag不一样,我们这里以OpenCV3的为主!

这里是所有的flag(载入类型):

IMREAD_UNCHANGED:载入源图像,并添加alpha通道. (常用) IMREAD_GRAYSCALE:始终将图像转换为灰度图再返回(常用选项)   IMREAD_COLOR:总是转换图像为3通道(BGR注意顺序)的彩色图像(常用选项)     IMREAD_ANYDEPTH:如果设置了这个,且载入的图像深度为16位/32位,那么就返回相应深度的图像,否则,   转换为8位返回(常用) IMREAD_ANYCOLOR:如果设置了,那么就载入任意可能的颜色格式而不进行转换. (常用)IMREAD_LOAD_GDAL :If set, use the gdal driver for loading the image.IMREAD_REDUCED_GRAYSCALE_2:如果设置了这个,图像总是转换为单通道灰度图,且尺寸缩减为1/2  IMREAD_REDUCED_COLOR_2:图像总是转换为彩色3通道BGR且尺寸缩减为1/2.    IMREAD_REDUCED_GRAYSCALE_4:同上,灰度,缩减为1/4     IMREAD_REDUCED_COLOR_4 :同上,彩色,缩减为1/4    IMREAD_REDUCED_GRAYSCALE_8:同上,灰度,缩减为1/8     IMREAD_REDUCED_COLOR_8:同上,彩色,缩减为1/8 

2.图像的显示:imshow()函数

原型:void cv::imshow ( const String &  winname,InputArray mat)    Winname:待安放窗口名称,没有这个名字的话,自己会创建一个    Mat:需要显示的Mat类型(一般我们把InputArray类型当做Mat类型)

如果窗口是用的CV_WINDOW_AUTOSIZE(默认值)标志创建的,那么显示图像原始大小.否则,将图像缩放以适合窗口.
Imshow缩放图像,取决于图像的深度.
要是载入的图像是8位无符号类型,那么就显示图像本来的样子,如果图像是16位无符号类型或者32位整形,使用像素值除以256.也就是说,值得范围从[0,255*256]映射到[0,255],要是图像是32位浮点型,那么像素便要乘以255.值得范围从[0,1]映射到[0,255]

3.输出图像到文件:imwrite()函数

原型:bool cv::imwrite (const String & filename,InputArray  img,const std::vector< int > &  params = std::vector< int >() )     Filename:需要写入的完整文件名,且必须带扩展名,因为要根据扩展名来指定图片格式    Img:一般填一个Mat类型的图像数据    Const vector<int>& 类型的参数params:表示为特定格式保存的参数编码,一般取默认就行,更加详细的介绍看官方文档:

http://docs.opencv.org/3.1.0/d4/da8/group__imgcodecs.html#gga61d9b0126a3e57d9277ac48327799c80af660544735200cbe942eea09232eb822

读写显示综合实例:

代码:

#include <iostream>#include <opencv2/core.hpp>#include <opencv2/highgui.hpp>int main(){    //创建4个窗口    cv::namedWindow("win1");    cv::namedWindow("win2");    cv::namedWindow("win3");    cv::namedWindow("win4");    cv::namedWindow("win5");    //以IMREAD_UNCHANGED模式读取图片    cv::Mat pic1 = cv::imread("1.jpg", cv::IMREAD_UNCHANGED);    cv::imshow("win1", pic1);    //以IMREAD_GRAYSCALE模式读取图片    cv::Mat pic2 = cv::imread("1.jpg", cv::IMREAD_GRAYSCALE);    cv::imshow("win2", pic2);    //以IMREAD_COLOR模式读取图片    cv::Mat pic3 = cv::imread("1.jpg", cv::IMREAD_COLOR);    cv::imshow("win3", pic3);    //以IMREAD_ANYDEPTH模式读取图片    cv::Mat pic4 = cv::imread("1.jpg", cv::IMREAD_ANYDEPTH);    cv::imshow("win4", pic4);    //以IMREAD_ANYDEPTH模式读取图片    cv::Mat pic5 = cv::imread("1.jpg", cv::IMREAD_REDUCED_COLOR_8);    cv::imshow("win5", pic5);    //写入图片pic4,实际上,我们一般只带两个参数就够了    //生成两种不同的格式    cv::imwrite("newpic.jpg", pic4);    cv::imwrite("newpic2.png", pic4);    cv::waitKey(0);    return 0;}

结果:
这里写图片描述
文件夹下面也生成了两个文件!
这里写图片描述

0 0
原创粉丝点击