您的位置:首页 > 运维架构

opencv 2.x学习笔记(一)加载和显示图像

2014-07-06 16:40 573 查看
opencv即计算机视觉库,其中封装了许多关于图像处理和计算机视觉算法的函数,为我们的使用提供了极大的便利性。图像操作是opencv中最基本的操作。作为入门的第一篇,下面首先简单的介绍一下,如何加载和显示一张图像。

源代码:

#include <iostream>
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

using namespace std;
using namespace cv;

int main(int argc, char* argv[])
{
if( argc != 2 )
{
cout << "Usage: dispay_image ImageToLoadAndDisplay" << endl;
return -1;
}

Mat image;
image = imread( argv[1], CV_LOAD_IMAGE_COLOR );

if( !image.data )
{
cout << "Could not open or find the image" << std::endl;
return -1;
}

namedWindow( "Display window", CV_WINDOW_AUTOSIZE );
imshow( "Display window", image );

waitKey(0);
return 0;
}


分析:

opencv 2.x采用了多模块的结构。每一个模块集中解决某一类问题。在使用这些模块之前,我们应该首先包含该模块的头文件。例如,在本程序中使用到了两个opencv头文件,分别对应core模块和highgui模块。

core模块:opencv的核心功能模块,报了了opencv的基本数据结构等。
highgui模块:高层GUI图形用户界面,包含媒体的I/O输出,视频捕捉、图像和视频的编码解码、图形交互界面的借口等内容。

为了避免opencv中的数据结构和函数名称与其他类库中的名称发生冲突,opencv提供了cv名称空间。我们可以在程序开始处使用using指令来声明cv名称空间。或者使用cv::前缀来使用opencv所提供的数据结构和函数。

下面进入主函数进行分析。

为了确保我们能够获得一个有效的图像名称,我们使用了argc参数进行判断。如下所示:

if( argc != 2 )
{
cout << "Usage: dispay_image ImageToLoadAndDisplay" << endl;
return -1;
}


(注:对argc和argv不了解的可以参考http://www.cnblogs.com/avril/archive/2010/03/22/1691477.html)

接着,我们创建了一个Mat对象用来存储用来加载的图像。

我们使用imread函数来加载图像,该函数有两个参数,第一个参数指示要加载的图像名称,第二个参数为加载图像类型,可以有以下几种方式。

CV_LOAD_IMAGE_UNCHANGED:这个标识在新版本中被废置了,忽略。
CV_LOAD_IMAGE_ANYDEPTH:若载入的图像的深度为16位或者32位,就返回对应深度的图像,否则,就转换为8位图像再返回。
CV_LOAD_IMAGE_COLOR:
RGB格式来加载图像。
CV_LOAD_IMAGE_GRAYSCALE:始终将图像转换成灰度1

在检查图像数据是否正确加载之后,我们想要显示我们的图像,首先我们应该使用namedWindow函数创建一个opencv窗口,这个窗口创建后就被opencv自动管理。我们需要传入窗口的名称和窗口的标识符。常用标识符如下:

WINDOW_NORMAL:用户可以改变窗口的大小。
WINDOW_AUTOSIZE:窗口大小自动调整以适应所显示的图像,不能够手动改变窗口大小。

最后,我们需要使用imshow函数来更新opencv窗口以显示我们要加载的图像,我们只需要传递窗口的名称,和Mat对象。
我们想要当用户按下一个按钮后,窗口才消失。否则,窗口会一闪而过。我们使用waitKey函数来实现。这个函数只有一个参数,表示我们想要等待的毫秒数,0表示将一直等待下去。

程序运行结果:



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: