You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何用Python-OpenCV绘制带独立四角的半透明不完整矩形边界框

用Python-OpenCV绘制半透明断角矩形框的实现方法

嘿,我刚好做过类似的需求!那种四个角互不相连的半透明边界框,其实不用纠结Polygon,用OpenCV的基础绘图+图像叠加就能轻松实现,我给你一步步拆解:

核心思路

  1. 确定角点线段坐标:先算出矩形四个角上的短线段端点,每个角只画两条短边(比如左上角的水平向右、垂直向下各一段)
  2. 半透明效果实现: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

火山引擎 最新活动