——from Tutorial Section 1.15"Load and Display an Image"
(本文基于OpenCV Tutorials 2.4.11.0进行编写,为符合中文阅读习惯,主要按照译者的理解,进行意译和摘译。代码运行环境为VS2013+OpenCV 2.4.11)
通过本节内容,读者将学习到以下操作:
1.使用imread加载图像;
2.使用namedWindow创建OpenCV命名窗口;
3.使用imshow在第2步创建的窗口中显示图像。
加载和显示图像的示例代码:
#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
int main( int argc, char** argv )
{
// 加载图像
String imageName( "../data/HappyFish.jpg" ); // 路径改成你自己的
if( argc > 1)
{
imageName = argv[1];
}
Mat image;
image = imread( imageName, CV_LOAD_IMAGE_COLOR); // 读取图像文件
if( image.empty() ) // 确认输入图像的有效性
{
cout << "Could not open or find the image" << std::endl ;
return -1;
}
// 创建命名窗口
namedWindow( "Display window", WINDOW_AUTOSIZE );
// 在命名窗口中显示图像
imshow( "Display window", image );
// 窗口等待用户按键退出
waitKey(0);
return 0;
}
代码说明
示例代码开头引用了两个重要的头文件core.hpp和highgui.hpp,其中,前者定义了和CV库基本框架搭建相关的函数,后者则主要提供输入输出接口。
紧接着,为省去添加类前缀“cv::”的麻烦,并使程序能够使用STL库,使用了以下命名空间:
using namespace cv;
using namespace std;
然后,进入主函数main()。
在main()中,首先判断程序是否带启动参数argc(图片路径)。如不带启动参数,则采用代码中默认的路径。然后创建一个Mat对象,用于保存imread()返回的图像数据。imread()返回后,检查输入图像的有效性。
// 加载图像
String imageName("../data/HappyFish.jpg" ); // 路径改成你自己的
if( argc > 1)
{
imageName = argv[1];
}
Mat image;
image = imread( imageName, CV_LOAD_IMAGE_COLOR);// 读取图像文件
if( image.empty() ) // 确认输入图像的有效性
{
cout << "Could not open or find the image"<< std::endl ;
return -1;
}imread()包含两个参数,参数1是图像路径,参数2指定读取格式。imread()支持以下三种读取格式:
CV_LOAD_IMAGE_UNCHANGED:按图像原始格式读取
CV_LOAD_IMAGE_GRAYSCALE:灰度图
CV_LOAD_IMAGE_COLOR:以RGB格式读取
如果未指定参数2,则默认格式为CV_LOAD_IMAGE_COLOR。
目前主流的图片格式,如jpeg、bmp、tif、png等,imread()都支持。
namedWindow( "Displaywindow", WINDOW_AUTOSIZE );
确认输入图像的有效性后,程序调用namedWindow()函数创建一个命名窗口。创建出来的窗口由OpenCV自动管理,用户只需要指定窗口名称(参数1),以及按何种方式显示大小(参数2)。其中,参数2可指定为WINDOW_AUTOSIZE和WINDOW_NORMAL,WINDOW_AUTOSIZE是默认值,代表窗口大小和图像大小保持一致。WINDOW_NORMAL只有在QT平台才能使用,代表图像大小随当前窗口大小进行显示。
窗口创建后,调用imshow()在创建的窗口上显示图像。imshow()的第一个参数指定窗口的名称,第二个参数为前面读取到的图像。
imshow( "Displaywindow", image );
最后,调用waitKey(0),让窗口一直保持显示状态,直到发生用户按键事件。waitKey()只有一个参数,该参数的单位是毫秒,如果设为0,则表示无限等待。
程序编译运行效果如下: