如何用OpenCV的drawContours()仅绘制轮廓点而非连线(Python)
解决方法:绘制轮廓近似的离散点
不用cv2.drawContours()(该函数默认会连接轮廓点成线),改为遍历近似轮廓的每个点,用cv2.circle()逐个绘制离散点即可,具体修改如下:
代码修改示例
假设你已经完成轮廓提取与近似的步骤:
# 已有的轮廓处理流程 cnts = cv2.findContours(mask.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) cnts = imutils.grab_contours(cnts) # 取面积最大的轮廓 cnt = max(cnts, key=cv2.contourArea) # 计算轮廓周长并做近似 peri = cv2.arcLength(cnt, True) approx = cv2.approxPolyDP(cnt, 0.02 * peri, True)
替换原有的cv2.drawContours()代码,改为以下绘制逻辑:
# 准备绘制画布(这里以mask转彩色为例,也可以直接用原图) output = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR) # 遍历每个近似点,逐个绘制圆形点 for point in approx: x, y = point[0] # 提取点的坐标(approx结构为[[[x,y]]]) # 参数说明:图像、圆心坐标、点的半径、颜色(BGR)、填充厚度(-1为实心) cv2.circle(output, (x, y), 6, (0, 0, 255), -1) # 展示结果 cv2.imshow("Approximated Discrete Points", output) cv2.waitKey(0)
关键细节
approx是三维数组结构,每个点被包裹在两层列表中,所以需要用point[0]取出实际的(x,y)坐标- 可根据需求调整
cv2.circle()的半径(比如6)和颜色(比如红色(0,0,255)) - 如果要在原图上绘制,直接将
output替换为你的原图变量即可
内容的提问来源于stack exchange,提问作者pranav nerurkar
相关产品推荐
相关产品推荐

