如何删除Opencv已经绘制出来的线段,像cv2.line这些画出来就没办法删除了吗?
img | 必选参数: 输入的图像数组,numpy.ndarray,即 N 维数组对象; |
---|---|
pt1 | 必选参数: 线段的第1点。 |
pt2 | 必选参数: 线段的第2点。 |
color | 必选参数: 线段的颜色 ,注意是BGR通道顺序; |
thickness | 可选参数: 线段的粗细 |
lineType | 可选参数: 线段的类型 |
shift | 可选参数: 点坐标中的小数位数。 |
你这种有重叠图案的,我还是比较建议画整张图来实现你说的帧变问题,不然想要达到改变局部的画,你得计算出来重叠部分的交点,如果是规则的还好,不规则的难度上天,还不如像电影那样,计算每一帧的显示画面,然后覆盖掉上一帧的方式来的好。而且绘制这个速度很快的,不会比你去计算交点然后用黑色线覆盖来的慢的
(1)cv2.line画出来的线,是修改了原图的像素值,所以是不能删除或恢复的。当然,可以用 AI 方法修复,但并不是删除原来绘制的线。
(2)要实现你描述的效果,最简单的方法就是保留原图,在原图的 copy 上绘制直线或图形,然后动态刷新。
在 OpenCV 中,你可以通过重新绘制线条来“删除”已经画出的线段。具体方法是:在画线条之前清空图像或重置已有的线段,并使用不同颜色或透明度重新绘制线条。
下面是一个简单的示例代码,演示了如何在 OpenCV 中实现轨迹拖尾效果:
import cv2
import numpy as np
# 定义画布大小和背景颜色
canvas_size = (640, 480)
background_color = (255, 255, 255)
# 创建画布
canvas = np.zeros((canvas_size[1], canvas_size[0], 3), dtype=np.uint8)
canvas[:] = background_color
# 定义线条颜色和粗细
line_color = (0, 0, 255)
line_thickness = 3
# 循环读取鼠标坐标并绘制线条
points = []
while True:
# 获取鼠标坐标
x, y = cv2.getWindowImageRect('Window')[:2]
mx, my = cv2.getMousePosition()
mx -= x
my -= y
# 绘制线条
if len(points) > 1:
cv2.polylines(canvas, [np.array(points)], False, background_color, thickness=line_thickness+1)
cv2.polylines(canvas, [np.array(points)], False, line_color, thickness=line_thickness)
# 显示画布
cv2.imshow('Window', canvas)
# 处理按键事件
key = cv2.waitKey(1) & 0xFF
if key == ord('q'):
break
# 删除最后一个点
elif key == ord('z') and len(points) > 0:
points.pop()
# 清空画布
elif key == ord('c'):
canvas[:] = background_color
points.clear()
# 添加新的点
else:
points.append((mx, my))
# 关闭窗口
cv2.destroyAllWindows()
在这个示例代码中,我们通过 cv2.polylines()
函数绘制线条,并使用不同颜色和粗细来模拟轨迹拖尾效果。在每次循环开始时,我们将上一次绘制的线段用背景颜色覆盖掉,并重新绘制当前的线段。如果要删除前一段所画的线段,可以尝试在每次循环结束时保存当前的线段坐标,并根据需要选择删除前几个点。如果要删除两个点之间的线段,可以使用类似于重绘线段的方法,先使用背景颜色将该线段覆盖掉,然后重新绘制剩余部分的线段。