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

参考:

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位。
4 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

Opencv的imread用法的更多相关文章

  1. OpenCV CommandLineParser 的用法

    OpenCV CommandLineParser 的用法 去百度了一下,关键字:OpenCV CommandLineParser  发现,最多的讲解是:opencv源码解析之(5):CommandLi ...

  2. OpenCV中imread失败cvLoadImage成功

    MYLAF 环境说明 编程环境:Windows 10(64bit), VS2013, OpenCV 2.4.12; 编程语言:C/C++: MYLAF 现象 在代码中,调用imread读取图片失败,但 ...

  3. VS中OpenCV用imread读取不到图片

    转自:https://blog.csdn.net/u012423865/article/details/78116059 在VS中OpenCV用imread读取不到图片 今天在Visual Studi ...

  4. imread()用法|| root权限

    1.ushort用法? USHORT is a macro which is not part of the official C++ language (it's probably defined ...

  5. opencv用imread( argv[1], 1)读取图片

    显示一幅图:主要是运用功能:imread namedWindow imshowimread:从字面意思我们就可以看懂,用来读取图片的:namedWindow:显然,我们也可以看到这是用来命名窗口名称的 ...

  6. opencv : imread()的应用

    概述: imread()是opencv中用于读取图片的一个工具.怎么读取图片看似一个很简单的工作,但实际上也有一些细节需要我们注意,以避免在后续的操作中出现bug. 函数原型: 函数原型: Mat i ...

  7. 【opencv】imread 赋值 深拷贝浅拷贝

    import cv2 import copy import os def filter_srcimg(dstimg): ss=3 srcimg=copy.deepcopy(dstimg) #aa=5 ...

  8. 【opencv】imread CV_LOAD_IMAGE_GRAYSCALE

    转灰度图的操作很多,但是opencv中的CV_LOAD_IMAGE_GRAYSCALE的具体操作为: gray = 0.299 * r + 0.587 * g + 0.114 * b 然后,小数点部分 ...

  9. opencv的imread函数相对路径问题和 main 参数问题

    参考: https://blog.csdn.net/u013404374/article/details/80178822 https://blog.csdn.net/fujilove/article ...

随机推荐

  1. MySql 错误:In aggregated query without GROUP BY, expression #1 of SELECT list contains....

    前段时间做sql注入的时候  使用group_concat时,出现标题上的错误.经查阅一位大佬的博客,成功解决!故写此博文! 当mysql的sql_mode是only_full_group_by的时候 ...

  2. 前后端API交互如何保证数据安全性?

    前言 前后端分离的开发方式,我们以接口为标准来进行推动,定义好接口,各自开发自己的功能,最后进行联调整合.无论是开发原生的APP还是webapp还是PC端的软件,只要是前后端分离的模式,就避免不了调用 ...

  3. java 注解开发

    目录 注解 JDK自带的注解三个 注解分类 按照运行机制 按照来源分类 自定义注解的语法要求 元注解 解析注解 获取注解的注解 Spring中的注解 组合注解 注解 JDK自带的注解三个 @Overr ...

  4. 深入了解Netty【四】IO模型

    引言 IO模型就是操作数据输入输出的方式,在Linux系统中有5大IO模型:阻塞式IO模型.非阻塞式IO模型.IO复用模型.信号驱动式IO模型.异步IO模型. 因为学习Netty必不可少的要了解IO多 ...

  5. 【原创】经验分享:一个Content-Length引发的血案(almost....)

    前言 上周在工作中遇到一个问题,挺有意思,这里记录一下.上周在工作中遇到一个问题,挺有意思,这里记录一下.标题起的很唬人,这个问题差点引发血案,花哥还是很严谨的一个人,后面备注了almost.... ...

  6. vue 多环境打包

    https://cli.vuejs.org/zh/guide/mode-and-env.html#%E6%A8%A1%E5%BC%8F 模式 模式是 Vue CLI 项目中一个重要的概念.默认情况下, ...

  7. -1>1?! unsigned int的世界不简单

    编程语言提供了很多的基本数据类型,比如char,int,float,double等等.在C和C++的世界中,还有一种类型,叫做无符号数据,修饰符位unsigned,比如今天要说的unsigned in ...

  8. boot 项目启动报Cannot datermine embedded database driver class for database type NONE

    部署boot项目时报Cannot datermine embedded database driver class for database type NONE数据库链接什么的也都没有问题,经过百度 ...

  9. 通达OA任意用户登录漏洞复现

    前言 今年hw挺火爆的,第一天上来就放王炸,直接搞得hw暂停 昨天晚上无聊,复现了一下通达oa的洞,也有现成的exp可以使用,比较简单 0x00 漏洞概述 通达OA是一套国内常用的办公系统,此次发现的 ...

  10. django之models报错

    django 执行python manage.py makemigrations报错:TypeError: __init__() missing 1 required positional argum ...