OpenCV图像读取(imread) 显示(imshow) 保存(imwrite)的冷知识点

2024-02-06 17:58

本文主要是介绍OpenCV图像读取(imread) 显示(imshow) 保存(imwrite)的冷知识点,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

OpenCV图像读取(imread) 显示(imshow) 保存(imwrite)的冷知识点,虽然很基础,但也有用。

一、读取图像:imread() 与imreadmulti()

    1. imread()函数第二个参数flags有很多选择,如下:

//! Imread flags
enum ImreadModes {IMREAD_UNCHANGED            = -1, //!< If set, return the loaded image as is (with alpha channel, otherwise it gets cropped). Ignore EXIF orientation.IMREAD_GRAYSCALE            = 0,  //!< If set, always convert image to the single channel grayscale image (codec internal conversion).IMREAD_COLOR                = 1,  //!< If set, always convert image to the 3 channel BGR color image.IMREAD_ANYDEPTH             = 2,  //!< If set, return 16-bit/32-bit image when the input has the corresponding depth, otherwise convert it to 8-bit.IMREAD_ANYCOLOR             = 4,  //!< If set, the image is read in any possible color format.IMREAD_LOAD_GDAL            = 8,  //!< If set, use the gdal driver for loading the image.IMREAD_REDUCED_GRAYSCALE_2  = 16, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/2.IMREAD_REDUCED_COLOR_2      = 17, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/2.IMREAD_REDUCED_GRAYSCALE_4  = 32, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/4.IMREAD_REDUCED_COLOR_4      = 33, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/4.IMREAD_REDUCED_GRAYSCALE_8  = 64, //!< If set, always convert image to the single channel grayscale image and the image size reduced 1/8.IMREAD_REDUCED_COLOR_8      = 65, //!< If set, always convert image to the 3 channel BGR color image and the image size reduced 1/8.IMREAD_IGNORE_ORIENTATION   = 128 //!< If set, do not rotate the image according to EXIF's orientation flag.};

        默认是IMREAD_COLOR 模式读取,会将图片转为3通道BGR彩图,读入进来type变成了CV_8UC3,如果你想以原本类型读取,那就选择IMREAD_UNCHANGED,那么图像原本是什么类型,读进来还是什么类型,这个参数主要在我们读取一些16位或者32为浮点型图像时就比较有用,因为一些计算需要这样的类型,有时候也为了计算提高精度。            

        2. imreadmulti()函数是用来一次性读取多张图片的,看下定义:

CV_EXPORTS_W bool imreadmulti(const String& filename, CV_OUT std::vector<Mat>& mats, int flags = IMREAD_ANYCOLOR);

        一个string类型的文件路径,输出是Mat类型的vector,也就是多张图像,比如这里我有一张tif格式的图片,它本来是2张图片组成的,那么我就可以一次性读进来,然后对vector进行处理,避免我对图片路径进行字符串的格式化。

二、显示图像:namedWindow() 和 imshow()  

      1. imshow()函数默认显示窗口模式是WINDOW_AUTOSIZE,它的好处是可以根据图像的大小自动调整大小显示,缺点是不能调整窗口大小,如果你想调整窗口大小,那么就要先使用namedWindow()函数,并将第二个参数设置为WINDOW_NORMAL

//! Flags for cv::namedWindow
enum WindowFlags {WINDOW_NORMAL     = 0x00000000, //!< the user can resize the window (no constraint) / also use to switch a fullscreen window to a normal size.WINDOW_AUTOSIZE   = 0x00000001, //!< the user cannot resize the window, the size is constrainted by the image displayed.WINDOW_OPENGL     = 0x00001000, //!< window with opengl support.WINDOW_FULLSCREEN = 1,          //!< change the window to fullscreen.WINDOW_FREERATIO  = 0x00000100, //!< the image expends as much as it can (no ratio constraint).WINDOW_KEEPRATIO  = 0x00000000, //!< the ratio of the image is respected.WINDOW_GUI_EXPANDED=0x00000000, //!< status bar and tool barWINDOW_GUI_NORMAL = 0x00000010, //!< old fashious way};

