目标
在本教程里你将会学到:
1.加载一张图片(使用imread)
2.创建一个名字叫OpenCV的窗口(使用namedWindow)
3.在OpenCV窗口显示一张图片(使用 imshow)
源码
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <iostream>
using namespace cv;//--opencv命名空间
using namespace std; //--c++命名空间
int main( int argc, char** argv )
{
if( argc != 2)
{
cout <<" Usage: display_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;
}
说明
在OpenCV2中,我们有多个模块。每一个模块都是一种图像处理方法。您可以在这些教程本身的用户指南的结构中观察到这一点。在使用其中任何一个模块之前,首先需要包含声明每个模块内容的头文件。
你们几乎总是使用:
1.core部分,这里定义了库的基本构建块
2.highgui模块,因为它包含输入和输出操作的功能
// Video Image PSNR and SSIM
#include <iostream> // for standard I/O
#include <string> // for strings
我们还包括iostream,以方便控制台行输出和输入。为了避免数据结构和函数名与其他库冲突,opencv有自己的命名空间:cv。为了避免需要在每个关键字之前添加cv:关键字,您可以使用以下行导入整个文件中的命名空间:
using namespace cv;
using namespace std;
这对于stl库也是如此(用于控制台I/O)。现在,让我们分析一下主要的功能。我们开始确保我们从命令行获得一个有效的图像名称参数。
if( argc != 2)
{
cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;
return -1;
}
然后创建一个mat对象,该对象将存储加载图像的数据
Mat image;
现在我们调用加载由第一个参数(argv[1])指定的图像名称的imread函数。第二个参数指定了我们想要图像的格式。这可能是:
1.CV_LOAD_IMAGE_UNCHANGED (<0) 按原样加载图像(如果存在,则包括alpha通道)
2.CV_LOAD_IMAGE_GRAYSCALE ( 0) 将图像加载为强度图像
3.CV_LOAD_IMAGE_COLOR (>0) 以rgb格式加载图像
Image=imread(argv[1],cv_load_image_color);/读取文件
注意:OpenCV支持图像格式Windows位图(BMP)、便携式图像格式(PBM、PGM、ppm)和太阳光栅(Sr,ras)。在插件的帮助下(如果您构建了自己的库,您需要指定使用它们,但是在默认情况下,我们提供的包中),您也可以加载像jpeg(jpeg,j pg,jpe),jpeg2000(jp2-在cmake中以jasper命名),tiff文件(tiff,tif)和便携式网络图形(Png)这样的图像格式。此外,OpenExr也是一种可能性。
在检查图像数据是否正确加载后,我们希望显示我们的图像,因此我们使用namedWindow函数创建一个opencv窗口。一旦您创建了窗口,opencv会自动管理。为此,您需要指定它的名称,以及它的大小和角度。可能是:
1.如果不使用qt后端,则只支持CV_WINDOW_AUTOSIZE 。在这种情况下,窗口大小将占用它显示的图像的大小。不允许调整大小!
2.在qt上CV_WINDOW_NORMAL ,您可以使用它来允许窗口调整大小。图像将根据当前窗口大小调整自己的大小。通过使用|运算符,您还需要指定是否希望图像保持其纵横比(cv_window_keepratio)或不(cv_window_freeratio)。
WINDOW_NORMAL 用户便可以改变窗口的大小(没有限制)
WINDOW_AUTOSIZE 窗口大小会自动调整以适应所显示的图像,大小固定。
WINDOW_OPENGL 窗口创建的时候便会支持OpenGL
namedWindow( "Display window", CV_WINDOW_AUTOSIZE );// 创建一个用于显示的窗口.
最后,使用imshow函数更新opencv窗口的内容。指定要在此操作期间更新的opencv窗口名称和要使用的图像:
imshow( "Display window", image ); // 在窗口里面显示图片
因为我们希望我们的窗口被显示,直到用户按下一个键(否则程序会结束得太快),所以我们使用Waitkey函数,它的唯一参数是它应该等待多长时间的用户输入(以毫秒计)。零意味着永远等待。
waitKey(0); //等待键盘按键
结果
编译代码,然后运行可执行文件,给出一个图像路径作为参数。如果您在windows上,可执行遗嘱当然也包含一个exe扩展。当然,确保图像文件靠近您的程序文件。
./DisplayImage HappyFish.jpg
你应该得到一个很好的窗口,如下所示: