You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 定义创建按钮的函数
import cv2
# 定义类
class drawButton:
# 定义类属性
w = 200
h = 60
angerLine = 15 # 角点线段长度
thick = 3 # 角点线段厚度
# 矩形框颜色
colorBG = (255,255,0) # 底色
colorBL = (255,0,255) # 边界
colorBA = (0,255,255) # 角点边线颜色
# 初始化
def __init__(self, classnames:list):
# 分配属性
self.classnames = classnames
self.len = len(classnames)
# 美化角点
def drawAnger(self, img, x, y):
cv2.line(img, (x,y), (x,y+self.angerLine), self.colorBA, self.thick)
cv2.line(img, (x,y), (x+self.angerLine,y), self.colorBA, self.thick)
cv2.line(img, (x+self.w,y), (x+self.w,y+self.angerLine), self.colorBA, self.thick)
cv2.line(img, (x+self.w,y), (x+self.w-self.angerLine,y), self.colorBA, self.thick)
cv2.line(img, (x,y+self.h), (x,y+self.h-self.angerLine), self.colorBA, self.thick)
cv2.line(img, (x,y+self.h), (x+self.angerLine,y+self.h), self.colorBA, self.thick)
cv2.line(img, (x+self.w,y+self.h), (x+self.w,y+self.h-self.angerLine), self.colorBA, self.thick)
cv2.line(img, (x+self.w,y+self.h), (x+self.w-self.angerLine,y+self.h), self.colorBA, self.thick)
# 定义绘图方法
def drawRec_alone(self, img, x, y, name):
# 透明矩形参数设置
alphaReserve = 0.5 # 透明度
BChannel, GChannel, RChannel = self.colorBG # 设置矩形颜色
yMin, yMax = y, y+self.h # 矩形框的y坐标范围
xMin, xMax = x, x+self.w # 矩形框的y坐标范围
# 绘制透明矩形
img[yMin:yMax, xMin:xMax, 0] = img[yMin:yMax, xMin:xMax, 0] * alphaReserve + BChannel * (1 - alphaReserve)
img[yMin:yMax, xMin:xMax, 1] = img[yMin:yMax, xMin:xMax, 1] * alphaReserve + GChannel * (1 - alphaReserve)
img[yMin:yMax, xMin:xMax, 2] = img[yMin:yMax, xMin:xMax, 2] * alphaReserve + RChannel * (1 - alphaReserve)
# 矩形框边界
cv2.rectangle(img, (x,y), (x+self.w, y+self.h), self.colorBL, 2)
# 美化角点
self.drawAnger(img, x, y)
# 显示文本
cv2.putText(img, name, (x+20, y+40), cv2.FONT_HERSHEY_COMPLEX, 1.3, (255,255,255), 3)
# 绘制多个按钮框,保存每个按钮的左上坐标
def drawRec_many(self, img):
self.recList = [] # 存放每个矩形框的左上角坐标
# 每个分类绘制一个矩形框
for i in range(self.len):
# 分类名
name = self.classnames[i]
# 每个矩形框的左上角坐标
recx = 10
recy = 100*i+50
# 保存在列表中
self.recList.append([[recx, recy], # 左上角
[recx+self.w, recy], # 右上角
[recx+self.w, recy+self.h], # 右下角
[recx, recy+self.h] # 左下角
])
# 每一个分类画一个矩形框
# 10代表x位置y=110*i+50矩形框之间纵向间隔50
self.drawRec_alone(img, recx, recy, name)
# filepath = 'C:\\GameDownload\\Deep Learning\\kings.jpg'
# img = cv2.imread(filepath)
# img = cv2.resize(img, (1280,720))
# draw = drawButton(['person', 'bus', 'car', 'mot', 'tree'])
# draw.drawRec_many(img)
# print(draw.recList)
# cv2.imshow('img', img)
# cv2.waitKey(0)
# cv2.destroyAllWindows()