|
|
|
|
# 定义创建按钮的函数
|
|
|
|
|
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()
|