|  |  |  | @ -0,0 +1,107 @@ | 
			
		
	
		
			
				
					|  |  |  |  | # 定义创建按钮的函数 | 
			
		
	
		
			
				
					|  |  |  |  | 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() |