在这里插入图片描述
在这里插入图片描述

😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️Take your time ! 😶‍🌫️😶‍🌫️😶‍🌫️😶‍🌫️
💥个人主页:🔥🔥🔥大魔王🔥🔥🔥
💥所属专栏:🔥魔王的修炼之路–Computer vision🔥
如果你觉得这篇文章对你有帮助,请在文章结尾处留下你的点赞👍和关注💖,支持一下博主。同时记得收藏✨这篇文章,方便以后重新阅读。

文章目录

  • 检测轮廓
  • numpy 创建矩阵与数组
  • 三种图像的区别及转换
  • () 与 [] 应用

检测轮廓

import cv2
import numpy as npcv2.namedWindow("win", cv2.WINDOW_NORMAL)# 自己创建图像
# # (y,x)
# img = np.zeros((480, 640, 3), np.uint8)# # 绘制一个长方形(x,y)
# cv2.rectangle(img, (100, 50), (500, 400), (255, 255, 255), 2) # 这需要是白色,因为在灰度图转为二值图时,阈值的影响。
# # 具体原因:彩色图转为灰度图后,灰度图对应的数字低于阈值,在转的时候就跟着黑色背景也变为了黑色,所以就检测不到轮廓了。
# # 二值化的阈值要小于灰度图里你想保留的区域的灰度值,否则就变成背景,轮廓自然找不到。# 读取图像
img = cv2.imread("../images/3.jpg")print(img.shape) # 形状# 彩色图转为灰度图(单通道)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 二值化(只能从灰度图转过来)
# 参数:灰度图(单通道);阈值;最大值(即高于阈值设置为多少);阈值处理类型
# 返回值:实际使用的阈值(一般就是你输入的阈值);二值图
# 单词意思:threshold,阈值。
ret, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY) #  + cv2.THRESH_OTSU# 查找轮廓(一般都转换成灰度图查找):普通绘制轮廓、多边形逼近、凸包,都必须在查找轮廓后进行!
# 参数:二值图;怎么查找轮廓(即下标顺序以及是否查找内部轮廓);表示怎么记录轮廓,当前的是只记录关键点
# 返回值:轮廓(点的集合);层级关系
contours, hierarchy = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) # 打印轮廓(点集)
# print(contours)# 绘制轮廓
# 参数:原图(因为轮廓已经有了,不用二值图了,也不能绘制在二值图);轮廓;绘制哪个轮廓(-1 全部绘制);颜色;粗细(-1 填充外部空间)
cv2.drawContours(img, contours, -1, (0, 0, 255), 3) # 第二个参数需要是多个轮廓的列表,正好 findContours() 返回的就是# # 绘制最大轮廓,因为很乱
# # 找到最大轮廓
# max_contour = max(contours, key=cv2.contourArea)
# # 绘制最大轮廓
# cv2.drawContours(img, [max_contour], -1, (0, 0, 255), 2)# 计算面积
area = cv2.contourArea(contours[0])
print(type(area))
print(f"area = {area}")# 计算周长
# 参数:计算哪个轮廓周长;是否计算首尾相连的长度
len = cv2.arcLength(contours[0], True)
print(len)# 多边形逼近:一次只能处理一个轮廓
# 参数:通常取1%~5% 周长
e = 20 # 精度 
approx = cv2.approxPolyDP(contours[0], e, True) # 返回的是一个轮廓逼近后的数据
# cv2.drawContours(img, [approx], -1, (0, 0, 255)) # 第二个参数需要是多个轮廓的列表# 凸包:一次只能处理一个轮廓
hull = cv2.convexHull(contours[0])# 返回的是一个轮廓逼近后的数据
cv2.drawContours(img, [approx], -1, (0, 0, 255)) # 第二个参数需要是多个轮廓的列表cv2.imshow("win", img)key = cv2.waitKey(0)
if key & 0xff == ord('q'):cv2.destroyAllWindows()

numpy 创建矩阵与数组

将彩色图转换为灰度图,是为了简化通道;二值化,是为了突出目标和背景;这样才能稳定高效地提取轮廓。

目标用途推荐函数(不绝对,看你怎么给结构)示例
创建图像矩阵用作图像(黑、白、灰背景)np.zeros / ones / full(np.uint8)np.zeros((H, W, 3), np.uint8)
创建点集数组用于轮廓、多边形坐标np.array([...], np.int32)np.array([(x1,y1), (x2,y2), ...])
返回的数据类型都是np.ndarray(NumPy数组)可直接传给 OpenCV 绘图/处理函数

三种图像的区别及转换

步骤数据形式通道数优点用途
彩色图像[B, G, R]3色彩丰富原始图、显示用
灰度图像[0~255]1亮度信息,降维边缘检测、二值化前处理
二值图像0或2551背景/前景分明,适合分析形状查找轮廓、区域分析
轮廓数据一组点坐标N/A表示物体边界(如矩形、曲线)识别目标、标注框、形状分析等
操作OpenCV 函数
彩色 → 灰度cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
灰度 → 二值cv2.threshold()
边缘检测(可选)cv2.Canny()
轮廓查找cv2.findContours()
绘制轮廓cv2.drawContours()

