加载美女图片之OpenCV 图像读取与显示

news/2024/11/30 7:43:57/

在这里插入图片描述

📖作者介绍:22级树莓人(计算机专业),热爱编程<目前在c++和openCv阶段>——目标Windows,MySQL,Qt,数据结构与算法,openCv,Linux,多线程,会持续分享学习成果和小项目的
📖作者主页:热爱编程的小K
📖专栏链接:OpenCV

🎉欢迎各位→点赞👏 + 收藏💞 + 留言🔔​
💬总结:希望你看完之后,能对你有所帮助,不足请指正!共同学习交流 🐾

在这里插入图片描述

💯文章目录

      • 一、图像通道
      • 二、读取图像
        • 1、Mat结构
        • 2、格式化打印图像数据
        • 3、访问或设置像素强度值
        • 4、imread函数读取图片
      • 三、显示图像
      • 四、保存图像
      • 五、综合案例讲解
        • 1、测试上面的函数
        • 2、格式化打印效果
        • 3、保存图片效果展示
        • 4、综合代码


一、图像通道

  • 颜色通道
  • RGB 图像有4 个默认通道:红色、绿色和蓝色各有一个通道,以及一个用于编辑图像复合通道(主通道)
  • 彩色深度
  • 8位色,每个像素所能显示的彩色数为2的8次方,即256种颜色。

  • 16位增强色,16位彩色,每个像素所能显示的彩色数为2的16次方,即65536种颜色。

  • 24位真彩色,每个像素所能显示的彩色数为24位,即2的24次方,约1680万种颜色。

  • 32位真彩色,即在24位真彩色图像的基础上再增加一个表示图像透明度信息的Alpha通道。

    • Alpha通道:一张图片的透明和半透明度

CV_8UC3系列解读

  • 函数原型

    CV_<bit_depth>(S|U|F)C<number_of_channels>
    
  • bit_depth:像素点占用空间大小bit

  • S|U|F:

    • S:signed int——有符号
    • U:unsigned int——无符号
    • F:float——单精度浮点
  • number_of_channels

    • 1 单通道图像,即为灰度图像
    • 2 双通道图像
    • 3 三通道图像
    • 4 Alpha通道的彩色图像,四通道图像

二、读取图像

1、Mat结构

大家可以用如下图的方式查看,需要用到哪个调用哪个,这里只是简单的介绍

我们可以看一下库函数

在这里插入图片描述

class  Mat
{
public/*flag: 1.数字签名 2.维度3.通道数4.连续性*/int flags;					int dims; 					//数据维数int rows,cols; 				//数据行列uchar *data;				//存储的数据		const uchar* datastart;		//数据开始const uchar* dataend;		//数据结束const uchar* datalimit;		//数据边界//其他成员  //.....//其他方法//.....public: 		//构造方式// 默认构造函数 Mat A;Mat ()// 常用构造函数 Mat A(10,10,CV_8UC3);Mat (int rows, int cols, int type)//Mat A(300, 400, CV_8UC3,Scalar(255,255,255));Mat (int ndims, const int *sizes, int type, const Scalar &s)Mat (Size size, int type)Mat (int rows, int cols, int type, const Scalar &s)Mat (Size size, int type, const Scalar &s)Mat (int ndims, const int *sizes, int type)Mat (const Mat &m)Mat (int rows, int cols, int type, void *data, size_t step=AUTO_STEP)Mat (Size size, int type, void *data, size_t step=AUTO_STEP)Mat (int ndims, const int *sizes, int type, void *data, const size_t *steps=0)Mat (const Mat &m, const Range &rowRange, const Range &colRange=Range::all())//Mat D (A, Rect(10, 10, 100, 100) );Mat (const Mat &m, const Rect &roi)Mat (const Mat &m, const Range *ranges)
};

2、格式化打印图像数据

函数原型

Ptr<Formatted> format(InputArray mtx, Formatter::FormatType fmt)

  • 第一个参数是图像名称
  • 第二个参数是打印方式
    • FMT_DEFAULT= 0,
    • FMT_MATLAB= 1,
    • FMT_CSV = 2,
    • FMT_PYTHON = 3,
    • FMT_NUMPY = 4,这也是py的一种打印方式,数组
    • FMT_C = 5,C语言方式打印

