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

来源:互联网 发布:四等水准测量算法 编辑:程序博客网 时间:2024/04/30 02:16

        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表示将一直等待下去。

程序运行结果:






0 0