() 与 [] 应用

[]列表:可变的、常用的点集、数组等:

[1, 2, 3]                          # Python 列表
[(100, 100), (200, 200)]          # 点集(列表嵌套元组)
np.array([[1,2], [3,4]])          # 用列表构造数组(array 一般用于点集,数组即图片用 zeros\ones\full等)

()元组:不可变,很多坐标点(以及 shape)就是元组

(100, 200)                        # 一个点的坐标(x, y)
(200, 200, 3)                     # 图像的 shape

⚠️ 注意:在 Python 中 (x, y)[x, y] 都能表示坐标,但 元组更常见更推荐


数组索引/切片 → []

数组访问用 [],绝不能用 ()

img[0, 0]                 # 访问图像的第一个像素(BGR 值)
gray[100:200, 50:100]     # 切片区域
pts[0]                    # 第一个点

典型例子对比

场景示例代码说明
✅ 调用函数cv2.threshold(..., ...)函数调用,传入参数 → 用小括号 ()
✅ 创建数组np.zeros((200, 200, 3), np.uint8)函数里再传个元组 (H, W, C)()
✅ 创建点集pts = np.array([(x1, y1), (x2, y2)], np.int32)列表 [] 里嵌套元组 ()
✅ 数组索引img[100, 50]图像访问,用方括号 []

总结口诀:

🔹 函数要调用,用 ()
🔹 列表元素,用 []
🔹 点的坐标,用 ()(元组更常见)
🔹 数组取值,也用 []

  • 博主长期更新,博主的目标是不断提升阅读体验和内容质量,如果你喜欢博主的文章,请点个赞或者关注博主支持一波,我会更加努力的为你呈现精彩的内容。

🌈专栏推荐
😈魔王的修炼之路–C语言
😈魔王的修炼之路–数据结构
😈魔王的修炼之路–C++
😈魔王的修炼之路–QT
😈魔王的修炼之路–算法
😈魔王的修炼之路–力扣
😈魔王的修炼之路–牛客
😈魔王的修炼之路–剑指offer
😈魔王的修炼之路–Linux
😈魔王的修炼之路–Computer vision
更新不易,希望得到友友的三连支持一波。收藏这篇文章,意味着你将永久拥有它,无论何时何地,都可以立即找到重新阅读;关注博主,意味着无论何时何地,博主将永久和你一起学习进步,为你带来有价值的内容。

请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/bicheng/90626.shtml
繁体地址,请注明出处:http://hk.pswp.cn/bicheng/90626.shtml
英文地址,请注明出处:http://en.pswp.cn/bicheng/90626.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

android 小bug :文件冲突的问题

文章目录前言1、问题:两个文件冲突了2、原因:3、结果:后语前言 一个身份证模块识别的小bug,记录一下,这应该是第三次出现,每次出现都不太记得,还是得记录,不然都是重复检索的过程。…

Java学习第七十三部分——Redis

目录 一、前言提要 二、核心特性 三、数据结构 四、应用场景 五、架构模式 六、性能优势 七、客户端库 八、注意事项 九、选择建议 十、使用示例——基于Jedis 和 Lettuce 十一、生态集成——基于Spring Boot 十二、企业级能力 十三、持久化机制 十四、高…

(LeetCode 每日一题) 3487. 删除后的最大子数组元素和 (哈希表)

题目:3487. 删除后的最大子数组元素和 思路:哈希表,时间复杂度0(n)。 维护数组nums的最大值mx,同时用哈希表mp维护数组中非负数出现的情况,记录非负数的和sum。如果哈希表mp的大小为0,那么数组nums都是负数…

C 语言输入输出 (I/O)

C 语言输出在C语言编程中&#xff0c;printf()是主要的输出函数之一。该函数将格式化的输出发送到屏幕。例如&#xff0c;示例1&#xff1a;C 语言输出#include <stdio.h>int main (int argc, char* argv) {printf("Hello world\n");return 0; }输出结果C Prog…

分布式系统中的缓存设计与应用

引言 缓存是分布式系统中的重要组件&#xff0c;主要解决高并发&#xff0c;大数据场景下&#xff0c;热点数据访问的性能问题。提供高性能的数据快速访问。 本文是缓存在分布式应用第一篇文章&#xff0c;介绍缓存的原理&#xff0c;缓存的分类&#xff0c;缓存的设计&#xf…

智能机器人的技术革命:从感知到决策的全栈架构解析

——基于多模态大模型的下一代机器人系统设计引言&#xff1a;机器人技术的范式迁移当波士顿动力的Atlas完成后空翻时&#xff0c;全球见证了机器人运动控制的巅峰&#xff1b;但当Figure 01通过大模型理解人类模糊指令并自主执行任务时&#xff0c;我们正见证机器人认知智能的…

day20 双向链表

双向链表的函数功能注意事项 1.双向链表还需要关注到前指针的指向2.函数都需要判断逻辑3.函数的增删都要关注到len的变化4.函数的改查功能都需要遍历结束的标志NULL5.注意p->next->prio时&#xff0c;p->next是否指向NULL创建双向链表头节点Node_ptr list_create()函数…