3、访问或设置像素强度值

函数原型

Scalar 它将各个通道的值构成一个整体,赋给具有相同通道数的矩阵元素,通俗点就是一个复合数据

scalar(1,2,3);

分别把每一个像素点颜色通道设置为1,2,3,注意这里是BGR

4、imread函数读取图片

Mat imread( const String& filename, int flags = IMREAD_COLOR );
  • filename:文件路径
  • flags:显示方式
flags解释
IMREAD_REDUCED_COLOR_4 = 333通道BGR彩色图像,使图像大小减小1/4
IMREAD_REDUCED_GRAYSCALE_8 =64单通道灰度图像,并将图像尺寸减小1/8
IMREAD_REDUCED_COLOR_8 = 653通道BGR彩色图像,使图像大小减小1/8
IMREAD_IGNORE_ORIENTATION = 128不要根据EXIF的方向标志旋转图像
IMREAD_UNCHANGED = -1按原样返回加载的图像(带有alpha通道,否则会被裁剪)
IMREAD_GRAYSCALE = 0单通道灰度图像
IMREAD_COLOR = 13通道BGR彩色图像
IMREAD_ANYDEPTH = 216位/32位图像,其他则转换为8位
IMREAD_ANYCOLOR = 4图像以任何可能的颜色格式读取
IMREAD_LOAD_GDAL = 8gdal驱动程序加载映像
IMREAD_REDUCED_GRAYSCALE_2 =16单通道灰度图像,并将图像大小减小1/2
IMREAD_REDUCED_COLOR_2 = 173通道BGR彩色图像,使图像大小减小1/2
IMREAD_REDUCED_GRAYSCALE_4 =32单通道灰度图像,并将图像尺寸减小1/4

三、显示图像

imshow()显示图片

imshow(const string& str,InputArray mat);
  • str:窗口名称
  • mat:图像

销毁窗口

  • destroyAllWindows():销毁所有窗口
  • destroyWindow(const char* windowName):销毁指定窗口

四、保存图像

imwrite()函数保存图片

函数原型

bool imwrite( const String& filename, InputArray img,const std::vector<int>& params = std::vector<int>());
  • filename:保存的文件名
  • img:图像
  • params:设置图片质量,压缩率,一般不写

五、综合案例讲解

1、测试上面的函数

void testMat() 
{//No.1构造方式Mat img(10, 10, CV_8UC1);imshow("1", img);//No.2 BGRMat img2(300, 300, CV_8UC3, Scalar(0, 255, 0));imshow("2", img2);//No.3 clone方法拷贝Mat img3 = img2.clone();imshow("3", img3);//No.4Mat img4;img3.copyTo(img4);imshow("4", img4);//No.5Mat img5 = imread("mm.jpg", IMREAD_GRAYSCALE);imshow("5", img5);//No.6Mat img6 = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);imshow("6", img6);
}

这里讲一下拷贝

Mat img3 = img2.clone(); imshow("3", img3);

Mat img4; img3.copyTo(img4); imshow("4", img4);

  • clone()和copyTo():第一个是拷贝调用者,第二个是拷贝到

下面展示一下效果

在这里插入图片描述

2、格式化打印效果

void print() 
{Mat img(10, 10, CV_8UC1);cout << "C:" << endl;cout << format(img, Formatter::FMT_C) << endl;cout << "csv:" << endl;cout << format(img, Formatter::FMT_CSV) << endl;cout << "py:" << endl;cout << format(img, Formatter::FMT_PYTHON) << endl;
}

效果展示

在这里插入图片描述

3、保存图片效果展示

void testSaveimg(const char* filename) 
{Mat img = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);imwrite(filename, img);
}

这时候我们打开项目文件夹,就会发现,多了一个图片

在这里插入图片描述

4、综合代码

