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

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

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
JDK 17 新特性
#JDK 17 新特性 /**************** 文本块 *****************/ python/scala中早就支持,不稀奇 String json “”" { “name”: “Java”, “version”: 17 } “”"; /**************** Switch 语句 -> 表达式 *****************/ 挺好的ÿ…...

SpringTask-03.入门案例
一.入门案例 启动类: package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...
Pinocchio 库详解及其在足式机器人上的应用
Pinocchio 库详解及其在足式机器人上的应用 Pinocchio (Pinocchio is not only a nose) 是一个开源的 C 库,专门用于快速计算机器人模型的正向运动学、逆向运动学、雅可比矩阵、动力学和动力学导数。它主要关注效率和准确性,并提供了一个通用的框架&…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
go 里面的指针
指针 在 Go 中,指针(pointer)是一个变量的内存地址,就像 C 语言那样: a : 10 p : &a // p 是一个指向 a 的指针 fmt.Println(*p) // 输出 10,通过指针解引用• &a 表示获取变量 a 的地址 p 表示…...
绕过 Xcode?使用 Appuploader和主流工具实现 iOS 上架自动化
iOS 应用的发布流程一直是开发链路中最“苹果味”的环节:强依赖 Xcode、必须使用 macOS、各种证书和描述文件配置……对很多跨平台开发者来说,这一套流程并不友好。 特别是当你的项目主要在 Windows 或 Linux 下开发(例如 Flutter、React Na…...

C++_哈希表
本篇文章是对C学习的哈希表部分的学习分享 相信一定会对你有所帮助~ 那咱们废话不多说,直接开始吧! 一、基础概念 1. 哈希核心思想: 哈希函数的作用:通过此函数建立一个Key与存储位置之间的映射关系。理想目标:实现…...