You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:如何用OpenCV Python获取目标形状的端点p1、p2、p3、p4?

解决OpenCV识别形状端点的问题

原代码存在的问题

  1. 未导入numpy库,但代码中使用了np.int0,会直接报错
  2. 轮廓获取逻辑错误:
    • 没有调用OpenCV的cv2.findContours函数,直接写cnt= contours(cropped_image)是无效的
    • 直接对彩色图像查找轮廓不合理,需要先转为灰度图并做二值化处理
  3. 用minAreaRect得到的是目标形状的外接矩形顶点,不是你需要的形状自身的端点p1、p2、p3、p4

修正后的实现代码

import cv2
import numpy as np

# 读取图像
cropped_image = cv2.imread('croped_img.png')
original_image = cropped_image.copy()

# 转为灰度图
gray = cv2.cvtColor(cropped_image, cv2.COLOR_BGR2GRAY)
# 二值化处理(调整阈值适配你的图像)
_, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY_INV)

# 查找轮廓
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
# 筛选最大的轮廓(假设目标是图像中最大的形状)
cnt = max(contours, key=cv2.contourArea)

# 轮廓逼近,得到多边形顶点(即目标端点p1-p4)
# epsilon值控制逼近精度,这里取轮廓周长的0.02倍
epsilon = 0.02 * cv2.arcLength(cnt, True)
approx = cv2.approxPolyDP(cnt, epsilon, True)

# 转为整数坐标
approx = np.int0(approx)
print("形状端点坐标:", approx)

# 在图像上绘制端点和轮廓
cv2.drawContours(cropped_image, [approx], 0, (0, 0, 255), 2)
for point in approx:
    x, y = point[0]
    cv2.circle(cropped_image, (x, y), 5, (0, 255, 0), -1)

# 显示结果
cv2.imshow('Original', original_image)
cv2.imshow('Result', cropped_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

关键步骤说明

  1. 图像预处理:转灰度、二值化是为了突出目标轮廓,让OpenCV能准确识别边缘
  2. 轮廓筛选:取最大轮廓确保我们处理的是目标形状,排除图像中的小噪点轮廓
  3. 轮廓逼近:cv2.approxPolyDP通过Douglas-Peucker算法将复杂轮廓简化为多边形,调整epsilon值可以控制逼近的精细程度,最终得到的approx就是形状的四个端点坐标

内容的提问来源于stack exchange,提问作者Ali Ahmad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 04:06:19