Linux37:利用OPENCV 的imread读取图片信息和imwrite写入数据

目录

1.imread的定义

2.imread读取图片并输出图片属性

2.1.imread读取三通道的彩色图像

2.2.imread读取单通道的灰度图像

3.imwrite的定义

4.代码实现imwrite保存图片


1.imread的定义

在OPENCV中常用imread去读取图片信息,下面我们来看看imread的定义.

Mat imread( const String& filename, int flags = IMREAD_COLOR );

第一个参数:filename图片的名称,名称可以是绝对路径也可以是相对路径

第二个参数:flags标识符,flags标识符默认为IMREAD_COLOR。

返回值:Mat矩阵

flags一般分为三种:

  • IMREAD_UNCHANGED(<O)按原样加载图像(包括alpha通道(如果存在)
  • IMREAD_GRAYSCALE(0)将图像作为强度加载
  • IMREAD_COLOR(>0)以RGB格式加载图像

2.imread读取图片并输出图片属性

2.1.imread读取三通道的彩色图像

本章节主要是讲解如何通过代码去实现OPENCV读取图片,并且输出它的图片信息,下面是具体的代码实现:

Mat img_mat = imread("frame1.jpg");

printf("width = %d, height = %d, channels = %d \n", img_ mat.cols, img_ mat.rows, img_mat.channels());

输出结果:width =1920, height =1080, channels =3

2.2.imread读取单通道的灰度图像

Mat img_mat_gray = imread("gray_framel.jpg", IMREAD_GRAYSCALE);

printf( "img_mat_gray_width = %d, img_mat_gray_height = %d, img_mat_gray_channels = %dln", iimg_mat_gray_.cols,img_mat_gray.rows, img_mat_gray.channels());

输出的结果: img_mat_gray_width = 1920, img_ mat_gray_height = 1080, img_mat_gray_chahnels = 1

3.imwrite的定义

在OPENCv中常用 imwrite 去保存图片,下面我们来看看imwrite的定义.

bool imwrite(const Strings filename, InputArray image, const std::vector<int>& params);

第一个传参:filenamme表示要保存的文件名

第二个传参:image表示需要保存的图像数据

第三个传参:paramns保存图像可选参数,主要是设置图像的质量,设置规则具体的我们来看看,该参数需要按照参数id+参数值成对出现,可以出现多对参数值(比如(paramId_1,paramValue_1,paramId_2,paramValue_2,...)),但必须保证这些参数对是相关的,比如保存JPG图像时,只能使用和JPEG相关的参数ID进行组合使用。

paramns的ID基本上是cv::ImwriteFlags.下面我们来看看ImwriteFlags的定义:

  • cv::IMWRITE_JPEG_QUALITY:设置JPEG图像的质量,范围为0到100,数值越高质量越好,但文件大小也会相应增加。
  • CV::IMWRITE_PNG_COMPRESSION:设置PNG图像的压缩级别,范围为0(无压缩)到9(最大压缩),数值越小压缩率越高,但文件大小也会相应增加。
  • CV::IMWRITE_PXM_BINARY:将PXM图像保存为二进制格式,不进行任何压缩。

4.代码实现imwrite保存图片

4.1.使用默认的方式imwrite保存图片

Mat mat = Mat(300,300,CV_8UC3,Scalar(218,112,214));

imwrite("mat_demo.jpg",mat);

上面是使用默认的方法保存图片,这种方法的所有参数都是默认选项。

4.2.使用 params 的方式 imwrite 保存图片

Mat quality_framel_mat = imread("framel.jpg");

std::vector<int> params = {cv::IMWRITE_JPEG_QUALITY, 40};

imwrite("quality_mat_demo.jpg", quality_frame1_mat, params);

这种方法使用的是params参数的方式去设置,上面我们设置了图像的质量在40,大家如果想设置其他功能可以参考上面的枚举进行设置。经过编码质量40的处理后的图像大小小于原图像大小,这说明编码质量关乎着文件的大小和画面的质量

cs 复制代码
#include <opencv2/opencv.hpp>
#include <opencv2/dnn.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>

using namespace cv; //Must Need Write cv
using namespace std;

int main()
{
    Mat mat = Mat(300,300,CV_8UC3,Scalar(218,112,214));
    imwrite("file1.jpg",mat);

    Mat quality_mat = Mat(300,300,CV_8UC1);
    vector<int> params = {cv::IMWRITE_JPEG_QUALITY,40};
    imwrite("file2.jpg",quality_mat,params);

    Mat img_mat = imread("file1.jpg");
    printf("img_mat.width = %d,img_mat.hight = %d,img_mat.chnale = %d\n",img_mat.cols,img_mat.rows,img_mat.channels());

    Mat img_gray_mat = imread("file2.jpg",IMREAD_GRAYSCALE);
    printf("img_gray_mat.width = %d,img_gray_mat.height = %d,img_gray_amt.channel = %d\n",img_gray_mat.cols,img_gray_mat.rows,img_gray_mat.channels());


    return 0;
}
相关推荐
集和诚JHCTECH4 分钟前
BRAV-7120加持,让有毒有害气体无处遁形
大数据·人工智能·嵌入式硬件
机械X人44 分钟前
Encoder-Decoder PLM
人工智能·深度学习
小锋java123444 分钟前
天天说的 Agent,到底是啥???
人工智能
阿里云大数据AI技术1 小时前
MaxFrame 视频帧智能分析:从视频到语义向量的端到端分布式处理
人工智能·python
大模型任我行1 小时前
谷歌:大模型规划最优性超越传统算法
人工智能·语言模型·自然语言处理·论文笔记
两万五千个小时1 小时前
为什么你的 Agent 读了文件,却好像什么都没读到?
人工智能·程序员·架构
淘矿人1 小时前
从0到1:用Claude启动你的第一个项目
开发语言·人工智能·git·python·github·php·pygame
love530love1 小时前
Windows Podman Machine 虚拟硬盘迁移完整指南:从 C 盘到非系统盘
c语言·人工智能·windows·podman
互联网志1 小时前
加速高校科技成果转化 赋能实体经济高质量发展
大数据·人工智能·物联网
love530love1 小时前
Podman Machine 虚拟硬盘迁移实战二:用 Junction 把 vhdx 从 C 盘搬到其他盘
c语言·开发语言·人工智能·windows·wsl·podman·podman machine