@@ -45,8 +45,20 @@ def draw_rectangle(img, rect, color, thickness = 2):
4545 return img
4646
4747
48- def draw_filled_rectangle (img , rect , color ):
49- return draw_rectangle (img , rect , color , - 1 )
48+ # def draw_filled_rectangle(img, rect, color):
49+ # return draw_rectangle(img, rect, color, -1)
50+
51+
52+ def draw_filled_rectangle (img , rect , color , opacity = 1 ):
53+ x , y , w , h = np .round (rect ).astype (np .int32 )
54+ pt1 , pt2 = (x , y ), (x + w , y + h )
55+ if opacity == 1 :
56+ cv2 .rectangle (img , pt1 , pt2 , color , - 1 )
57+ else :
58+ img_copy = img .copy ()
59+ cv2 .rectangle (img_copy , pt1 , pt2 , color , - 1 )
60+ cv2 .addWeighted (img_copy , opacity , img , 1 - opacity , 0 , img )
61+ return img
5062
5163
5264def draw_polygon (img , polygon , color , thickness = 2 ):
@@ -55,12 +67,39 @@ def draw_polygon(img, polygon, color, thickness = 2):
5567 return img
5668
5769
70+ # def draw_filled_polygon(img, polygon, color, opacity = 1):
71+ # points = np.round(polygon).astype(np.int32)
72+ # cv2.fillPoly(img, [points], color)
73+ # return img
74+
75+
5876def draw_filled_polygon (img , polygon , color , opacity = 1 ):
5977 points = np .round (polygon ).astype (np .int32 )
60- cv2 .fillPoly (img , [points ], color )
78+ if opacity == 1 :
79+ cv2 .fillPoly (img , [points ], color )
80+ else :
81+ img_copy = img .copy ()
82+ cv2 .fillPoly (img_copy , [points ], color )
83+ cv2 .addWeighted (img_copy , opacity , img , 1 - opacity , 0 , img )
6184 return img
6285
6386
87+ # def draw_blurred_mask(img, mask):
88+ # w_k = int(0.1 * max(img.shape[:2]))
89+ # w_k = w_k + 1 if w_k % 2 == 0 else w_k
90+ # blurred_img = cv2.GaussianBlur(img, (w_k, w_k), 0)
91+ # mask = cv2.cvtColor(mask, cv2.COLOR_GRAY2BGR)
92+ # img = np.where(mask==0, img, blurred_img)
93+ # return img
94+
95+
96+ # def draw_blurred_polygon(img, polygon):
97+ # points = np.round(polygon).astype(np.int32)
98+ # mask = np.zeros(img.shape, dtype=np.uint8)
99+ # mask = cv2.fillPoly(mask, [points], 255)
100+ # return draw_blurred_mask(img, mask)
101+
102+
64103def draw_blurred_mask (img , mask ):
65104 w_k = int (0.1 * max (img .shape [:2 ]))
66105 w_k = w_k + 1 if w_k % 2 == 0 else w_k
@@ -82,16 +121,24 @@ def draw_overlay_mask(img, mask, color = (255, 0, 0), opacity = 1):
82121 return img_copy
83122
84123
124+ def calculate_contrast_text_color (background_color ):
125+ r , g , b = background_color
126+ brightness = (r * 299 + g * 587 + b * 114 ) / 1000
127+ return (0 , 0 , 0 ) if brightness > 150 else (255 , 255 , 255 )
128+
129+
85130def draw_text (img , text , point , background_color = None , text_color = (255 , 255 , 255 ),
86131 text_scale = 0.8 , padding = 6 ):
87- text_font , text_thickness = cv2 .FONT_HERSHEY_DUPLEX , 1
88- w , h = cv2 .getTextSize (text , text_font , text_scale , text_thickness )[0 ]
89- width , height = w + 2 * padding , h + 2 * padding
90- x , y = point [0 ], max (point [1 ] - height , 0 )
91- org = (x + padding , y + padding + h )
92- if background_color is not None :
93- img = draw_filled_rectangle (img , [x , y , width , height ], background_color )
94- cv2 .putText (img , text , org , text_font , text_scale , text_color , text_thickness , cv2 .LINE_AA )
132+ if text :
133+ text_font , text_thickness = cv2 .FONT_HERSHEY_DUPLEX , 1
134+ w , h = cv2 .getTextSize (text , text_font , text_scale , text_thickness )[0 ]
135+ width , height = w + 2 * padding , h + 2 * padding
136+ x , y = point [0 ], max (point [1 ] - height , 0 )
137+ org = (x + padding , y + padding + h )
138+ if background_color is not None :
139+ img = draw_filled_rectangle (img , [x , y , width , height ], background_color )
140+ text_color = calculate_contrast_text_color (background_color )
141+ cv2 .putText (img , text , org , text_font , text_scale , text_color , text_thickness , cv2 .LINE_AA )
95142 return img
96143
97144
@@ -147,10 +194,11 @@ def render_counter(img, line, text='', color=(0, 0, 255)):
147194 return img
148195
149196
150- def render_region (img , region , text = '' , color = (0 , 0 , 0 )):
197+ def render_region (img , region , text = '' , color = (255 , 0 , 0 )):
151198 point = np .min (region , axis = 0 ).astype (np .int32 )
152199 thickness = calculate_optimal_thickness (img .shape [:2 ])
153200 text_scale = calculate_optimal_text_scale (img .shape [:2 ])
154201 draw_polygon (img , region , color = color , thickness = thickness )
202+ draw_filled_polygon (img , region , color = color , opacity = 0.2 )
155203 draw_text (img , text , point , background_color = color , text_scale = text_scale )
156204 return img
0 commit comments