      2. 另外一个冷门知识点是imshow显示的时候,我们可以选中窗口,进行图片的复制(Ctrl + C)和保存(Ctrl + S)

int main()
{Mat img = imread("./lena.jpg", IMREAD_UNCHANGED);if (img.empty()){cout << "Image is empty, please check again!" << endl;return -1;}namedWindow("img", WINDOW_NORMAL);imshow("img", img);while (1){if (waitKey(0) == 27)break;}return 0;
}

          可以用上一段代码尝试,先选中窗口,然后按下Ctrl + C,打开画图工具或者PPT进行粘贴,或者Ctrl + S会弹出对话框保存本地,很方便调,避免去加imwrite().

三、保存图像:imwrite()   

      1. 大家比较熟悉的应该是用imwrite()来保存单张图片,我们也可以用它来一次性保存多张图片到一个文件中,看函数说明:

       下面是代码演示:

vector<Mat>imgs;
Mat img1 = imread("./1.jpg", IMREAD_UNCHANGED);
Mat img2 = imread("./2.jpg", IMREAD_UNCHANGED);
imgs.push_back(img1);
imgs.push_back(img2);
imwrite("result.tif", imgs);

        保存之后看不出来?那就用imreadmulti()函数来读取,代码如下:

vector<Mat>imgs;
imreadmulti("./result.tif", imgs, IMREAD_UNCHANGED);
cout << imgs.size() << endl;
//多张图片可以使用for循环来读取
imshow("1", imgs.at(0));
imshow("2", imgs.at(1));
waitKey(0);

         .tif这个格式如果你用过halcon就会经常看到它的身影, 为什么老是用它?

这篇关于OpenCV图像读取(imread) 显示(imshow) 保存(imwrite)的冷知识点的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/685106

相关文章

使用Python和OpenCV库实现实时颜色识别系统

《使用Python和OpenCV库实现实时颜色识别系统》:本文主要介绍使用Python和OpenCV库实现的实时颜色识别系统,这个系统能够通过摄像头捕捉视频流,并在视频中指定区域内识别主要颜色(红... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间详解

OpenCV实现实时颜色检测的示例

《OpenCV实现实时颜色检测的示例》本文主要介绍了OpenCV实现实时颜色检测的示例,通过HSV色彩空间转换和色调范围判断实现红黄绿蓝颜色检测,包含视频捕捉、区域标记、颜色分析等功能,具有一定的参考... 目录一、引言二、系统概述三、代码解析1. 导入库2. 颜色识别函数3. 主程序循环四、HSV色彩空间

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot读取ZooKeeper(ZK)属性的方法实现

《SpringBoot读取ZooKeeper(ZK)属性的方法实现》本文主要介绍了SpringBoot读取ZooKeeper(ZK)属性的方法实现,强调使用@ConfigurationProperti... 目录1. 在配置文件中定义 ZK 属性application.propertiesapplicati

RedisTemplate默认序列化方式显示中文乱码的解决

《RedisTemplate默认序列化方式显示中文乱码的解决》本文主要介绍了SpringDataRedis默认使用JdkSerializationRedisSerializer导致数据乱码,文中通过示... 目录1. 问题原因2. 解决方案3. 配置类示例4. 配置说明5. 使用示例6. 验证存储结果7.

Python中文件读取操作漏洞深度解析与防护指南

《Python中文件读取操作漏洞深度解析与防护指南》在Web应用开发中,文件操作是最基础也最危险的功能之一,这篇文章将全面剖析Python环境中常见的文件读取漏洞类型,成因及防护方案,感兴趣的小伙伴可... 目录引言一、静态资源处理中的路径穿越漏洞1.1 典型漏洞场景1.2 os.path.join()的陷

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

C/C++的OpenCV 进行图像梯度提取的几种实现

《C/C++的OpenCV进行图像梯度提取的几种实现》本文主要介绍了C/C++的OpenCV进行图像梯度提取的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录预www.chinasem.cn备知识1. 图像加载与预处理2. Sobel 算子计算 X 和 Y

C/C++和OpenCV实现调用摄像头

《C/C++和OpenCV实现调用摄像头》本文主要介绍了C/C++和OpenCV实现调用摄像头,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录准备工作1. 打开摄像头2. 读取视频帧3. 显示视频帧4. 释放资源5. 获取和设置摄像头属性