如何使用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
相关产品推荐
相关产品推荐