#include <iostream>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void testMat() 
{//No.1构造方式Mat img(10, 10, CV_8UC1);imshow("1", img);//No.2 BGRMat img2(300, 300, CV_8UC3, Scalar(0, 255, 0));imshow("2", img2);//No.3 clone方法拷贝Mat img3 = img2.clone();imshow("3", img3);//No.4Mat img4;img3.copyTo(img4);imshow("4", img4);//No.5Mat img5 = imread("mm.jpg", IMREAD_GRAYSCALE);imshow("5", img5);//No.6Mat img6 = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);imshow("6", img6);
}
void print() 
{Mat img(10, 10, CV_8UC1);cout << "C:" << endl;cout << format(img, Formatter::FMT_C) << endl;cout << "csv:" << endl;cout << format(img, Formatter::FMT_CSV) << endl;cout << "py:" << endl;cout << format(img, Formatter::FMT_PYTHON) << endl;
}
void testSaveimg(const char* filename) 
{Mat img = imread("mm.jpg", IMREAD_REDUCED_COLOR_2);imwrite(filename, img);
}
int main()
{//testMat();//print();testSaveimg("love.jpg");waitKey(0);destroyAllWindows();return 0;
}

http://www.ppmy.cn/news/47716.html

相关文章

C# 多线程编程的基础知识和常用的线程同步方式

多线程编程是现代软件开发中非常重要的一个方向&#xff0c;C# 作为一门现代化的编程语言&#xff0c;提供了丰富的多线程编程支持。下面我们来介绍一下 C# 多线程编程的基础知识和常用的线程同步方式。 基础知识 在 C# 中&#xff0c;可以使用 Thread 类来创建和管理线程。T…

怎么把avi文件转换成mp4视频格式,4个高能方法

怎么把avi文件转换成mp4视频格式&#xff1f; 当您下载到avi格式的视频文件时&#xff0c;您可能会选择将其转换为MP4格式的文件。 avi是一种由微软开发的多媒体容器格式&#xff0c;尽管现在已经被认为是老旧的技术&#xff0c;但由于其简单易懂的开发API和Windows的通用性&am…

TensorFlow 强化学习:6~10

原文&#xff1a;Reinforcement Learning With TensorFlow 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如…

【Python】【进阶篇】二十二、Python爬虫的BS4解析库

目录 二十二、Python爬虫的BS4解析库22.1 BS4下载安装22.2 BS4解析对象22.3 BS4常用语法1) Tag节点 22.4 遍历节点22.5 find_all()与find()1) find_all()2) find() 22.6 CSS选择器 二十二、Python爬虫的BS4解析库 Beautiful Soup 简称 BS4&#xff08;其中 4 表示版本号&#…

NLP与ChatGPT的碰撞:大模型和小模型联合发力

ChatGPT真的太火了&#xff01;作为NLP的终结者&#xff0c;ChatGPT又会与NLP发生怎么样的碰撞&#xff1f;大模型可以替代小模型吗&#xff1f;NLP又将何去何从&#xff1f;今天给大家推荐一本好书&#xff1a;《基于NLP的内容理解》&#xff01; 文章目录 一、背景二、书籍介…

MyBatis注解开发---实现自定义映射关系和关联查询

目录 相关导读 一、使用注解实现自定义映射关系 1. 编写注解方法 2. 编写测试方法 3. 查看运行结果 二、使用注解实现一对一关联查询 1. 编写注解方法 2. 编写测试方法 3. 查看运行结果 三、使用注解实现一对多关联查询 1. 编写注解方法 2. 编写测试方法 3. 查看运…

CANoe使用记录(二):Trace界面介绍

目录 1、概述 2、Trace界面介绍 2.1、右键配置 2.2、显示Title信息 2.3、改变窗口颜色 2.4、详细视图 2.5、静态视图 2.6、差异窗口 2.7、预过滤器 2.8、过滤分析 3.9、保存报文 3.10、其他类型简述 1、概述 Trace界面用于监控报文的界面&#xff0c;此界面包含很…

4月22日丨【云数据库技术沙龙】技术进化,让数据更智能

4月22日&#xff0c;云数据库技术沙龙“MySQL x ClickHouse”专场 “MySQL x ClickHouse” 技术沙龙&#xff0c;本次沙龙以“技术进化&#xff0c;让数据更智能”为主题&#xff0c;汇聚字节跳动、阿里云、玖章算术、华为云、腾讯云、百度等众多数据库厂商的技术大咖&#xf…