如何使用OpenCV获取检测到的轮廓的(X,Y)坐标点
OpenCV-Python 提取边缘坐标点的实现方法
场景1:已生成二值边缘图
如果你已经通过Canny等算子得到了边缘二值图(边缘像素值为255,背景为0),直接提取所有非零像素坐标即可:
import cv2 import numpy as np # 读取边缘图,或直接使用你代码中生成的边缘变量 edge_img = cv2.imread("edge_result.png", 0) # 获取所有边缘点坐标,返回格式为 (y, x) 数组 edge_coords = np.column_stack(np.where(edge_img > 0)) # 遍历所有坐标 for y, x in edge_coords: print(f"x: {x}, y: {y}")
场景2:需要从原图提取绿色边界再获取坐标
如果还没有生成边缘图,先通过颜色分割提取绿色边界,再拿坐标:
import cv2 import numpy as np # 读取原图 img = cv2.imread("original_image.jpg") # 转HSV颜色空间方便提取绿色 hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # 绿色HSV阈值范围,可根据实际画面色调调整 lower_green = np.array([35, 43, 46]) upper_green = np.array([77, 255, 255]) # 生成绿色区域掩膜 mask = cv2.inRange(hsv, lower_green, upper_green) # 提取所有绿色边缘点坐标 green_coords = np.column_stack(np.where(mask > 0)) for y, x in green_coords: print(f"x: {x}, y: {y}")
场景3:从轮廓检测结果直接获取所有坐标
如果你是通过cv2.findContours检测轮廓后再绘制的绿色边界,可直接在检测阶段就拿到全量坐标,不需要从绘制后的图二次提取,效率更高:
import cv2 import numpy as np img = cv2.imread("original_image.jpg") gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) edges = cv2.Canny(gray, 50, 150) # 关键参数cv2.CHAIN_APPROX_NONE:保留所有轮廓点,不做压缩 contours, hierarchy = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) for cnt in contours: for point in cnt: x, y = point[0] print(f"x: {x}, y: {y}")
优化建议
- 要获取尽可能多的坐标点,边缘检测前不要做高斯模糊,避免平滑丢失细节边缘点
- 如果存在噪点干扰,可先对掩膜/边缘图做形态学开运算,过滤孤立噪点后再提取坐标
- 轮廓检测时必须使用
cv2.CHAIN_APPROX_NONE参数,默认的cv2.CHAIN_APPROX_SIMPLE会只保留轮廓端点,丢失大量中间坐标
内容的提问来源于stack exchange,提问作者khushtar neyazi
相关产品推荐
相关产品推荐

