zoukankan      html  css  js  c++  java
  • Opencv的imread用法

    所有参考来自网上仅仅做学习记录用,具体正确性需要在具体项目各自验证,不涉及具体错误代码处理调试等问题,欢迎发现发现问题~

    参考:

    1. https://blog.csdn.net/LiheZhu/article/details/50485317

    2. https://mangoroom.cn/opencv/opencv-learning-imread.html

    1.该函数位于Highgui.h和Loadsave.cpp文件中。 

    Mat imread( const string& filename, int flags )          {               Mat img;               imread_( filename, flags, LOAD_MAT, &img );               return img;          } 接下来看一下imread_函数中关于flags的部分

             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);
             }
    

    其中,CV_LOAD_IMAGE_XXX定义位于Highgui_c.h文件中

            enum              // 枚举 (enum)
            {
            /* 8bit, color or not */
               CV_LOAD_IMAGE_UNCHANGED  =-1,
            /* 8bit, gray */
               CV_LOAD_IMAGE_GRAYSCALE  =0,
            /* ?, color */
               CV_LOAD_IMAGE_COLOR      =1,
            /* any depth, ? */
               CV_LOAD_IMAGE_ANYDEPTH   =2,
            /* ?, any color */
               CV_LOAD_IMAGE_ANYCOLOR   =4
            };

    由此,我们可以得出如下结论:

    flags = -1:imread按解码得到的方式读入图像   //  =    CV_LOAD_IMAGE_UNCHANGED

    flags = 0:imread按单通道的方式读入图像,即灰白图像   //  =   CV_LOAD_IMAGE_GRAYSCALE

    flags = 1:imread按三通道方式读入图像,即彩色图像   //  =   CV_LOAD_IMAGE_COLOR

    2       

    想要完整全面地学习opencv,仅凭阅读samples的示例源码是不够的。毕竟opencv是一个拥有非常多函数的程序库,所以在每学习一个函数时,芒果觉得有必要记录下来,分享给有需要的同学。于是,就有了这一篇的开始,以后的这个就归为opencv函数学习的系列了,篇幅应该都会比较短。

    imread函数

    imread函数作用

    imread函数的作用非常简单,从函数的名称也可以看出来,imread为image read的缩写,即图像读取的意思,。那么imread函数的作用就很明显了,负责读取图像。其实学过matlab的同学就会知道,matlab中也有一个读取图像的函数也命名为imread,这是opencv借鉴了matlab而命名的,因为在opencv1.x时代,加载图像的函数并不叫imread,二是由cvLoadImage函数负责。

    imread函数原型

    话不多说,先了解imread函数的原型,从opencv的最新document可以查阅到imread原型为

    imread c++原型

    #include <opencv2/imgcodecs.hpp>
    Mat cv::imread    (    const String &     filename,
    int     flags = IMREAD_COLOR 
    )        
    

    imread python原型

    Python:
    retval    =    cv.imread(    filename[, flags]    )

    可以看到,imread函数原型非常简单,可以总结为三点

    • 返回值,Mat 类型, 即返回读取的图像,读取图像失败时返回一个空的矩阵对象(Mat::data == NULL)
    • 参数1 filename, 读取的图片文件名,可以使用相对路径或者绝对路径,但必须带完整的文件扩展名(图片格式后缀)
    • 参数2 flags, 一个读取标记,用于选择读取图片的方式,默认值为IMREAD_COLOR,flag值的设定与用什么颜色格式读取图片有关

    参数1 补充:

    imread函数支持读取的图像格式有

    • Windows bitmaps - .bmp, .dib (always supported)
    • JPEG files - .jpeg, .jpg, *.jpe (see the Note section)
    • JPEG 2000 files - *.jp2 (see the Note section)
    • Portable Network Graphics - *.png (see the Note section)
    • WebP - *.webp (see the Note section)
    • Portable image format - .pbm, .pgm, .ppm .pxm, *.pnm (always supported)
    • PFM files - *.pfm (see the Note section)
    • Sun rasters - .sr, .ras (always supported)
    • TIFF files - .tiff, .tif (see the Note section)
    • OpenEXR Image files - *.exr (see the Note section)
    • Radiance HDR - .hdr, .pic (always supported)
    • Raster and Vector geospatial data supported by GDAL (see the Note section) Note

    参数2 补充:

    这些flags值被定义在enum cv::ImreadModes枚举类里面

    c++定义python定义说明
    -1 IMREAD_UNCHANGED Python: cv.IMREAD_UNCHANGED 如果设置,则按原样返回加载的图像(使用Alpha通道,否则会被裁剪)
    0 IMREAD_GRAYSCALE Python: cv.IMREAD_GRAYSCALE 如果设置,则始终将图像转换为单通道灰度图像(编解码器内部转换)。
    1 IMREAD_COLOR Python: cv.IMREAD_COLOR 如果设置,请始终将图像转换为3通道BGR彩色图像。
    2 IMREAD_ANYDEPTH Python: cv.IMREAD_ANYDEPTH 如果设置,则在输入具有相应深度时返回16位/ 32位图像,否则将其转换为8位。
    IMREAD_ANYCOLOR Python: cv.IMREAD_ANYCOLOR 如果设置,则以任何可能的颜色格式读取图像。
     IMREAD_LOAD_GDAL Python: cv.IMREAD_LOAD_GDAL 如果设置,使用gdal驱动程序加载图像
    IMREAD_REDUCED_GRAYSCALE_2 Python: cv.IMREAD_REDUCED_GRAYSCALE_2 如果设置,则始终将图像转换为单通道灰度图像,图像尺寸减小1/2。
    IMREAD_REDUCED_COLOR_2 Python: cv.IMREAD_REDUCED_COLOR_2 如果设置,则始终将图像转换为3通道BGR彩色图像,图像尺寸减小1/2。
    IMREAD_REDUCED_GRAYSCALE_4 Python: cv.IMREAD_REDUCED_GRAYSCALE_4 如果设置,则始终将图像转换为单通道灰度图像,图像尺寸减小1/4
    IMREAD_REDUCED_COLOR_4 Python: cv.IMREAD_REDUCED_COLOR_4 如果设置,则始终将图像转换为3通道BGR彩色图像,图像尺寸减小1/4
    IMREAD_REDUCED_GRAYSCALE_8 Python: cv.IMREAD_REDUCED_GRAYSCALE_8 如果设置,则始终将图像转换为单通道灰度图像,图像尺寸减小1/8。
    IMREAD_REDUCED_COLOR_8 Python: cv.IMREAD_REDUCED_COLOR_8 如果设置,则始终将图像转换为3通道BGR彩色图像,图像尺寸减小1/8。
    IMREAD_IGNORE_ORIENTATION Python: cv.IMREAD_IGNORE_ORIENTATION 如果设置,请不要根据EXIF的方向标志旋转图像。

    #include<iostream>

    #include<opencv2/opencv.hpp>

    using namespace cv;

    using namespace std;

    int main()

    {

        //read the image

        Mat image = imread("./clock.jpg");

        if (image.data != NULL)

        {

            //show the image

            imshow("clock", image);

            waitKey(0);

        }

        else

        {

            cout << "can&apos;t openc the file!" << endl;

            getchar();

        }

        return 0;

    }

    尾巴

    opencv的官方文档document其实是一份非常好的资料,关于opencv的几乎都可以在上面查阅得到,不过缺点就是文档为全英文的,这个需要自己克服一下。


    本文由芒果浩明发布,转载需注明来源。 本文链接:https://mangoroom.cn/opencv/opencv-learning-imread.html

  • 相关阅读:
    memset函数具体说明
    几种常见模式识别算法整理和总结
    GridView编辑删除操作
    Linux的文件夹配置
    Js apply 方法 具体解释
    深入分析C++引用
    Sizzle.selectors.relative [ 源代码分析 ]
    中文分词国内现状
    [数字图像处理]图像去噪初步(2)--非线性滤波器
    线程间共享数据的一个样例
  • 原文地址:https://www.cnblogs.com/MCSFX/p/11337448.html
Copyright © 2011-2022 走看看