opencv 基础(持续更新中)
1 前言
https://www.couragesteak.com/
2 安装
3 基础属性demo
打开一张图片:
import cv2img = cv2.imread('./girl.jpg')print(img.shape) # (1536, 1024, 3) 数组形状
print(type(img)) # numpy 数组
print(img) # 三维数组(彩色图片:高度、宽度、像素红绿蓝[蓝0, 绿1, 红2])cv2.waitKey() # 等待键盘任意输入,然后窗口消失
cv2.destroyAllWindows() # 销毁内存
4 颜色
在OpenCV中有超过150种颜色转换的方法,常用的有 BGR↔Gray 和 BGR↔HSV。
4.1 Gray 灰度处理
# 黑白图片/灰度化处理
# cv2.COLOR_BGR2GRAY
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)
4.2 HSV 颜色空间
RGB适用于显示系统;
HSV适用于图像处理(物体跟踪)。
属性 | 取值范围 |
---|---|
H(色彩/色度) | [0, 179] |
S(饱和度) | [0, 255] |
V(亮度) | [0, 255] |
注意:不同软件取值可能不同。
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
cv2.imshow('hsv', hsv)
4.3 颜色调整&翻转
# 颜色翻转
# 颜色翻转 img[:, :, ::-1]
cv2.imshow("girl老铁", img[:, :, ::-1])# 三原色调整
cv2.imshow("girl老铁", img[:, :, [0, 2, 1]])
4.4 物体跟踪(蓝色物体周围画一个圈)
import cv2
import numpy as npimg = cv2.imread('./url.png')
cv2.imshow('img', img)# HSV 在物体跟踪时比较有效
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 颜色空间转变
# cv2.imshow('hsv', hsv)# 定义在HSV颜色空间中的 蓝色 范围
lower_blue = np.array([110, 50, 50]) # 浅蓝
upper_blue = np.array([130, 255, 255]) # 深蓝
# 根据蓝色的范围,标记图片中哪些位置是蓝色
# 在范围内标记为1,不在标记为0
mask = cv2.inRange(hsv, lower_blue, upper_blue)
# 位运算
res = cv2.bitwise_and(img, img, mask=mask)
cv2.imshow('res', res)# 0:无限等待
cv2.waitKey(3000) # 无操作,2s后自动消失
cv2.destroyAllWindows() # 销毁内存
5 大小与位置
5.1 翻转
# 上下翻转 img[::-1, :, :]
cv2.imshow("girl老铁", img[::-1, :, :]) # 上下翻转 弹出窗口(文字只能是英文)
6 图片马赛克
6.1 缩小->放大拉伸
这种方式,可以理解为模糊化
img2 = cv2.resize(img, (30, 16))
img3 = cv2.resize(img2, (240, 128))
6.2 缩小,放大比例
img2 = cv2.resize(img, (100, 100)) # 先缩小
img3 = np.repeat(img2, 5, axis=1) # x轴 放大10倍
img4 = np.repeat(img3, 5, axis=0) # y轴 放大10倍
6.3 像素抽取
每10个中 取一个像素
import cv2img = cv2.imread("./img/girl2.png")print(img.shape) # 宽512、高512img2 = img[::10, ::10] # 每10个中 取一个像素# 由于图片比较小,我们加入下面2行代码,放大窗口
cv2.namedWindow("girl", flags=cv2.WINDOW_NORMAL)
cv2.resizeWindow("girl", 512, 512)cv2.imshow('girl', img2)
cv2.waitKey(0)
cv2.destroyAllWindows()
7 人脸操作
7.1 人脸检测
下载特征文件:
https://github.com/opencv/opencv/tree/4.x/data/haarcascades
data/haarcascades/haarcascade_frontalface_alt.xml
# -*- coding:utf-8 -*-
"""@Author :有勇气的牛排@FileName : 06 人脸检测.py@desc : 描述
"""
import cv2img = cv2.imread("./img/girls2.png")# 加载 人脸 特征文件(opencv库貌似自带)
face_detector = cv2.CascadeClassifier("./static/haarcascade_frontalface_alt.xml")
# 识别人脸,并且获取坐标:x、y、w、h
"""
[[744 100 142 142][205 165 153 153]]
"""
faces = face_detector.detectMultiScale(img)
print(faces)
for x, y, w, h in faces:# 绘制 矩形"""pt1: 左上角pt2: 左下角thickness: 线条粗细"""cv2.rectangle(img,pt1=(x, y),pt2=(x + w, y + h),color=[0, 0, 255],thickness=2)cv2.imshow("girl", img)cv2.waitKey(0)
cv2.destroyAllWindows()
优化:
- 黑白色更容易识别
- 识别效果系数整
# -*- coding:utf-8 -*-
"""@Author :有勇气的牛排@FileName : 06 人脸检测.py@desc : 描述
"""
import cv2img = cv2.imread("./img/hezhao.png")# 图片 改为 黑白色,识别更友好(数据更少)
gray = cv2.cvtColor(img, code=cv2.COLOR_BGR2GRAY)# 加载 人脸 特征文件(opencv库貌似自带)
face_detector = cv2.CascadeClassifier("./static/haarcascade_frontalface_alt.xml")
# 识别人脸,并且获取坐标:x、y、w、h
"""
[[744 100 142 142][205 165 153 153]]scaleFactor: 缩放 倍数 -> 放大缩小 判断是否是人脸scaleFactor: 坐标 x、y、w、h
"""
faces = face_detector.detectMultiScale(gray,scaleFactor=1.05,minNeighbors=3)
print(faces)
for x, y, w, h in faces:# 绘制 矩形"""pt1: 左上角pt2: 左下角thickness: 线条粗细"""# cv2.rectangle(img,# pt1=(x, y),# pt2=(x + w, y + h),# color=[0, 0, 255],# thickness=2)# 画圆圈cv2.circle(img,center=(x+w//2, y+h//2),radius=w//2,color=[0, 255, 0],thickness=2)cv2.imshow("girl", img)cv2.waitKey(0)
cv2.destroyAllWindows()
7.2 人脸 马赛克
# -*- coding:utf-8 -*-
"""@Author :有勇气的牛排@FileName : 07 人脸 马赛克.py@desc : 描述
"""import cv2
import numpy as npimg = cv2.imread("./img/girl2.png")# 图片 改为 黑白色,识别更友好(数据更少)
gray = cv2.cvtColor(img, code=cv2.COLOR_BGR2GRAY)# 加载 人脸 特征文件(opencv库貌似自带)
face_detector = cv2.CascadeClassifier("./static/haarcascade_frontalface_alt.xml")
# 识别人脸,并且获取坐标:x、y、w、h
faces = face_detector.detectMultiScale(gray,scaleFactor=1.05,minNeighbors=3)"""
187 89 152 152
人脸1:左上角 坐标:(187, 89)右下角 坐标:(339, 241)
"""for x, y, w, h in faces:# cv2.rectangle(img,# pt1=(x, y),# pt2=(x + w, y + h),# color=[0, 0, 255],# thickness=2)print(x, y, w, h)# 获取人脸区域 切片face = img[y:y + h, x:x + w]# img[y:y+h, x:x+w] = face[:, :, ::-1] # 脸部区域 变色 测试# 人脸 马赛克,切片face = face[::10, ::10] # 每10个中取一个像素face = np.repeat(face, 10, axis=0) # 高 --- 行face = np.repeat(face, 10, axis=1) # 宽 --- 列# 将马赛克区域 尺寸矫正img[y:y + h, x:x + w] = face[:152, :152]cv2.imshow("girl", img)cv2.waitKey(0)
cv2.destroyAllWindows()
7.3 人脸加贴纸
for x, y, w, h in faces:cv2.rectangle(img,pt1=(x, y),pt2=(x + w, y + h),color=[0, 0, 255],thickness=2)print(x, y, w, h)# 填满整个脸# img[y:y+h, x:x+w] = cv2.resize(sticker, (w, h))# 脸部1/4 左上角# img[y:y+h//2, x:x+w//2] = cv2.resize(sticker, (w//2, h//2))# 居中img[y:y+h//2, x+30:x+w//2+30] = cv2.resize(sticker, (w // 2, h // 2))
相关文章:

opencv 基础(持续更新中)
1 前言 https://www.couragesteak.com/ 2 安装 3 基础属性demo 打开一张图片: import cv2img cv2.imread(./girl.jpg)print(img.shape) # (1536, 1024, 3) 数组形状 print(type(img)) # numpy 数组 print(img) # 三维数组(彩色图片&am…...

科普现场!万博智云参加第五届张江汇智科普节
9月15日,第五届张江汇智科普节在汇智国际商业中心如期开展,展会中汇集了众多信息科技领域的新兴产品,展示内容主要分为国产替代和元宇宙场景展示两个方面。展现国产化最新科技成果,践行技术普惠理念,把高、精、专的技术…...
【记录】实现从Linux下载下载文件(文件导出功能)并记录过程产生的BUG问题。
前言 导出功能的实现,主要记录总结导出过程中出现的一些问题。 代码实现导出功能 public R templateDown(HttpServletResponse response) {String fileName "template.xlsx";// 清空responseresponse.reset();response.setCharacterEncoding("UTF…...
可扩展性表设计方案
文章目录 1 使用预留字段2 使用JSON字段3 使用单表继承4 构建属性表5 直接构建新表6 适当冗余 1 使用预留字段 在表设计初期,可以预留一些命名通用的备用字段,例如field1、field2、field3。当业务需要增加新字段时,就直接使用这些预留字段,无…...

Scotch: Combining SGX and SMM to Monitor Cloud Resource Usage【TEE的应用】
目录 摘要引言贡献 背景SMMXen Credit Scheduler与资源核算SGX 威胁模型Scheduler attacksResource interference attacksVM Escape attacks 架构Resource Accounting WorkflowCost of Accounting 具体的部署和评估见论文相关工作Resource Accounting基于SMM的方法基于SGX的系统…...
腾讯mini项目-【指标监控服务重构】2023-08-19
今日已办 benchmark How can we create a configuration for gobench with -benchmem – IDEs Support (IntelliJ Platform) | JetBrains 本机进行watermill-benchmark 使用 apifox 自动化测试上报固定数量的消息 启动watermill-pub/sub的 benchmark 函数 func BenchmarkPu…...
go实现grpc-快速开始
准备工作 Go, 最新版的 如果不会安装看Getting Started. Protocol buffer compiler, protoc, version 3. 想要安装, 请读Protocol Buffer Compiler Installation. 为 protocol compiler安装Go plugins: 想要安装运行以下命令: $ go install google.golang.org/protobuf/cmd/…...
linux上的init 0-6指令作用以及一些快捷键和系统指令
目录 linux上的init 0-6指令作用 CtrlAltF1-F7作用 Linux常用系统指令 查看linux内核版本 ubuntu和centos查看系统版本信息以及硬件信息 linux上的init 0-6指令作用 在Linux系统中,运行级别(也称为init级别)用来表示系统的不同状态或操作…...

Mixin 混入
Mixin 混入 混入 (mixin) 提供了一种非常灵活的方式,来分发 Vue 组件中的可复用功能。一个混入对象可以包含任意组件选项。当组件使用混入对象时,所有混入对象的选项将被“混合”进入该组件本身的选项。 怎么理解呢,就是每一个组件都会有一…...
pycharm快捷键
CtrlAltL 代码规范化 CtrlHome 回到代码最开始 CtrlEnd 回到代码最后面 shift回车 鼠标任意位置的下一行 altj 一直按可以选中相同的变量 alt鼠标左键 可以选择多个需要修改的变量或值 将光标放在某一行,home到最前面,end到最后…...
【面试刷题】——Linux基础命令
Linux基础命令是在Linux操作系统中执行常见任务的一组命令。以下是一些常用的Linux基础命令,它们用于管理文件系统、执行系统任务、查看文件内容等。 文件和目录操作: ls: 列出目录中的文件和子目录。 pwd: 显示当前工作目录的路径。 cd: 更改当前工作…...
第四步 Vue2 配置ESLint
ESLint 是一个广泛使用的 JavaScript 代码检查工具,可以帮助开发者在编写代码时发现并修复潜在的问题和错误。 在 第一步 创建工程 时虽然已经选择了包含 ESLint 预设配置,但还需要做一些调整,让我们使用起来能够更加的丝滑。 vue.config.j…...

[.NET学习笔记] - Thread.Sleep与Task.Delay在生产中应用的性能测试
场景 有个Service类,自己在内部实现生产者/消费者模式。即多个指令输入该服务后对象后,Service内部有专门的消费线程执行传入的指令。每个指令的执行间隔为1秒。这里有两部分组成, 工作线程的载体。new Thread与Task.Run。执行等待的方法。…...

【单线图的系统级微电网仿真】基于 PQ 的可再生能源和柴油发电机组微电网仿真(Simulink)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...

人脸识别技术应用安全管理规定(试行)|企业采用人脸打卡方式,这4条规定值得关注
近日,为规范人脸识别技术应用,国家互联网信息办公室起草了,并向全社会公开征求意见。该规定一共列举了25条,企业如借助人脸识别技术采集考勤打卡数据,以下4条规定值得关注。 第四条 只有在具有特定的目的和充分的必要…...

leetcode 817. 链表组件(java)
链表组件 题目描述HashSet 模拟 题目描述 给定链表头结点 head,该链表上的每个结点都有一个 唯一的整型值 。同时给定列表 nums,该列表是上述链表中整型值的一个子集。 返回列表 nums 中组件的个数,这里对组件的定义为:链表中一段…...

分布式事务基础理论
基础概念 什么是事务 什么是事务?举个生活中的例子:你去小卖铺买东西,“一手交钱,一手交货”就是一个事务的例子,交钱和交货必 须全部成功,事务才算成功,任一个活动失败,事务将撤销…...

《打造高可用PostgreSQL:策略与工具》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🐅🐾猫头虎建议程序员必备技术栈一览表📖: 🛠️ 全栈技术 Full Stack: 📚…...

【八大经典排序算法】快速排序
【八大经典排序算法】快速排序 一、概述二、思路实现2.1 hoare版本2.2 挖坑法2.3 前后指针版本 三、优化3.1 三数取中3.1.1 最终代码3.1.2 快速排序的特性总结 四、非递归实现快排 一、概述 说到快速排序就不得不提到它的创始人 hoare了。在20世纪50年代,计算机科学…...
vue 父组件给子组件传递一个函数,子组件调用父组件中的方法
vue 中父子组件通信,props的数据类型可以是 props: {title: String,likes: Number,isPublished: Boolean,commentIds: Array,author: Object,callback: Function,contactsPromise: Promise // or any other constructor }在父组件中,我们在子组件中给他…...
Oracle查询表空间大小
1 查询数据库中所有的表空间以及表空间所占空间的大小 SELECTtablespace_name,sum( bytes ) / 1024 / 1024 FROMdba_data_files GROUP BYtablespace_name; 2 Oracle查询表空间大小及每个表所占空间的大小 SELECTtablespace_name,file_id,file_name,round( bytes / ( 1024 …...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享
文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的,根据Excel列的需求预估的工时直接打骨折,不要问我为什么,主要…...

C# 类和继承(抽象类)
抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...
unix/linux,sudo,其发展历程详细时间线、由来、历史背景
sudo 的诞生和演化,本身就是一部 Unix/Linux 系统管理哲学变迁的微缩史。来,让我们拨开时间的迷雾,一同探寻 sudo 那波澜壮阔(也颇为实用主义)的发展历程。 历史背景:su的时代与困境 ( 20 世纪 70 年代 - 80 年代初) 在 sudo 出现之前,Unix 系统管理员和需要特权操作的…...
Matlab | matlab常用命令总结
常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...

selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Go 语言并发编程基础:无缓冲与有缓冲通道
在上一章节中,我们了解了 Channel 的基本用法。本章将重点分析 Go 中通道的两种类型 —— 无缓冲通道与有缓冲通道,它们在并发编程中各具特点和应用场景。 一、通道的基本分类 类型定义形式特点无缓冲通道make(chan T)发送和接收都必须准备好࿰…...