根据mask获取外围点坐标

本文介绍了使用OpenCV库在Python中进行图像轮廓检测的方法,重点讲解了`cv2.findContours()`函数,该函数用于查找图像中的轮廓,并返回轮廓和层次结构信息。通过`cv2.RETR_TREE`和`cv2.CHAIN_APPROX_SIMPLE`参数设置,可以详细地分析轮廓间的父子关系,对于图像处理和对象识别任务非常有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

contours, hierarchy = cv2.findContours(mmask, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

``` import open3d as o3d import numpy as np def slice_point_cloud(pcd, axis='x', position=0.0, tolerance=0.1): """ 改进版云切片函数(继承颜色信息) :param pcd: 输入云 :param axis: 切片轴向 ('x' 或 'y') :param position: 切片位置 :param tolerance: 切片厚度半径 :return: 切片后的云 """ points = np.asarray(pcd.points) # 创建轴向选择掩码 axis_index = 0 if axis.lower() == 'x' else 1 mask = (points[:, axis_index] > position - tolerance) & (points[:, axis_index] < position + tolerance) # 创建切片云并继承颜色 sliced_pcd = o3d.geometry.PointCloud() sliced_pcd.points = o3d.utility.Vector3dVector(points[mask]) if pcd.has_colors(): sliced_pcd.colors = o3d.utility.Vector3dVector(np.asarray(pcd.colors)[mask]) return sliced_pcd # 新增函数:创建独立坐标系 def create_coord(): """创建新的坐标系实例""" return o3d.geometry.TriangleMesh.create_coordinate_frame(size=1.0) if __name__ == "__main__": # 加载云并设置颜色 pcd1 = o3d.io.read_point_cloud("source.pcd").paint_uniform_color([1, 0, 0]) # 红色 pcd2 = o3d.io.read_point_cloud("target.pcd").paint_uniform_color([0, 1, 0]) # 绿色 # 创建主坐标系(用于第一个窗口) coord_main = create_coord() while True: # 用户输入处理 axis = input("请输入切片轴向 (x/y,输入q退出): ").lower() if axis == 'q': break if axis not in ['x', 'y']: print("输入错误,请重新输入!") continue try: position = float(input("请输入切片位置: ")) except ValueError: print("请输入有效数字!") continue # 执行切片操作 tolerance = 0.1 sliced1 = slice_point_cloud(pcd1, axis, position, tolerance) sliced2 = slice_point_cloud(pcd2, axis, position, tolerance) # 创建新的坐标系实例(用于第二个窗口) coord_secondary = create_coord() # 分别可视化两个切片 vis1 = o3d.visualization.Visualizer() vis1.create_window(window_name="Source切片视图", width=800, height=600) vis1.add_geometry(sliced1) vis1.add_geometry(coord_main) vis2 = o3d.visualization.Visualizer() vis2.create_window(window_name="Target切片视图", width=800, height=600) vis2.add_geometry(sliced2) vis2.add_geometry(coord_secondary) # 修改这里 # 保持窗口显示 vis1.run() vis2.run() # 清理资源 vis1.destroy_window() vis2.destroy_window()```在这个代码的基础上增加,将两个云切片在该切片平面上做投影,找到第一个云文件切片坐标最靠外的两个,第二个云切片只显示这个坐标外的,比如说平行于y-z平面的切片就只取y值最大与最小的,第二个云切片只取y值在这两个范围之外的
03-24
### 使用 YOLOv8 获取分割坐标的实现 YOLOv8 提供了强大的目标检测和语义分割功能,其中分割部分可以返回掩码(mask),通过这些掩码可以进一步提取分割区域的关键或边界坐标。以下是具体的方法说明以及代码示例。 #### 方法概述 为了获取分割坐标,可以通过以下方式完成: 1. **加载模型**:使用 `YOLO` 类加载预训练的分割模型。 2. **预测图像**:调用模型的 `.predict()` 方法对输入图像进行推理。 3. **解析结果**:从预测结果中提取掩码数据,并计算其轮廓或关键位置。 4. **转换为坐标**:将掩码转化为实际像素坐标列表。 下面是完整的 Python 实现: ```python from ultralytics import YOLO import cv2 import numpy as np # 加载预训练的YOLOv8分割模型 model = YOLO(r"E:\project\MODEL\YOLO\yolov8-8.2.76\ultralytics-8.2.76\yu\segmentation\yolov8n-seg.pt") # 输入图片路径 image_path = r"E:\example.jpg" img = cv2.imread(image_path) # 进行预测 results = model.predict(img, conf=0.5, iou=0.5)[0] # 遍历每个检测到的对象 for result in results.masks.xy: # .masks.xy 返回的是每个对象的多边形顶集合 for polygon in result: # 将多边形顶转为整数形式以便绘制 points = [(int(x), int(y)) for x, y in polygon] # 打印分割坐标 print(f"Segment Points: {points}") # 可选操作:在原图上绘制分割 for point in points: cv2.circle(img, point, radius=2, color=(0, 255, 0), thickness=-1) # 显示带有标注的结果图像 cv2.imshow("Result with Segment Points", img) cv2.waitKey(0) cv2.destroyAllWindows() ``` #### 关键解释 - **`.masks.xy` 属性**:该属性提供了每个多边形的顶坐标列表[^1]。每个顶是一个 `(x, y)` 坐标对,表示分割区域的边缘。 - **置信度阈值 (`conf`) 和 IOU 阈值 (`iou`)**:这两个参数控制着哪些预测会被保留下来作为最终结果[^2]。 - **绘图辅助**:虽然不是必需,但在调试阶段可视化分割有助于验证算法效果。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值