cv2.findContours()函数介绍和解析

时间: 2023-11-02 07:32:18 浏览: 45
cv2.findContours()是一个用于在二进制图像中查找轮廓的函数。该函数接受一张二进制图像作为输入,并返回一个轮廓列表和轮廓的层次结构。 函数语法如下: `contours, hierarchy = cv2.findContours(image, mode, method, offset)` 其中参数含义如下: - image:输入的二进制图像。 - mode:轮廓检索模式,可以是RETR_EXTERNAL(只检索最外层轮廓)、RETR_LIST(检索所有轮廓,不建立父子关系)、RETR_CCOMP(检索所有轮廓,建立两层父子关系)、RETR_TREE(检索所有轮廓,建立完整的父子层级关系)。 - method:轮廓逼近方法,可以是CHAIN_APPROX_NONE(存储所有的轮廓点)、CHAIN_APPROX_SIMPLE(仅存储水平、垂直和斜线端点)、CHAIN_APPROX_TC89_L1、CHAIN_APPROX_TC89_KCOS。 - offset:可选参数,表示偏移量,用于调整轮廓中的坐标值。 该函数返回轮廓列表和轮廓的层次结构,其中轮廓列表是一个Numpy数组,每个元素都是一个轮廓,包含了轮廓上的所有点的坐标。轮廓的层次结构是一个Numpy数组,每个元素都是一个四元组,包含了轮廓的索引、下一个轮廓的索引、父轮廓的索引和内部轮廓的索引。 使用cv2.drawContours()函数可以在原始图像上绘制轮廓。
相关问题

results = [] if masks.shape[0] > 0: for label, score, seg in zip(class_ids, conf, masks): # 解析分割掩码 mask = seg.argmax(axis=0) # 取最大值的索引,将二维掩码还原为一维 mask = mask.astype(np.uint8) # 将掩码转换为无符号整数类型 _, mask_binary = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY) # 将掩码转换为二值图像 # 获取分割多边形 contours, _ = cv2.findContours(mask_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contour = contours[0].flatten().tolist() if len(contours) > 0 else [] results.append({ "confidence": str(score), "label": labels.get(label, "unknown"), "polygon": contour, "type": "polygon", "mask": mask.tolist() # 将分割掩码转换为列表形式 })直接给出掩码 成点points:

如果要将掩码转换为点(points)形式,您可以使用`cv2.findContours`函数找到分割多边形的轮廓,并将轮廓的点坐标提取出来作为点(points)。 以下是修改后的代码示例: ```python results = [] if masks.shape[0] > 0: for label, score, seg in zip(class_ids, conf, masks): # 解析分割掩码 mask = seg.argmax(axis=0) # 取最大值的索引,将二维掩码还原为一维 mask = mask.astype(np.uint8) # 将掩码转换为无符号整数类型 _, mask_binary = cv2.threshold(mask, 0, 255, cv2.THRESH_BINARY) # 将掩码转换为二值图像 # 获取分割多边形 contours, _ = cv2.findContours(mask_binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) contour = contours[0] if len(contours) > 0 else [] # 将分割多边形的点坐标转换为列表的点(points)形式 points = contour.squeeze().tolist() if len(contour) > 0 else [] results.append({ "confidence": str(score), "label": labels.get(label, "unknown"), "points": points, "type": "polygon", "mask": mask.tolist() # 将分割掩码转换为列表形式 }) ``` 在这个示例中,`contours[0]`表示第一个轮廓的点坐标,通过`squeeze()`方法将其从二维数组转换为一维数组,并使用`tolist()`方法将其转换为列表形式。然后将这些点(points)添加到结果中。 请注意,这里的`points`是以列表形式表示的点坐标,而不是一个个独立的点。如果您需要将每个点表示为独立的坐标对,可以进一步对`points`进行处理。

优化这段代码import cv2 import imutils import numpy as np img = cv2.imread('D:\pycharm\PycharmProjects\pythonProject\p1\p1.jpg', cv2.IMREAD_COLOR) img = cv2.resize(img, (600, 400)) cv2.imshow('Origin image', img) img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY) img_gray = cv2.bilateralFilter(img_gray, 13, 15, 15) img_edged = cv2.Canny(img_gray, 30, 200) cv2.imshow('edged image', img_edged) img_contours = cv2.findContours(img_edged.copy(), cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE) img_contours = imutils.grab_contours(img_contours) img_contours = sorted(img_contours, key=cv2.contourArea, reverse=True)[:10] screenCnt = None for c in img_contours: peri = cv2.arcLength(c, True) approx = cv2.approxPolyDP(c, 0.018 * peri, True) if len(approx) == 4: screenCnt = approx break if screenCnt is None: detected = 0 print("No contour detected") else: detected = 1 if detected == 1: cv2.drawContours(img, [screenCnt], -1, (0, 0, 255), 3) mask = np.zeros(img_gray.shape, np.uint8) new_image = cv2.drawContours(mask, [screenCnt], 0, 255, -1, ) cv2.imshow('mask_image', new_image) new_image = cv2.bitwise_and(img, img, mask=mask) (x, y) = np.where(mask == 255) (topx, topy) = (np.min(x), np.min(y)) (bottomx, bottomy) = (np.max(x), np.max(y)) cropped = img_gray[topx:bottomx + 1, topy:bottomy + 1] cropped = cv2.resize(cropped, (400, 200)) cv2.imshow('Cropped', cropped) cv2.waitKey(0) cv2.destroyAllWindows()