[Rust 基础课程]猜数字游戏-获取用户输入并打印

创建项目 按照之前的章节讲的创建一个 Cargo 项目的方法&#xff0c;自己创建一个名为 guessing_game 的 cargo 项目并执行&#xff0c;确保能成功打印出 Hello World。 编写代码 使用 RustRover 打开项目&#xff0c;打开 src/main.rs 文件&#xff0c;我们将在这个文件中编写…

重读《人件》Peopleware -(22)Ⅲ 适当人选 Ⅵ 乐在其中(上)

本章以一个小测验开始&#xff1a;问题1&#xff1a;在过去几年里&#xff0c;你们组织的年员工流失率是多少&#xff1f; 问题2&#xff1a;替换一个离职员工平均需要多少成本&#xff1f;评分标准如下&#xff1a;如果你对这两个问题有任何答案&#xff0c;则通过&#xff1b…

Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡

Go、Node.js、Python、PHP、Java五种语言的直播推流RTMP协议技术实施方案和思路-优雅草卓伊凡既然我们甲方要做直播私有化&#xff0c;既然我们做了这么多年系统&#xff0c;我们对直播的理解很深&#xff0c;那么我们2025年就应该用更先进的技术栈&#xff0c;不然怎么让我们的…

SpringBoot 集成Mybatis Plus

一、为什么SpringBoot不推荐使用MybatisSpring Boot 不推荐使用 MyBatis&#xff0c;主要源于二者在设计理念、生态融合和开发风格上的差异。Spring Boot 强调“约定优于配置”&#xff0c;追求高效的开发体验和统一的框架风格。它通过自动配置和依赖注入&#xff0c;将复杂的基…

PI 思维升级 PI设计的典范转移:从阻抗思维到谐振控制

们先来回想一件事&#xff0c;根据欧姆定律&#xff0c;阻抗是不是越低越好&#xff1f; 代表即使有很大的瞬时电流&#xff0c;瞬间的电压降也不会超过某个极限&#xff01;理论上是&#xff01; 可是这其实忽略了两个关键的要素&#xff1a;PDN阻抗有谐振&#xff1a;谐振代表…

如何制定企业级服务器安全策略(Security Policy)

制定一套**企业级服务器安全策略&#xff08;Security Policy&#xff09;**对于保护服务器资源、数据安全和业务连续性至关重要。以下是制定安全策略的详细指南&#xff0c;包括安全策略的核心要素、实施步骤和具体措施&#xff0c;帮助企业构建全面的服务器安全防护体系。1. …

n1 armbian docker compose 部署aipan mysql

apt update apt install docker-compose-plugin -y #安装docker compose docker compose version Docker Compose version v2.38.2 sudo mkdir -p /sda1/data/mysql/conf.d sudo chown -R 999:999 /sda1/data/mysql # MySQL 用户 UID 通常为 999 cat docker-compose.yml vers…

RAG情境化分段向量模型voyage-context-3,聚焦分段细节,融入全局文档上下文

最近看到一个有意思的工作&#xff0c;原文来自&#xff1a; https://blog.voyageai.com/2025/07/23/voyage-context-3/?utm_sourceTWITTER&utm_mediumORGANIC_SOCIAL voyage-context-3&#xff1a;聚焦分段细节&#xff0c;融入全局文档上下文 概要&#xff1a; Voyage A…

计算机体系结构中的中断服务程序ISR是什么?

计算机体系结构中的中断服务程序ISR是什么&#xff1f; 在计算机体系结构中&#xff0c;中断服务程序&#xff08;Interrupt Service Routine, ISR&#xff09; 是操作系统或硬件直接调用的关键代码模块&#xff0c;用于响应来自硬件设备、软件异常或系统事件的中断信号。其核心…

开源项目XBuilder前端框架

spx-gui/ 配置文件package.json 项目依赖和脚本配置vite.config.ts Vite构建工具配置tsconfig.json TS项目配置主文件tsconfig.app.json 应用程序的TS配置tsconfig.node.json Node.js环境的TS配置index.html 应用入口HTML文件src/ 源码目录main.ts 应用入口文件&#xff0c;初始…

0723 单项链表

Part 1.完成单向链表&#xff0c;并完成下面功能1.单链表节点创建链表是物理空间上不连续的一个结构&#xff0c;需要创建一个next作为指向下一个节点的指针&#xff0c;所以需要建立一个结构体包含数据域&#xff0c;next指针域&#xff0c;记录长度的数据域。因为长度只有头节…

基于 ASP.NET Web 应用程序(.NET Framework)的花店系统

1.1功能模块实现1.1.1整体结构界面由两部分组成&#xff1a;左侧导航栏、右侧内容展示区。使用了 Bootstrap 5 的样式库&#xff0c;并结合了 ASP.NET MVC 的 Html.ActionLink 和 Razor 条件判断语句来动态生成菜单项。1.1.2导航栏功能模块导航栏基础结构导航栏基础结构使用 Bo…