利用OpenCV处理图像
OpenCV是非常流行的图像处理库,下面介绍一下其对图像的基本操作。
1. 安装与环境
安装还有点儿复杂的,但百度几篇博客基本能解决,这里就不多说了。
安装好后,要在工程中使用OpenCV的头文件和库,需要在CMakeLists.txt中指定:
find_package(OpenCV 4.4)
MESSAGE("OPENCV VERSION: ${OpenCV_VERSION}")
include_directories(${OpenCV_INCLUDE_DIRS})
target_link_libraries(opencv_demo ${OpenCV_LIBS})
2. Demo讲解
2.1 简单读取+展示
2 #include <opencv2/opencv.hpp>3 #include <string>4 5 using namespace std;6 7 int main(int argc, char **argv) {8 string image_path = "./3.png";9 cv::Mat cv_image = cv::imread(image_path, -1);10 cv::imshow("hello image", cv_image);11 cout << "channel: " << cv_image.channels() << endl;12 cout << "row: " << cv_image.rows << endl;13 cout << "col: " << cv_image.cols << endl;14 cv::waitKey(0);15 return 0;16 }
1. cv::Mat
cv::Mat是OpenCV提供的用于存储图像的结构,本质上是一个大的二维数组。可以直接在程序中利用[][]访问数组中的元素。
2. cv::imread
cv::imread是读取图像的接口,用于将指定路径的图片读入cv::Mat中。第一个参数就是图片的路径,主流格式都是支持的。第二个参数是一个flag,用于表示读入的方式:
flag=-1:按照原始图像的信息读入
flag=0: 按照灰度图读入
flag=1: 按照彩色图读入(前提是原始图片是彩色的)
3. cv::imshow
cv::imshow用于图片的展示,第一个参数是图片的名字,第二个是存储图片的cv::Mat结构。
通过cv::Mat,可以直接打印出
4. 像素及通道信息
程序除了展示了图片外,还打印了其像素和通道信息:
channel: 4
row: 1080
col: 1920
这些信息是和读入的图片相关的,不同的图片,信息也不一定相同。以这个图片为例,它的像素点有1080行,1920列,所以我们称这个图片的分辨率是1080*1920;通道数为4,是个彩色图片。
单通道:也就是通常所说的灰度图,每个像素点只有一个值表示,如果图像的深度是4-(256 = 2*2*2*2) 为2^4(下同),那么他的像素取值范围是:0(黑)~255(白),并且仅用一个数字表示该点的像素值;
三通道:也就是通过见到的彩色图,每个像素点有三个值表示,如果图像深度是4-(256 = 2*2*2*2),那么他的像素值有红(0~255)、绿(0~255)、蓝(0~255)叠加表示,色彩更加艳丽,每一个像素值为三个数字(a,b,c),分别代表了三原色的一种;
四通道:也就是在三通道图像基础上加上透明程度,Alpha色彩空间,如果图像深度是4-(256 = 2*2*2*2),那么0是完全透明,255是完全不透明;
像素坐标
图片是有一个一个像素组成的,每个像素对应图片上的一个点,为了表示像素的位置,一般在会在图片上建立一个坐标系,然后用坐标来表示像素位置,这种坐标称为像素坐标(u-v坐标)。
(注意在OpenCV中u对应x对应列,v对应y对应行)
2.2 图片的缩放
上面已经说过,demo中的图片是1080*1920的,下面我们用OpenCV提供的接口将其缩小为原来的1/2,再放大到原来的4/3。
1 2 #include <opencv2/opencv.hpp>3 #include <string>4 5 using namespace std;6 7 int main(int argc, char **argv) {8 string image_path = "./3.png";9 cv::Mat origin_image = cv::imread(image_path, -1);10 cv::imshow("origin image", origin_image);11 12 cv::Mat down_image;13 auto down_cols = round(origin_image.cols*0.5);14 auto down_rows = round(origin_image.rows*0.5);15 cv::resize(origin_image, down_image,16 cv::Size(down_cols, down_rows), 0, 0, cv::INTER_NEAREST);17 cv::imshow("down image", down_image);18 19 cv::Mat up_image;20 auto up_cols = round(origin_image.cols*4/3);21 auto up_rows = round(origin_image.rows*4/3);22 cv::resize(origin_image, up_image,23 cv::Size(up_cols, up_rows), 0, 0, cv::INTER_NEAREST);24 cv::imshow("up image", up_image);25 26 cv::waitKey(0);27 return 0;28 }
主要就是调用了cv::resize接口,然后通过cv::Size指定目标图片的大小即可,非常简单。
最后的参数是插值的方式
// 在opencv中主要有五种常用的插值方式
1. INTER_LINEAR 双线性插值
2. INTER_NEAREST 最邻近插值
3. INTER_CUBIC 双三次样条插值
4. INTER_AREA 邻域像素再取样
5. INTER_LANCZOS4 8X8领域兰索斯插值
2.3 图片裁剪
2 #include <opencv2/opencv.hpp>3 #include <string>4 5 using namespace std;6 7 int main(int argc, char **argv) {8 string image_path = "./3.png";9 cv::Mat origin_image = cv::imread(image_path, -1);10 cv::imshow("origin image", origin_image);11 12 cv::Mat cropped_image = origin_image(cv::Range(80,280), cv::Range(150,330));13 cv::imshow("cropped image", cropped_image);14 15 cv::waitKey(0);16 return 0;17 }
这个代码也很容易理解,就不解释了。
到目前为止,遇到的接口都很友好,其实以后想要用哪种接口,直接百度一下即可,接口众多,没必要死记硬背。
相关文章:
利用OpenCV处理图像
OpenCV是非常流行的图像处理库,下面介绍一下其对图像的基本操作。 1. 安装与环境 安装还有点儿复杂的,但百度几篇博客基本能解决,这里就不多说了。 安装好后,要在工程中使用OpenCV的头文件和库,需要在CMakeLists.tx…...
【面试实战】SpringIoC、AOP、MVC面试实战
version:1.0 文章目录 SpringSpring基础 / IoC🙎♂️面试官:举例Spring的模块?🙎♂️面试官:Spring、SpringMVC、Spring Boot关系?🙎♂️面试官:说说对SpringIoC的了解?🙎♂️面试官:什么是Spring Bean?🙎♂️面试官:Bean的作用域?🙎♂️面…...
[Redis 分布式锁 ]
目录 前言: 使用场景: 基于 Redis 实现分布式锁的详细示例: 使用示例: 依赖: Redis分布式锁控制并发访问: 前言: 记录一些小笔记 , 如果对你有帮助 那就更好了 使用场景: Redis 实现分布式锁的使用场景包括: 防止重复操作…...
如何创建Vue实例?Vue实例有哪些属性和方法
Vue实例就是Vue的实例化对象,就像你有一个iPhone,那么iPhone就是你的实例化对象。要创建Vue实例,就像你想拥有一部iPhone一样,首先要有一个设计图。 这个设计图就相当于Vue实例的options对象,你可以设置它的属性&…...
InnoDB Cluster集群Mysql Router代理层最佳实践
InnoDB Cluster 集群 & Mysql-Router 代理层 前言 Mysql是现今最常用的关系型数据库之一,高可用一直是我们对软件服务的要求。常见的Mysql高可用是主从配置,在主节点挂掉后需要依赖监控脚本进行主从切换将从节点升级,后台服务代码层面也…...
RabbitMQ系列-概念及安装
1. 消息队列 消息队列是指利用队列这种数据结构进行消息发送、缓存、接收,使得进程间能相互通信,是点对点的通信 而消息代理是对消息队列的扩展,支持对消息的路由,是发布-订阅模式的通信,消息的发送者并不清楚消息的…...
进程间通信之共享内存
进程间通信之共享内存 1.共享内存机制2.两种常用共享内存方式3.补充一下:linux中shm与shmm的区别4.IPC通信System V版本的共享内存shm5.存储映射共享I/O(mmap函数)1.共享内存机制 是允许两个或多个进程(不相关或有亲缘关系)访问同一个逻辑内存的机制。它是共享和传递数据的一…...
网络连接中的舔狗协议
舔狗网络协议 (discard protocol) 最近互联网上,“舔狗” 这个词语很火,也衍生出来很多梗(快速说出互联网 4 大舔狗!!!)。然后今天偶然间看到了一个 RFC 文档, 发现了一…...
一分钟了解乐观锁、悲观锁、共享锁、排它锁、行锁、表锁以及使用场景
大家好,我是冰点,今天给大家带来,关于MySQL中的锁的使用。 我首先提个问题,大家知道什么是 乐观锁、悲观锁、共享锁,、排它锁、行锁、表锁,以及每种锁的使用场景吗? !! 背景:最近在各…...
【C++】C++ 中的 IO 流
文章目录 一、C语言的输入输出二、什么是流三、C IO 流1、C 标准 IO 流2、C 文件 IO 流 四、stringstream 介绍 一、C语言的输入输出 在C语言中我们使用最频繁的输入输出方式是 scanf () 与 printf(): scanf():从标准输入设备 (键盘) 读取数据…...
QFuture的使用
QFuture 是 Qt 提供的一个类,用于表示异步操作的返回值或状态。异步操作指的是那些不会阻塞主线程的操作,例如文件读写、网络请求、计算等等。 在执行异步操作时,可以使用 QtConcurrent 模块提供的函数 (QFuture<T> QtConcurrent::run…...
通过dockerfile将nginx、前端和后端封装成一个镜像
1、内容如下 2、dist文件 就是vue项目的打包文件 3、jar包文件 就是springboot的打包文件 4、编写Dockerfile #引用 jdk1.8作为基础镜像,这个jdk1.8是我自己用linux版本的jdk打包的,具体操作可以看 #https://blog.csdn.net/qq_38639813/article/details/129384923中将jd…...
如何利用CiteSpace快速锁定领域内最新研究热点并制作精美的可视化专题图?
【基于Citespace和vosviewer文献计量学相关论文 】 01 文献计量学方法与应用 1. 文献计量学方法基本介绍 2. 与其他综述方法区别联系 3. 各学科领域应用趋势近况 4. 主流分析软件优缺点对比 5. 经典高分10SCI思路复盘 6. 软件安装与Java环境配置 02 主题确定、数据检…...
嵌入式开发从入门到精通之第二十二节:蓝牙芯片CC254x ADC 电压测量
目录 1. CC254x ADC原理 参考电压 采样通道 采样率 采样时间...
北邮22信通:二叉树显示路径的两种方法 递归函数保存现场返回现场的实例
北邮22信通一枚~ 跟随课程进度每周更新数据结构与算法的代码和文章 持续关注作者 解锁更多邮苑信通专属代码~ 获取更多文章 请访问专栏~ 北邮22信通_青山如墨雨如画的博客-CSDN博客 一.讲解 要想实现二叉树的路径显示,我们要按照…...
vue 3 第二十八章:组件十二(组件的v-model、多v-model)
文章目录 1. 基本使用2. 使用conputed实现3. v-model 的参数4. 多 v-model 的使用5. v-model 修饰符 在 Vue 3 中, v-model 指令的使用更加灵活,可以绑定任意属性和事件。例如,我们可以使用 v-model:checked 指令来绑定单选框或复选框的 c…...
LCD 显示
概述 LCD显示控制模块接收 MCU 送过来的数据,按一定规律储存在显示 RAM 中,并根据显示 RAM 中的数据驱动 LCD 显示屏来实现期望的字符显示功能。 主要特点: ⚫ 最大支持 840 、 642 、 444 的显示段数 ⚫ 1/3bias 、 1/4bia s ⚫ 16 级灰度可…...
互联网医院开发|在线问诊系统架构设计功能有哪些?
互联网医院会增加更多的医疗业务,电话问诊、视频问诊、个性化的医疗套餐等,未来互联网医院会建成围绕健康主题的深度大数据平台和多元化医疗服务生态体系,丰富人工智能、物联网等应用场景,为用户提供更好的服务体验、更低的成本、…...
数据安全运营有效管理-数据安全复合治理框架和模型解读(1)
数据治理,数据安全治理行业在发展,在实践,所以很多东西是实践出来的,哪有什么神仙理论指导,即使有也是一家之说,但为了提高企业投产比,必要的认知是必须的,落地运营管理水平差异直接决定产品和项目是否可持续性,当前和未来更需要专业和有效创新。数据安全治理要充分考…...
【刷题之路】LeetCode 面试题 03.02. 栈的最小值
【刷题之路】LeetCode 面试题 03.02. 栈的最小值 一、题目描述二、解题1、方法1——“辅助栈”1.1、思路分析1.2、代码实现 一、题目描述 原题连接: 面试题 03.02. 栈的最小值 题目描述: 请设计一个栈,除了常规栈支持的pop与push函数以外&am…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
R语言AI模型部署方案:精准离线运行详解
R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
2025 后端自学UNIAPP【项目实战:旅游项目】6、我的收藏页面
代码框架视图 1、先添加一个获取收藏景点的列表请求 【在文件my_api.js文件中添加】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http…...
大模型多显卡多服务器并行计算方法与实践指南
一、分布式训练概述 大规模语言模型的训练通常需要分布式计算技术,以解决单机资源不足的问题。分布式训练主要分为两种模式: 数据并行:将数据分片到不同设备,每个设备拥有完整的模型副本 模型并行:将模型分割到不同设备,每个设备处理部分模型计算 现代大模型训练通常结合…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
git: early EOF
macOS报错: Initialized empty Git repository in /usr/local/Homebrew/Library/Taps/homebrew/homebrew-core/.git/ remote: Enumerating objects: 2691797, done. remote: Counting objects: 100% (1760/1760), done. remote: Compressing objects: 100% (636/636…...
Axure 下拉框联动
实现选省、选完省之后选对应省份下的市区...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
