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
- WINDOW_NORMAL:用户可以改变窗口的大小。
- WINDOW_AUTOSIZE:窗口大小自动调整以适应所显示的图像,不能够手动改变窗口大小。
最后,我们需要使用imshow函数来更新opencv窗口以显示我们要加载的图像,我们只需要传递窗口的名称,和Mat对象。
我们想要当用户按下一个按钮后,窗口才消失。否则,窗口会一闪而过。我们使用waitKey函数来实现。这个函数只有一个参数,表示我们想要等待的毫秒数,0表示将一直等待下去。