Opencv学习
Long time no see!哈哈,假期终于有时间做一点自己喜欢的东西了
还是想说,每天花一点时间投在自己喜欢的事情上,或者专攻一些平时不学的方向,真的很酷!
图片绘制
对于图像绘制,可以分为:图像创建(对象处理)—绘制图像(操作)—图像呈现(效果呈现)。这三个步骤又可以根据需求和习惯进行库的选取,函数运用
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt# 1 创建一个空白的图像
img = np.zeros((512,512,3), np.uint8)
# 2 绘制图形
cv.line(img,(0,0),(511,511),(55,0,0),5)
#直线起点,终点,颜色
cv.rectangle(img,(384,0),(510,128),(0,255,250),3)
#矩形左上坐标,右下坐标,颜色,宽度
cv.circle(img,(447,63), 63, (0,0,255), -1)
#圆心,半径
font = cv.FONT_HERSHEY_SIMPLEX
#绘制字体
cv.putText(img,'华 ,H_lilium ',(10,500), font, 2,(200,55,255),2,cv.LINE_AA)
# font = ImageFont.truetype('simsun.ttc', 40) # 这里使用宋体字体,你可以根据需要更改字体文件,确保字体文件存在
# cv.putText(img,'华 YU MEI',(10,500), font, 2,(200,55,255),2,cv.LINE_AA)
# 绘制中文文本
# 3 图像展示
img_rgb = cv.cvtColor(img, cv.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.rcParams['font.sans-serif']=['SimHei']#设置 matplotlib 的字体为 SimHei,这是一种支持中文的字体。
plt.title('匹配结果')
plt.xticks([]), plt.yticks([])#坐标隐藏
plt.show()
1.图像创建
一般创建出来的图像,可以控制大小、颜色通道(BGR)、色彩
# 读取图像
img = np.zeros((520, 512, 3), np.uint8)
img[:] = 255#可使创建背景图像转为白色,更容易观察颜色与形状
2.绘制函数
本次举例了直线,矩形,圆绘制。
绘制图像的函数其实很容易理解,万能公式:
cv.图像英文(操作对象img,关键点坐标,大小,颜色,线条粗细)
# 2 绘制图形
cv.line(img,(0,0),(511,511),(55,0,0),5)
#直线起点,终点,颜色
cv.rectangle(img,(384,0),(510,128),(0,255,250),3)
#矩形左上坐标,右下坐标,颜色,宽度
cv.circle(img,(447,63), 63, (0,0,255), -1)
#圆心,半径
关于字体展示有一个小点,可以注意到,输出的中文变成“?”无法识别,这是 因为选择的字体font确实汉字。我在网上找到了解决办法,不过感觉有点麻烦,要加入库,引入一个新font,还要转换图像类型。不过没关系,这也算是文字传承吧嘿嘿
import cv2 as cv
from PIL import Image, ImageDraw, ImageFont
import numpy as np# 读取图像
img = np.zeros((520, 512, 3), np.uint8)
img[:] = 255
# 将 OpenCV 图像转换为 PIL 图像
pil_img = Image.fromarray(cv.cvtColor(img, cv.COLOR_BGR2RGB))
# 创建一个可绘制对象
draw = ImageDraw.Draw(pil_img)
# 设置字体和字体大小
font = ImageFont.truetype('simsun.ttc', 40) # 这里使用宋体字体,你可以根据需要更改字体文件,确保字体文件存在
# 绘制中文文本
draw.text((10, 50), '华 ,H_lilium', (70, 55, 150), font=font)#RGB
# 将 PIL 图像转换回 OpenCV 图像
img = cv.cvtColor(np.array(pil_img), cv.COLOR_RGB2BGR)# 显示图像
cv.imshow('Image with Chinese Text', img)
cv.waitKey(0)
cv.destroyAllWindows()
图像展示
关键的三段函数,创建图像显示窗口+显示时间+执行指令
# 显示图像
cv.imshow('Image with Chinese Text', img)
cv.waitKey(0)
cv.destroyAllWindows()
图片加法+混合
1.加法
加法可以分两类,Opencv/NumPy,简单的0.5+0.5,效果其实并不理想
注意,1.黑色部分相加无法体现 2.相加图像必须大小规格一样 3.可以利用掩膜色彩
#加法函数# 使用 OpenCV 的 add 函数进行图像加法
img3 = cv2.add(img2, img1)
# 使用 NumPy 的加法进行图像加法
img4 = img2 + img1
import cv2
import numpy as np
import matplotlib.pyplot as plt# 读取图像
img1 = cv2.imread("D1.jpg")
img2 = cv2.imread("D3(1).jpg")# 将 img2 转换为 HSV 颜色空间
hsv = cv2.cvtColor(img2, cv2.COLOR_BGR2HSV)# 定义红色的 HSV 范围
minRed = np.array([0, 50, 50])
maxRed = np.array([60, 255, 255])# 创建掩膜
mask = cv2.inRange(hsv, minRed, maxRed)# 提取红色部分
red = cv2.bitwise_and(img2, img2, mask=mask)# 显示提取的红色部分
cv2.imshow('red', red)# 等待按键事件
cv2.waitKey(0)# 关闭所有 OpenCV 窗口
cv2.destroyAllWindows()# 使用 OpenCV 的 add 函数进行图像加法
img3 = cv2.add(img2, img1)# 使用 NumPy 的加法进行图像加法
img4 = img2 + img1# 再次使用 OpenCV 的 add 函数进行图像加法
img5 = cv2.add(img1, img2)# 创建子图
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(10, 8), dpi=100)# 显示原始图像
axes[0, 0].imshow(img1[:, :, ::-1])
axes[0, 0].set_title('原始图像 1')# 显示原始图像
axes[0, 1].imshow(img2[:, :, ::-1])
axes[0, 1].set_title('原始图像 2')# 显示 OpenCV 加法结果
axes[1, 0].imshow(img3[:, :, ::-1])
axes[1, 0].set_title('OpenCV 加法')# 显示 NumPy 加法结果
axes[1, 1].imshow(img4[:, :, ::-1])
axes[1, 1].set_title('NumPy 加法')# 调整子图布局
plt.tight_layout()# 显示图像
plt.show()
2.混合
图像混合根据占比调制参数,对图像要求与加法一致。混合更能满足对图像的融洽处理
#图像混合
img5=cv2.addWeighted(img1,0.3,img2,0.7,0)
3.数列处理
引入数列来呈现图像,能更清晰地了解图像的变化(行+列+分辨率)
# 创建子图
fig, axes = plt.subplots(nrows=2, ncols=3, figsize=(10, 8), dpi=100)# 显示原始图像
axes[0, 0].imshow(img1[:, :, ::-1])
axes[0, 0].set_title('原始图像 1')
有趣的图像绘制
在小学的时候,就对数学很感兴趣,有一次同学打趣到那我们来挑战画正17边形吧,我一口答应下来。结局是谁也没有画出正17边形,但是我却发现了一个美妙的,永远画不完的图形,当时非常兴奋,暗暗得意“我长大一定要研究清楚,然后成为一名数学家”哈哈哈,这个思想一直存活至高中,后来在学斐波那契额数列时,见到了一个极其相似的图像,我当时没有失落也没有遗憾,反而有些庆幸——我跨越了时间的限制,悄悄与不知名的人来了一次心灵意识的交汇。后来,我就手绘了这一副图,放在了我的数学错题本上,并暗自发誓“一定要用机械语言将这个美丽的图像以我的方式展示出来”
到了大学,学了编程语言,似乎一切想法都不再是遥不可及了。到了寒假,嘿嘿,我好像实现了承诺,和小小的自己也完成了一次心灵的交汇!(当然,还有豆包帮了大忙),虽然只是简单的理想图像的呈现,没有体现我的“中交线”无限绘图,而是“定点”有限次绘图,但是也是一大突破点啦!
顺势一说,为了体现这一过程,还用了动画哟
import cv2 as cv
import numpy as np
import timedef main():center = (256, 256)#定圆心radius = 230#距离圆心范围,点的半径num_points = 16#所需要的个数points = []#空列表用于储存点for i in range(num_points):# 计算每个点的角度angle = 2 * np.pi * i / num_points#2Π/点数# 计算点的坐标x = center[0] + (radius + 1) * np.cos(angle)y = center[1] + (radius + 1) * np.sin(angle)#三角函数中余弦正弦points.append((int(x), int(y)))# 创建一个空白图像img = np.zeros((512, 512, 3), np.uint8)img[:]=255cv.namedWindow('Image')for point in points:cv.circle(img, point, 3, (225, 10, 10), -1)cv.imshow('Image', img)cv.waitKey(100) # 显示 500 毫秒for i in range(len(points)):for j in range(i + 1, len(points)):cv.line(img, points[i], points[j], (220, 110, 0), 1)#BGRcv.imshow('Image', img)cv.waitKey(100) # 显示 500 毫秒cv.waitKey(0)cv.destroyAllWindows()if __name__ == "__main__":main()
小小心得
在学这个操作的时候,我就感觉到现在所学的图像处理,就是对早就接触过的美图软件进行一次理性、专业的解剖哈哈,这里的图片加法和混合就像图片叠加,之前的图像特定颜色通道选取就是低级一点的滤镜。
当然图像处理的核心就是满足人的需求,而人的需求也是推进技术学习,技术进步的一大动力
——解锁2025年关键词《相信》
我相信:念念不忘,必有回响
相关文章:

Opencv学习
Long time no see!哈哈,假期终于有时间做一点自己喜欢的东西了 还是想说,每天花一点时间投在自己喜欢的事情上,或者专攻一些平时不学的方向,真的很酷! 图片绘制 对于图像绘制,可以分为:图像创…...

python生成图片和pdf,快速
1、下载安装 pip install imgkit pip install pdfkit2、wkhtmltopdf工具包,下载安装 下载地址:https://wkhtmltopdf.org/downloads.html 3、生成图片 import imgkit path_wkimg rD:\app\wkhtmltopdf\bin\wkhtmltoimage.exe # 工具路径,安…...

剑指Offer|LCR 044.在每个树行中找最大值
LCR 044.在每个树行中找最大值 给定一棵二叉树的根节点 root ,请找出该二叉树中每一层的最大值。 示例 1: 输入: root [1,3,2,5,3,null,9] 输出: [1,3,9] 解释:1/ \3 2/ \ \ 5 3 9 示例 2: 输入: root [1,2,3] 输出: [1,3] 解…...

PWM信号概述
什么是PWM信号? PWM(Pulse-width modulation)是脉冲宽度调制的缩写。 脉冲宽度调制是一种模拟信号电平数字编码方法。 脉冲宽度调制PWM是通过将有效的电信号分散成离散形式从而来降低电信号所传递的平均功率的一种方式。所以根据面积等效法…...