这段代码主要是对一张图片进行边缘检测,并找出图片中的一个矩形区域进行裁剪。下面是对代码的一些优化建议: 1. 将代码拆分成多个函数,增加代码的可读性和可维护性。 2. 将文件路径字符串改为使用原始字符串(raw string),以避免转义字符带来的问题。 3. 考虑使用命令行参数或配置文件来指定输入文件路径和其他参数,以增加代码的灵活性。 4. 添加错误处理机制,例如检查文件是否存在,处理可能出现的异常情况。 5. 使用`with`语句来管理资源,例如`cv2.VideoCapture`和`cv2.imshow`,以确保资源的正确释放。 6. 使用`argparse`模块来解析命令行参数,以方便指定不同的参数和选项。 7. 使用更具描述性的变量名,以增加代码的可读性。 8. 添加注释来解释代码的功能和逻辑。 9. 考虑使用适当的异常处理机制,例如在无法找到矩形区域时抛出异常或返回错误码。 以上是对代码的一些优化建议,你可以根据实际需求进行调整。

相关推荐

import json import base64 from PIL import Image import io import cv2 import numpy as np from ultralytics import YOLO import supervision as sv def init_context(context): context.logger.info("Init context... 0%") model_path = "yolov8m-seg.pt" # YOLOV8模型放在nuclio目录下构建 model = YOLO(model_path) # Read the DL model context.user_data.model = model context.logger.info("Init context...100%") def handler(context, event): context.logger.info("Run yolo-v8-seg model") data = event.body buf = io.BytesIO(base64.b64decode(data["image"])) threshold = float(data.get("threshold", 0.35)) context.user_data.model.conf = threshold image = Image.open(buf) yolo_results = context.user_data.model(image, conf=threshold)[0] labels = yolo_results.names detections = sv.Detections.from_yolov8(yolo_results) detections = detections[detections.confidence > threshold] masks = detections.xy conf = detections.confidence class_ids = detections.class_id results = [] if masks.shape[0] > 0: for label, score, mask in zip(class_ids, conf, masks): # 将mask转换为轮廓 contours, _ = cv2.findContours(mask.astype(np.uint8), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) for contour in contours: points = [] for point in contour: x = point[0][0] y = point[0][1] points.append([x, y]) results.append({ "confidence": str(score), "label": labels.get(label, "unknown"), "points": points, "type": "polygon",}) return context.Response(body=json.dumps(results), headers={}, content_type='application/json', status_code=200)不用supervision 包 用别的方式解析

最新推荐

recommend-type

grpcio-1.47.0-cp310-cp310-linux_armv7l.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

小程序项目源码-美容预约小程序.zip

小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序小程序项目源码-美容预约小程序v
recommend-type

MobaXterm 工具

MobaXterm 工具
recommend-type

grpcio-1.48.0-cp37-cp37m-linux_armv7l.whl

Python库是一组预先编写的代码模块,旨在帮助开发者实现特定的编程任务,无需从零开始编写代码。这些库可以包括各种功能,如数学运算、文件操作、数据分析和网络编程等。Python社区提供了大量的第三方库,如NumPy、Pandas和Requests,极大地丰富了Python的应用领域,从数据科学到Web开发。Python库的丰富性是Python成为最受欢迎的编程语言之一的关键原因之一。这些库不仅为初学者提供了快速入门的途径,而且为经验丰富的开发者提供了强大的工具,以高效率、高质量地完成复杂任务。例如,Matplotlib和Seaborn库在数据可视化领域内非常受欢迎,它们提供了广泛的工具和技术,可以创建高度定制化的图表和图形,帮助数据科学家和分析师在数据探索和结果展示中更有效地传达信息。
recommend-type

扁平风格PPT可修改ppt下载(11).zip

扁平风格PPT可修改ppt下载(11).zip
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

【实战演练】MATLAB用遗传算法改进粒子群GA-PSO算法

![MATLAB智能算法合集](https://static.fuxi.netease.com/fuxi-official/web/20221101/83f465753fd49c41536a5640367d4340.jpg) # 2.1 遗传算法的原理和实现 遗传算法(GA)是一种受生物进化过程启发的优化算法。它通过模拟自然选择和遗传机制来搜索最优解。 **2.1.1 遗传算法的编码和解码** 编码是将问题空间中的解表示为二进制字符串或其他数据结构的过程。解码是将编码的解转换为问题空间中的实际解的过程。常见的编码方法包括二进制编码、实数编码和树形编码。 **2.1.2 遗传算法的交叉和
recommend-type

openstack的20种接口有哪些

以下是OpenStack的20种API接口: 1. Identity (Keystone) API 2. Compute (Nova) API 3. Networking (Neutron) API 4. Block Storage (Cinder) API 5. Object Storage (Swift) API 6. Image (Glance) API 7. Telemetry (Ceilometer) API 8. Orchestration (Heat) API 9. Database (Trove) API 10. Bare Metal (Ironic) API 11. DNS
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。