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

原文地址:https://www.cnblogs.com/MCSFX/p/11337448.html

时间: 2025-01-12 20:01:03

Opencv的imread用法的相关文章

【OpenCV】imread读取数据为空

直接加配置好的props文件到新的工程时,会出现imread读出来的Mat为空的情形,搜了一下,发现是opencv的配置问题!!! 是这样的,之前配置时为了省事儿,无论是Debug还是Release中的附加依赖项,都添加了所有的lib,也就是没有分Debug和Release. 但实际上OpenCv是要分的,文件名尾带d的为Debug库函数,不带d的为Release库函数.只需将其中库函数分开添加进附加依赖项即可: 其他版本以此类推. Debug库: opencv_calib3d244d.libo

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

显示一幅图:主要是运用功能:imread namedWindow imshowimread:从字面意思我们就可以看懂,用来读取图片的:namedWindow:显然,我们也可以看到这是用来命名窗口名称的:imshow:这个自然就是来显示窗口的,窗口内的当然就是要显示的图片了. 代码来自OpenCV Tutorials 这个文件很好用的,推荐~代码仅供参考: #include<cv.h>   //cv.h OpenCV的主要功能头文件,务必要:#include<highgui.h> /

opencv之imread()

imread()图像为载入函数 //函数原型: imread(const string& filename,int flag); 参数一:const string& filename 传入参数为文件名字. 支持图片格式: 1.windows位图:*.bmp,*.dib; 2.JPEG文件:*.jpg,*.jpe,*.jpeg; 3.JPEG 2000 文件; 4.PNG 图片:*.png; 5.便携文件格式; 6.Sun rasters; 7.TIFF文件; 参数二:int flag参入参

将opencv的imread()函数读取的图片用QLabel显示

switchPicture.py from PyQt5.QtCore import * from PyQt5.QtWidgets import * from PyQt5.QtGui import * import numpy as np import cv2 import sys class MyWidget(QWidget): def __init__(self, parent = None): super().__init__(parent) self.setWindowTitle(self

[opencv] cvCopy高级用法

cvCopy(srcimage,dstimage,maskimage);//srcimage,dstimage,maskimage:pIplImage //srcimage,dstimage,maskimage必须为相同大小的图片,如果maskimage只有某一部分区域的灰度值为255,则 此函数的作用是将srcimage的对应部分区域复制到dstimage中去. cvCopy(srcimage,dstimage);//这样情况下,是将srcimage全部区域的图片信息复制到dstimage中去

opencv matchTemplate函数用法

模板匹配函数,就是在一幅图中,找到另外一幅的在本图的相似的地方 CV_EXPORTS_W void matchTemplate( InputArray image, InputArray templ,OutputArray result, int method, InputArray mask = noArray() ); image是输入的图像, templ 是输入的模板图像, result是保存的结果矩阵,可以通过minMaxLoc函数确定矩阵的最大值和最小值 method是图像匹配的方法:

imread() not working in OpenCV 2.4.11 Debug mode

The OpenCV function imread() not working in OpenCV 2.4.11 Debug mode of VS2010 under Win32, the way we want to make it work is to change it to Release mode, then everything works fine, ENJOY!

OpenCV成长之路:直线、轮廓的提取与描述

http://ronny.blog.51cto.com/8801997/1394139 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://ronny.blog.51cto.com/8801997/1394139 基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. 一.Canny检测轮

OpenCV入门教程之八 直线、轮廓的提取与描述

基于内容的图像分析的重点是提取出图像中具有代表性的特征,而线条.轮廓.块往往是最能体现特征的几个元素,这篇文章就针对于这几个重要的图像特征,研究它们在OpenCV中的用法,以及做一些简单的基础应用. 一.Canny检测轮廓 在上一篇文章中有提到sobel边缘检测,并重写了soble的C++代码让其与matlab中算法效果一致,而soble边缘检测是基于单一阈值的,我们不能兼顾到低阈值的丰富边缘和高阈值时的边缘缺失这两个问题.而canny算子则很好的弥补了这一不足,从目前看来,canny边缘检测在