关于BAR(PCIE BAR或AXI BAR)的解释
假设某BAR的默认值是xxxx_0000(这里表示8个比特位),其中低4位不可写,可操作的最低位是4,所以该BAR的大小是2^416字节; 1、系统软件向BAR写0xFF 2、系统软件读BAR,读到的值是0xF0,于是…...

计算机的错误计算(二百二十一)
摘要 利用一个数学解题器化简计算 实验表明,即使是数学解题器,也是一派胡言。 有一读者来信,询问数学大模型的推理事宜。现就前面的案例继续做一讨论。 例1. 化简计算摘要中算式。 下面是与一个数学解题器的对话。 点评: &am…...

【力扣Hot 100】矩阵1
矩阵置零:1. 开两个数组判断该行/该列是否有0;2. 用第0行/第0列分别判断该列/该行是否有0 螺旋矩阵:记录方向,一直按某方向前进,遇到障碍方向就变一下 1. 矩阵置零 给定一个 *m* x *n* 的矩阵,如果一个元…...

移动端VR处理器和传统显卡的不同
骁龙 XR 系列芯片 更多地依赖 AI 技术 来优化渲染过程,而传统的 GPU 渲染 则倾向于在低画质下运行以减少负载。这种设计是为了在有限的硬件资源下(如移动端 XR 设备)实现高性能和低功耗的平衡。以下是具体的分析: 1. AI 驱动的渲染…...

