当前位置: 首页 > news >正文

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

大唐杯赛道一国一备赛思路

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

【Oracle APEX开发小技巧12】

有如下需求: 有一个问题反馈页面,要实现在apex页面展示能直观看到反馈时间超过7天未处理的数据,方便管理员及时处理反馈。 我的方法:直接将逻辑写在SQL中,这样可以直接在页面展示 完整代码: SELECTSF.FE…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

在 Nginx Stream 层“改写”MQTT ngx_stream_mqtt_filter_module

1、为什么要修改 CONNECT 报文? 多租户隔离:自动为接入设备追加租户前缀,后端按 ClientID 拆分队列。零代码鉴权:将入站用户名替换为 OAuth Access-Token,后端 Broker 统一校验。灰度发布:根据 IP/地理位写…...

江苏艾立泰跨国资源接力:废料变黄金的绿色供应链革命

在华东塑料包装行业面临限塑令深度调整的背景下,江苏艾立泰以一场跨国资源接力的创新实践,重新定义了绿色供应链的边界。 跨国回收网络:废料变黄金的全球棋局 艾立泰在欧洲、东南亚建立再生塑料回收点,将海外废弃包装箱通过标准…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

Java数值运算常见陷阱与规避方法

整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...

基于PHP的连锁酒店管理系统

有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...

深入理解Optional:处理空指针异常

1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

VisualXML全新升级 | 新增数据库编辑功能

VisualXML是一个功能强大的网络总线设计工具,专注于简化汽车电子系统中复杂的网络数据设计操作。它支持多种主流总线网络格式的数据编辑(如DBC、LDF、ARXML、HEX等),并能够基于Excel表格的方式生成和转换多种数据库文件。由此&…...