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;
}
相关推荐
AC赳赳老秦2 小时前
Web3.0 AI融合趋势:用DeepSeek实现去中心化应用开发与优化实战
大数据·人工智能·数据挖掘·数据分析·web3·去中心化·deepseek
2501_933329552 小时前
舆情监测系统的技术架构与实践:Infoseek如何用AI重构企业品牌护城河
人工智能·分布式·自然语言处理
WJSKad12352 小时前
[特殊字符] MoLFormer-XL:分子语言模型的革命性突破
人工智能·语言模型·自然语言处理
FriendshipT2 小时前
YOLOs-CPP:一个免费开源的YOLO全系列C++推理库(以YOLO26为例)
c++·人工智能·yolo·目标检测·分类·开源
一碗姜汤2 小时前
torch.autograd.Function的apply()方法作用
人工智能·pytorch·深度学习
ywfwyht2 小时前
AlpamayoR1 VLA自动驾驶模型解析
人工智能·机器学习·自动驾驶
CoderJia程序员甲2 小时前
GitHub 热榜项目 - 日榜(2026-03-09)
人工智能·ai·大模型·github·ai教程
小超同学你好2 小时前
Transformer 7. Decoder:架构选择、Teacher Forcing 与并行计算
人工智能·语言模型·transformer
Learn Beyond Limits2 小时前
固定窗口神经语言模型|A fixed-window neural Language Model
人工智能·语言模型·自然语言处理