import os, cv2, copy, threading import numpy as np import tkinter as tk from PIL import Image,ImageDraw,ImageFont import configs from PyQt5 import QtWidgets,QtCore from PyQt5.QtWebEngineWidgets import QWebEngineView def putext(img_bgr,text,loc,fontpath="fonts/gulim.ttc",color_bgr=(255,255,255),size=20): b,g,r=color_bgr; a=0 font = ImageFont.truetype(fontpath, size) img_pil = Image.fromarray(img_bgr) draw = ImageDraw.Draw(img_pil) x,y=loc; y=int(y)-size; loc=(x,y) draw.text(loc, text, font=font, fill=(b,g,r,a)) img_bgr = np.array(img_pil) return img_bgr def imread(path): img_array = np.fromfile(path, np.uint8) img_bgr = cv2.imdecode(img_array, cv2.IMREAD_COLOR) return img_bgr def imwrite(img_bgr,img_path): extension = os.path.splitext(img_path)[1] # 이미지 확장자 result, encoded_img = cv2.imencode(extension, img_bgr) with open(img_path, mode='w+b') as f: encoded_img.tofile(f) def blend_with_mask_matrix(src1, src2, mask): res_channels = [] for c in range(0, src1.shape[2]): a = src1[:, :, c] b = src2[:, :, c] m = mask[:, :, c] res = cv2.add( cv2.multiply(b, cv2.divide(np.full_like(m, 255) - m, 255.0, dtype=cv2.CV_32F), dtype=cv2.CV_32F), cv2.multiply(a, cv2.divide(m, 255.0, dtype=cv2.CV_32F), dtype=cv2.CV_32F), dtype=cv2.CV_8U) res_channels += [res] res = cv2.merge(res_channels) return res def blur_image_with_gradient_box_mask(cv_image, pts, gaussian_core, sigma_x): blurred = cv2.GaussianBlur(cv_image, gaussian_core, sigma_x) gradient_box_not_mask = np.zeros_like(cv_image) cv2.polylines(gradient_box_not_mask, [pts], True, (255, 255, 255)) gradient_box_not_mask = cv2.fillPoly(gradient_box_not_mask, [pts], (255, 255, 255)) cv2.GaussianBlur(gradient_box_not_mask, (101, 101), 111, dst=gradient_box_not_mask) gradient_box_not_mask =np.ones_like(gradient_box_not_mask.shape,dtype=gradient_box_not_mask.dtype) * 255 - gradient_box_not_mask; blured_img= blend_with_mask_matrix(cv_image, blurred, gradient_box_not_mask) return blured_img def make_gradient_blur(img_bgr, boxes,scale=2.5) : blurred_img=copy.copy(img_bgr) for b in boxes : # scaling points x1,y1,x2,y2=b points=[[x1,y1],[x2,y1],[x2,y2],[x1,y2]] pts=np.array(points) cx,cy=pts.mean(axis=0) pts=(pts-(cx,cy))*scale+(cx,cy) points=list(pts) pts = np.array([points], np.int32) pts = pts.reshape((-1, 1, 2)) blurred_img = blur_image_with_gradient_box_mask(blurred_img, pts, (325,325), 0) return blurred_img def draw_blur_boxes(img_bgr,names,boxes,scale=2): blur_boxs = [b for b,name in zip(boxes,names) if name.find('unknown')>-1] img_bgr=make_gradient_blur(img_bgr,blur_boxs,scale=scale) return img_bgr def draw_boxes(img_bgr,names,boxes): img_bgr=copy.copy(img_bgr) for name,b in zip(names,boxes) : C=(0,0,255) if name.find('unknown')>-1 else (255,255,255) cv2.rectangle(img_bgr,(b[0],b[1]),(b[2],b[3]),C,2) img_bgr=putext(img_bgr, name,(b[0],b[1]),color_bgr=C) return img_bgr class Loading_Message: def __init__(self,title,msg,width=400,height=250): self.wint=None self.t=None self.win = None def window() : self.win=tk.Tk() self.win.geometry(f"{width}x{height}") self.win.title(title) lb=tk.Label(self.win,text=msg,justify='center',bg='#FAFAFA',padx=10) lb.pack(fill="both", expand=True) self.win.mainloop() self.t=threading.Thread(target=window) self.t.start() if self.win is not None: self.win.lift() self.win.attributes("-topmost", True) self.win.update() #self.win.attributes("-topmost", False) self.win.after_idle(win.attributes,'-topmost',False) def quit(self) : self.win.quit() self.win.event_info() self.t.join() def destory(self) : self.win.destroy() self.win.event_info() self.t.join() import time class time_processsor: def __init__(self): self.time =None #self.f =None self._fps = -1 #self.start_times={} self.n = -1 pass def fps(self,f,span=30): self.n+=1 if self.time is None : self.time=time.time() #secs self.n=1 elif self.n>span: self._fps=self.n/(time.time()-self.time) self.time=time.time(); self.n=1 return '{:5.2f}'.format(self._fps) def set_starttimes(self,n): self.start_times[n]=time.time() def get_durations(self,n) : if n not in self.start_times.keys(): return '-1' cur=time.time() duration=cur-self.start_times(n) tm = time.localtime(duration) s = time.strftime('%Y%m%d %I:%M:%S %p', tm) return s def ShowMessage(root,msg="",msg1="",fn='',title=configs.title,width=800): if fn!='': with open(fn,'r',encoding='utf-8') as f: msg=f.read() else : msg=msg.replace("\n","
").replace(" "," ").replace("\t","    "); msg+=msg1 m=QtWidgets.QMessageBox(root) #m.setTextFormat(Qt.RichText) m.setStyleSheet("QLabel{min-width: 800px;min-height: 400px;}"); m.setText(msg); m.setWindowTitle(title) m.show() html_window = None class HtmlWindow(QWebEngineView): def __init__(self,url,title='VSS',width=900,height=800) : super().__init__() self.setWindowTitle(title) self.resize(width,height) r=self.load(QtCore.QUrl(url)) def closeEvent(self,event): global html_window html_window = None def Show_html_page(url,title=configs.title,width=900,height=800): global html_window if html_window is None: html_window = HtmlWindow(url=url,title=title,width=width,height=height) html_window.show() def Show_html_page_b(b_idx): url=f'http://www.artai.co.kr/board/view1?b_idx={b_idx}' Show_html_page(url=url) if __name__ == '__main__': pass