如何用Python-OpenCV绘制带独立四角的半透明不完整矩形边界框
用Python-OpenCV绘制半透明断角矩形框的实现方法
嘿,我刚好做过类似的需求!那种四个角互不相连的半透明边界框,其实不用纠结Polygon,用OpenCV的基础绘图+图像叠加就能轻松实现,我给你一步步拆解:
核心思路
- 确定角点线段坐标:先算出矩形四个角上的短线段端点,每个角只画两条短边(比如左上角的水平向右、垂直向下各一段)
- 半透明效果实现:OpenCV直接绘制的线条是不透明的,所以我们需要先在临时画布上画出不透明的角线,再通过
addWeighted函数将临时画布与原图叠加,实现半透明效果
完整代码示例
import cv2 import numpy as np def draw_corner_box(img, top_left, bottom_right, corner_len=20, color=(0, 255, 0), thickness=2, alpha=0.5): """ 绘制半透明断角矩形框 参数说明: img: 输入图像(numpy数组) top_left: 矩形左上角坐标,格式为(x1, y1) bottom_right: 矩形右下角坐标,格式为(x2, y2) corner_len: 每个角的线段长度,默认20像素 color: 框的颜色,OpenCV默认是BGR格式,比如(0,255,0)是绿色 thickness: 线条厚度,默认2像素 alpha: 透明度,0-1之间,0完全透明,1完全不透明 """ x1, y1 = top_left x2, y2 = bottom_right # 创建与原图相同的临时画布 overlay = img.copy() # 绘制四个角的线段 # 左上角 cv2.line(overlay, (x1, y1), (x1 + corner_len, y1), color, thickness) cv2.line(overlay, (x1, y1), (x1, y1 + corner_len), color, thickness) # 右上角 cv2.line(overlay, (x2 - corner_len, y1), (x2, y1), color, thickness) cv2.line(overlay, (x2, y1), (x2, y1 + corner_len), color, thickness) # 左下角 cv2.line(overlay, (x1, y2 - corner_len), (x1, y2), color, thickness) cv2.line(overlay, (x1, y2), (x1 + corner_len, y2), color, thickness) # 右下角 cv2.line(overlay, (x2 - corner_len, y2), (x2, y2), color, thickness) cv2.line(overlay, (x2, y2 - corner_len), (x2, y2), color, thickness) # 叠加临时画布与原图,实现半透明 cv2.addWeighted(overlay, alpha, img, 1 - alpha, 0, img) return img # 测试示例 if __name__ == "__main__": # 加载图像(替换成你的图像路径) img = cv2.imread("your_image.jpg") # 定义矩形的左上角和右下角坐标 top_left = (50, 50) bottom_right = (200, 200) # 绘制断角框 result_img = draw_corner_box(img, top_left, bottom_right, corner_len=30, color=(0, 0, 255), thickness=3, alpha=0.6) # 显示结果 cv2.imshow("Corner Box", result_img) cv2.waitKey(0) cv2.destroyAllWindows() # 保存结果 cv2.imwrite("result_with_corner_box.jpg", result_img)
关键细节解释
- 断角线段的计算:每个角只保留两条短边,避免了四个边相连,完全符合你要的“四个角互不相连”的效果,你可以通过调整
corner_len参数控制角线的长度 - 半透明的实现:
cv2.addWeighted是OpenCV实现图像混合的核心函数,通过调整alpha参数可以灵活控制框的透明度,数值越小越透明 - 颜色格式:注意OpenCV默认使用BGR颜色空间,如果你习惯RGB的话,可以先用
cv2.cvtColor转换后再处理
内容的提问来源于stack exchange,提问作者Majid Azimi




