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

如何使用Python在图片上绘制线条?OpenCV实现相关问题求助

你现有代码已经实现了轮廓提取、绘制轮廓本身(青色线条)和轮廓最小外接矩形(红色线条)的功能,如果需要额外绘制自定义线条,可参考以下方案调整:

功能实现说明

绘制线条的核心API

OpenCV绘制直线直接调用cv2.line()即可,参数定义如下:

  • 第一个参数:目标绘图图像
  • 第二个参数:线段起点坐标,格式为(x,y)整数元组
  • 第三个参数:线段终点坐标,格式同上
  • 第四个参数:线条颜色,BGR格式,例如(0,255,0)为纯绿色
  • 第五个参数:线条粗细,单位为像素,默认值为1

常见场景示例

场景1:给每个轮廓拟合直线并绘制

如果需要用直线拟合每个检测到的轮廓,可以在遍历轮廓的循环中添加如下逻辑:

for c in contours:
    # 原有逻辑不变
    if len(c) >= 2: # 至少需要2个点才能拟合直线
        [vx,vy,x,y] = cv2.fitLine(c, cv2.DIST_L2, 0, 0.01, 0.01)
        # 计算直线的左右端点,让直线贯穿整个图像
        lefty = int((-x*vy/vx) + y)
        righty = int(((img.shape[1]-x)*vy/vx)+y)
        # 绘制绿色拟合直线,粗细为2
        cv2.line(img, (img.shape[1]-1, righty), (0, lefty), (0,255,0), 2)

场景2:绘制任意指定坐标的直线

如果要画自定义位置的直线,直接调用API即可,比如绘制一条从图像左上角到右下角的对角线:

# 在循环外、imshow前添加
h, w = img.shape[:2]
cv2.line(img, (0,0), (w, h), (255,0,0), 3)

现有代码优化点

  • 重复调用了两次cv2.imshow("contours", img),删除其中一次即可
  • 如果觉得现有绘制的轮廓、外接矩形线条太细,可以调整cv2.drawContours的最后一个参数,将数值调大即可

修改后的完整运行代码如下:

import cv2
import numpy as np
import sys

# 图像下采样读取
img = cv2.pyrDown(cv2.imread("ellipse.png", cv2.IMREAD_UNCHANGED))

# 阈值处理
ret, threshed_img = cv2.threshold(cv2.cvtColor(img, cv2.COLOR_BGR2GRAY),
                127, 255, cv2.THRESH_BINARY)
# 查找轮廓
contours, hier = cv2.findContours(threshed_img, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)


for c in contours:
    # 最小外接矩形绘制
    rect = cv2.minAreaRect(c)
    box = cv2.boxPoints(rect)
    box = np.int0(box)
    cv2.drawContours(img, [box], 0, (0, 0, 255), 2)

    # 新增:轮廓拟合直线绘制
    if len(c) >= 2:
        [vx,vy,x,y] = cv2.fitLine(c, cv2.DIST_L2, 0, 0.01, 0.01)
        lefty = int((-x*vy/vx) + y)
        righty = int(((img.shape[1]-x)*vy/vx)+y)
        cv2.line(img, (img.shape[1]-1, righty), (0, lefty), (0,255,0), 2)
    

print(f"检测到的轮廓数量:{len(contours)}")
# 绘制原始轮廓
cv2.drawContours(img, contours, -1, (255, 255, 0), 1)

cv2.imshow("contours", img)

while True:
    key = cv2.waitKey(1)
    if key == 27: #ESC键退出
        break

cv2.destroyAllWindows()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.20 23:54:05