findContours

简介: findContours

在您提供的代码中,cv2.findContours 函数返回了两个值:contourshierarchycontours 是一个轮廓列表,每个轮廓由多个点组成,而 hierarchy 包含了轮廓之间的层级关系。在某些情况下,一个完整的形状(如五角星)可能会被检测为多个轮廓片段。

为了给整个五角星绘制一个矩形框,我们需要重新考虑如何确定这个矩形框。由于 contours[0] 只包含了五角星的一部分,您不能简单地选择 contours 列表中的一个轮廓来包围整个五角星。

以下是一些可能的解决方案:
image.png

  1. 使用 cv2.boundingRect 包围所有轮廓点:您可以迭代所有的轮廓,并使用 cv2.boundingRect 来获取每个轮廓的边界矩形,然后找到包围所有这些矩形的最小矩形。

  2. 使用 cv2.minAreaRectcv2.minEnclosingCircle:这些函数可以返回一个最小的形状(矩形或圆),它可以包围所有的轮廓点。

  3. 自定义方法:您可以自定义一个算法来确定五角星的外接矩形。例如,记录所有轮廓点的最小和最大 x 和 y 坐标,然后使用这些坐标来绘制矩形框。

以下是使用第一种方法绘制包围整个五角星的最小矩形框的示例代码:

import cv2
import numpy as np

img = cv2.imread("star.png")
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)

# 寻找所有轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

# 初始化最小和最大坐标
min_x, min_y = np.inf, np.inf
max_x, max_y = 0, 0

# 迭代所有轮廓,更新坐标
for contour in contours:
    x, y, w, h = cv2.boundingRect(contour)
    min_x = min(min_x, x)
    min_y = min(min_y, y)
    max_x = max(max_x, x + w)
    max_y = max(max_y, y + h)

# 使用找到的坐标绘制矩形框
cv2.rectangle(img, (min_x, min_y), (max_x, max_y), (0, 0, 255), 2)

cv2.imshow("img", img)
cv2.waitKey()
cv2.destroyAllWindows()

请注意,这种方法可能不总是完美的,特别是如果轮廓之间有较大的间隙,计算出的最小矩形可能会比实际五角星的边界大。在实践中,可能需要根据具体情况调整算法。

目录
相关文章
|
机器学习/深度学习 数据采集 算法
残差分析| 学习笔记
快速学习残差分析。
942 0
残差分析| 学习笔记
|
4天前
|
存储 测试技术 Go
Golang框架实战-KisFlow流式计算框架(2)-项目构建/基础模块-(上)
KisFlow项目源码位于<https://github.com/aceld/kis-flow,初始阶段涉及项目构建和基础模块定义。首先在GitHub创建仓库,克隆到本地。项目目录包括`common/`, `example/`, `function/`, `conn/`, `config/`, `flow/`, 和 `kis/`。`go.mod`用于包管理,`KisLogger`接口定义了日志功能,提供不同级别的日志方法。默认日志对象`kisDefaultLogger`打印到标准输出。
623 1
Golang框架实战-KisFlow流式计算框架(2)-项目构建/基础模块-(上)
|
9月前
|
存储 JSON 前端开发
React+node 图片剪裁上传,集成本地存储和阿里云OSS
最近一直在调研图片上传阿里云oss功能,上篇文章主要讲述了阿里云oss大文件分片、断点续传。这篇文章是在原有基础上,前端加了图片剪裁、后端加了本地存储功能。
220 0
React+node 图片剪裁上传,集成本地存储和阿里云OSS
|
10月前
|
运维 安全 Cloud Native
云原生网关如何实现安全防护能力
云原生网关如何实现安全防护能力
|
9月前
|
网络协议 安全 Go
GO语言进程间通信方式
Go语言提供了多种进程间通信(Inter-Process Communication,IPC)的方式,以下是其中一些常用的方式:
571 0
|
移动开发 Go
GO 利用bufio包(流式操作) - 并发写文件/读文件示例
GO 利用bufio包(流式操作) - 并发写文件/读文件示例
480 0
GO 利用bufio包(流式操作) - 并发写文件/读文件示例
|
机器学习/深度学习 算法 测试技术
适合离散值分类的多分类模型——softmax回归
适合离散值分类的多分类模型——softmax回归
适合离散值分类的多分类模型——softmax回归
|
测试技术 项目管理 UED
如何进行需求分析?
做技术的同学对于需求应该是既爱又恨,一方面软件产品的源头来自于需求,另一方面日常工作中面对需求的不明确和经常变更,只能无能狂怒。日常的工作流中,需求分析和需求评审的结果往往决定了这个版本交付质量的好坏。
如何进行需求分析?
|
Shell Java
shell编程之转义和引用
shell中有两类字符,一类是普通字符,在Shell中除了本身的字面意思外没有其他特殊意义,即普通纯文本;另一类即元字符,是Shell的保留字符,在Shell中有着特殊的含义。 一、转义 转义是指使用转义符引用单个字符,从而使其表达单纯的字符的字面含义。
1844 0