Opencv 例程讲解1 ----如何载入并显示图片

来源:互联网 发布:好用的面部乳液 知乎 编辑:程序博客网 时间:2024/06/05 04:06

       今天介绍一个简单的但最常用的例程,从电脑中读入图片并显示出来。如果小伙伴们已经编译好了tutorial和examle例程程序(没有的可以参考Opencv 例程讲解 开头篇----window下例程编译),可以在tutorial文件夹下找到一个名叫“(TUTORIAL) introduction_windows_vs”,或者”(TUTORIAL) display_image“的例程程序,这两个程序是一样的。

源代码如下(中文部分为我自己的理解):

#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <iostream>using namespace cv;using namespace std;int main( int argc, char** argv ){    if( argc != 2)    //参数个数2个, 使用示例  Project.exe imagePath/test.jpg    {     cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;     return -1;    }    Mat image;  // opencv中最主要的数据存储格式    image = imread(argv[1], IMREAD_COLOR); // Read the file      // 为highgui库中的API 函数,第一个参数为图片路径,可以是相对路径也可以是绝对路径,第二个参数控制读入图片的方式,可以有以下几种选择    //  IMREAD_UNCHANGED =-1    // 8bit, color or not    //  IMREAD_GRAYSCALE    = 0    // 8bit, gray    //  IMREAD_COLOR            = 1    //  color    //  IMREAD_ANYDEPTH      = 2   // any depth,    //   IMREAD_ANYCOLOR     = 4   //  any color   //  以上为在highgui.hpp中的定义,感觉还是不是很具体, if(! image.data ) // Check for invalid input  //  data为Mat  格式的数据入口指针,默认为uchar* 类型,没有数据时候,为空    {        cout << "Could not open or find the image" << std::endl ;        return -1;    }    namedWindow( "Display window", WINDOW_AUTOSIZE ); // Create a window for display.   // 为highgui库中的API函数    // 有两个参数,第一个参数为窗口名,类型为std::string,第二个参数为窗口控制参数,通常设置为 WINDOW_NORMAL 或 WINDOW_AUTOSIZE    imshow( "Display window", image ); // Show our image inside it.                                            // 为highgui库中的API 函数    // 有两个参数,第一参数为窗口名,可以获得窗口handle,第二个参数为要显示的图像     waitKey(0); // Wait for a keystroke in the window       return 0;}

可以看出来,例程通过main参数传递图片路径,可以在cmd下输入命令运行程序。


如果不想觉得cmd命令行显示图片过于麻烦,我们可以直接指定图片的路径,注释掉以下语句,然后给定图片路径,即可,第二个参数可以不填,默认IMREAD_COLOR

//     if( argc != 2)//     {//      cout <<" Usage: display_image ImageToLoadAndDisplay" << endl;//      return -1;//     }    Mat image;//    image = imread(argv[1], IMREAD_COLOR); // Read the fileimage = imread("F:\\image_set\\lena.jpg");


注意,这里的路径输入需要用 \\ ,

按下任意键,程序结束。

另外,imread的第二个参数如 IMREAD_COLOR 等,在highgui.hpp中说明不是很详细,如果想要了解,imread过程中,这个参数到底是如何起作用的,我们可以在源码中找到答案,跟踪进入imread的源码文件中,我们可以发现以下这个参数通过以下语句来发挥作用

     int type = decoder->type();    if( flags != -1 )    {        if( (flags & CV_LOAD_IMAGE_ANYDEPTH) == 0 )            type = CV_MAKETYPE(CV_8U, CV_MAT_CN(type));        if( (flags & CV_LOAD_IMAGE_COLOR) != 0 ||           ((flags & CV_LOAD_IMAGE_ANYCOLOR) != 0 && CV_MAT_CN(type) > 1) )            type = CV_MAKETYPE(CV_MAT_DEPTH(type), 3);        else            type = CV_MAKETYPE(CV_MAT_DEPTH(type), 1);    }
其中,type为图片解码后的类型,flags即为传人的第二个参数,从if语句的控制流可以看出,当传人参数不是IMREAD_ANYDEPTH时候,Mat 的默认创建类型为CV_8U,表示一个像素点数据用8位的无符号char表示,值的范围为0~255,当传人参数中有IMREAD_COLOR时,通道为3;当传人参数有IMREAD_ANYCOLOR时,则根据源图像的通道数决定,如果是单通道的灰度图像,则也为灰度图像,如果通道数>1,则也为3通道;如果是IMREAD_GRAYSCALE则为单通道;如果是CV_LOAD_IMAGE_UNCHANGED,则按照原图type创建。注意IMREAD_ANYDEPTH可以与IMREAD_ANYCOLOR或者IMREAD_COLOR配合使用,如果只有IMREAD_ANYDEPTH输入的话,则默认以单通道载入图像。



0 0