「 机器人 」利用数据驱动模型替代仿真器:加速策略训练并降低硬件依赖
前言 在强化学习(Reinforcement Learning, RL)中,策略训练需要大量的交互数据(状态、动作、奖励、下一状态),而这些数据通常来自仿真器或真实硬件。传统高保真仿真器虽然能在一定程度上模拟飞行器的动力学,但往往计算量大、开发成本高,且仍可能与真实环境存在差距。为此…...

MATLAB 如何避免复杂shp文件对inpolygon的影响
**任务描述:**当我想用inpolygon函数将属于非洲的pixel选出来时,发现因为周边小岛的影响,pixel选取有问题,如下图。 第一种解决办法: 首先将复杂shp文件查分成简单的shp文件,即将不相交的元素分离开 [QGIS…...

【2024年华为OD机试】 (C卷,200分)- 贪吃的猴子(JavaScriptJava PythonC/C++)
一、问题描述 题目解析 问题描述 一只猴子来到果园,发现许多串香蕉排成一行,每串香蕉上有若干根香蕉。每串香蕉的根数由数组 numbers 给出。猴子每次只能从行的开头或末尾获取香蕉,并且只能获取 N 次。求猴子最多能获取多少根香蕉。 输入…...

PostgreSQL中级专家是什么意思?
数据库技术领域,PostgreSQL 作为一种广泛使用的开源关系型数据库管理系统,吸引了众多技术人员深入学习和研究。“PostgreSQL 中级专家” 是对掌握该数据库特定技能层次的一种描述。 知识储备 中级专家深入理解 PostgreSQL 的体系结构,包括进程…...

从根源分析,调试,定位和解决MacOS ld: unsupported tapi file type ‘!tapi-tbd‘ in YAML file
你要是遇到同样错误,找一圈都没有解决,建议认真读一下本文,这个应该是最终极的解决办法,从原理上剖析了产生的原因,同时给出来了调试和定位的办法。 maccos使用brew安装了一个gcc14, 结果编译一个最简单的程序都报错&a…...

【Uniapp-Vue3】previewImage图片预览
如果我们想要实现点击一张图片放大,并能够左右滑动,就要使用previewImage这个API。 uni.previewImage({ current:xxx, // 当前图片下标 urls:xxx, // 图片路径组 // 其他参数 }) 我们先编写一个点击图片的事件,并传递当前点击图片的下标&…...

doris:Insert Into Values
INSERT INTO VALUES 语句支持将 SQL 中的值导入到 Doris 的表中。INSERT INTO VALUES 是一个同步导入方式,执行导入后返回导入结果。可以通过请求的返回判断导入是否成功。INSERT INTO VALUES 可以保证导入任务的原子性,要么全部导入成功,要么…...

15 分布式锁和分布式session
在java中一个进程里面使用synchronized在new出来对象头信息中加锁,如果是静态方法中在加载的类信息中加锁(我们在锁的原理中讲过)。如果使用lock加锁可以自己指定。这些都是在同一个进程空间中的操作。如果在分布式环境中由于程序不在一个进程空间,就没办…...

迅为RK3568开发板篇OpenHarmony实操HDF驱动控制LED-添加内核编译
编译内核时将该 HDF 驱动编译到镜像中,接下来编写驱动编译脚本 Makefile,代码如下所示: 加入编译体系,填加模块目录到 drivers/hdf_core/adapter/khdf/linux/Makefile 文件 更多内容可以关注:迅为RK3568开发板篇OpenHa…...

C语言练习(23)
求两个整数的最大公约数和最小公倍数,用一个函数求最大公约数,用另一函数根据求出的最大公约数求最小公倍数。 ①不用全局变量,分别用两个函数求最大公约数和最小公倍数。两个整数在主函数中输入,并传送给函数f1,求出…...

LabVIEW 太阳能光伏发电系统智能监控
本文介绍了基于 LabVIEW 的太阳能光伏发电监控系统的设计与实现,着重探讨了其硬件配置、软件架构以及系统的实现方法。该系统能够有效提高太阳能光伏发电的监控效率和精确性,实现了远程监控和数据管理的智能化。 项目背景 在当前能源紧张与环境污染…...

大唐杯赛道一国一备赛思路
前情:本人非通信专业,打这个比赛纯粹为了保研加分,因为本人同届同学院的人参加了一次,获得了省级,加上有保研学长说这个比赛挺简单的,一直想参加的,机缘巧合下和另一个需要保研的同学组队&#…...

用户中心项目教程(五)---MyBatis-Plus完成后端初始化+测试方法
文章目录 1.数据库的链接和创建2.建库建表语句3.引入依赖4.yml配置文件5.添加相对路径6.实体类的书写7.Mapper接口的定义8.启动类的指定9.单元测试10运行时的bug 1.数据库的链接和创建 下面的这个就是使用的我们的IDEA链接这个里面的数据库: 接下来就是输入这个用户…...

深圳市云盟智慧科技有限公司智慧停车管理系统 SQL注入漏洞复现(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...

PySide(PyQT)进行SQLite数据库编辑和前端展示的基本操作
以SQLite数据库为例,学习数据库的基本操作,使用QSql模块查询、编辑数据并在前端展示。 SQLite数据库的基础知识: https://blog.csdn.net/xulibo5828/category_12785993.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId1278…...

利用 SAM2 模型探测卫星图像中的农田边界
将 Segment Anything Model Version 2 应用于卫星图像以检测和导出农业地区田地边界的分步教程 🌟 简介 手动绘制田地边界是最耗时的任务之一,其准确性取决于绘制者的表现。然而,精确的边界检测在很多领域都有应用。例如,假设您…...

前端路由的hash模式和history模式
hash 模式和 history 模式是前端路由实现的两种常见方式,分别基于不同的浏览器特性实现。下面从浏览器实现、前端框架实现及相关标准定义三个方面详细解释这两种模式。 1. 浏览器实现 1.1 Hash 模式 • 核心机制: • 基于浏览器的 location.hash 属性…...

日志收集Day005
1.filebeat的input类型之filestream实战案例: 在7.16版本中已经弃用log类型,之后需要使用filebeat,与log不同,filebeat的message无需设置就是顶级字段 1.1简单使用: filebeat.inputs: - type: filestreamenabled: truepaths:- /tmp/myfilestream01.lo…...

代码随想录 二叉树 test 2
二叉树的非递归遍历 先序 方法一: 先保存根节点,用来之后找到右子树(利用栈来回溯到根,进而找到右子树) class Solution { public:vector<int> preorderTraversal(TreeNode* root) {vector<int> res; //存遍历序列stack<TreeNode*…...

浏览器默认语言与页面访问统计问题二三则
文章目录 前言网站默认语言问题网站访问统计问题Error: Empty components are self-closingError: A space is required before closing bracket 总结 前言 看标题大概能猜到这是一篇杂合体的总结,是这两天处理网站遇到的小问题,怕过段时间再忘了所以总…...

用Python绘制一只懒羊羊
目录 一、准备工作 二、Turtle库简介 三、绘制懒羊羊的步骤 1. 导入Turtle库并设置画布 2. 绘制头部 3. 绘制眼睛 4. 绘制嘴巴 5. 绘制身体 6. 绘制四肢 7. 完成绘制 五、运行代码与结果展示 六、总结 在这个趣味盎然的技术实践中,我们将使用Python和Turtle图形…...

虹科分享 | 汽车NVH小课堂之听音辨故障
随着车主开始关注汽车抖动异响问题,如何根据故障现象快速诊断异响来源,成了汽修人的必修课。 一个比较常用的方法就是靠“听”——“听音辨故障”。那今天,虹科Pico也整理了几个不同类型的异响声音,一起来听听看你能答对几个吧 汽…...