如何使用Python OpenCV为绘制的线条添加透明效果
透明效果失效的原因
- 未定义
output变量:代码中调用cv2.addWeighted时用到的output变量没有提前初始化,部分运行环境下会直接报错,就算无报错也会因变量指向异常导致叠加逻辑失效。 - 叠加逻辑位置错误:你把
overlay = image.copy()和叠加操作放在了循环内部,每次循环都会用原始图复制新的overlay、仅绘制当前一根线再叠加,之前循环绘制的线条会被完全覆盖,最终只能看到最后一根线的叠加效果,甚至完全看不到透明效果。 - 可选优化:当前设置的overlay权重为0.4,线条显示浓度较低,可根据需求自行调整参数。
修正后的代码
def draw_from_pitch_to_image(image, reverse_output_points): # 仅初始化一次overlay,避免循环重复复制 overlay = image.copy() alpha = 0.4 # 数值越大线条越不透明,可自行调整 for i in range(0, len(reverse_output_points), 2): x1, y1 = reverse_output_points[i] x2, y2 = reverse_output_points[i + 1] x1 = int(x1) y1 = int(y1) x2 = int(x2) y2 = int(y2) color = [255, 0, 0] if i < 1 else [0, 0, 255] # 所有线条统一绘制到同一个overlay上 cv2.line(overlay, (x1, y1), (x2, y2), color, 2) # 所有线条绘制完成后,仅执行一次叠加 cv2.addWeighted(overlay, alpha, image, 1 - alpha, 0, image) # 如果需要保留原始图像不被修改,可改用以下逻辑返回新图像: # output = image.copy() # cv2.addWeighted(overlay, alpha, output, 1 - alpha, 0, output) # return output
如果需要叠加不同透明度的多层线条,可以按透明度分组,相同透明度的线条绘制在同一个overlay上,分组完成后再依次叠加即可。
内容的提问来源于stack exchange,提问作者payam
相关产品推荐
相关产品推荐

