def __init__(self): super(App, self).__init__() self.setupUi(self) self.label_image_size = (self.label_image.geometry().width(), self.label_image.geometry().height()) self.video = None self.exampleImage = None self.imgScale = None self.get_points_flag = 0 self.countArea = [] self.road_code = None self.time_code = None self.show_label = names #button function self.pushButton_selectArea.clicked.connect(self.select_area) self.pushButton_openVideo.clicked.connect(self.open_video) self.pushButton_openVideo1.clicked.connect(self.open_video1) self.pushButton_start.clicked.connect(self.start_count) self.pushButton_pause.clicked.connect(self.pause) self.label_image.mouseDoubleClickEvent = self.get_points self.pushButton_selectArea.setEnabled(False) self.pushButton_start.setEnabled(False) self.pushButton_pause.setEnabled(False) #some flags self.running_flag = 0 self.pause_flag = 0 self.counter_thread_start_flag = 0 self.device = torch.device( "cuda" if torch.cuda.is_available() else "cpu") data_config = "config/coco.data" weights_path = "weights/yolov3.weights" model_def = "config/yolov3.cfg" data_config = parse_data_config(data_config) self.yolo_class_names = load_classes(data_config["names"]) # Initiate model print("Loading model ...") self.yolo_model = Darknet(model_def).to(self.device) if weights_path.endswith(".weights"): # Load darknet weights self.yolo_model.load_darknet_weights(weights_path) else: # Load checkpoint weights self.yolo_model.load_state_dict(torch.load(weights_path)) # counter Thread self.counterThread = CounterThread(self.yolo_model, self.yolo_class_names, self.device) self.counterThread.sin_counterResult.connect(self.show_image_label) self.counterThread.sin_done.connect(self.done) self.counterThread.sin_counter_results.connect( self.update_counter_results)
def __init__(self): super(App,self).__init__() self.setupUi(self) self.label_image_size = (self.label_image.geometry().width(),self.label_image.geometry().height()) self.label_car_size = (320, 320) self.label_plate_size = (320, 80) self.video = None self.exampleImage = None self.imgScale = None self.get_points_flag = 0 self.countArea = [] self.road_code = None self.time_code = None self.show_label = names #这里用来定义想要显示的标签 #button function 设置按钮功能 self.pushButton_selectArea.clicked.connect(self.select_area) self.pushButton_openVideo.clicked.connect(self.open_video) self.pushButton_start.clicked.connect(self.start_count) self.pushButton_pause.clicked.connect(self.pause) self.label_image.mouseDoubleClickEvent = self.get_points self.pushButton_selectArea.setEnabled(False) self.pushButton_start.setEnabled(False) self.pushButton_pause.setEnabled(False) #some flags 设置一些标志信息 self.running_flag = 0 self.pause_flag = 0 self.counter_thread_start_flag = 0 self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") #这里设置跑的设备 #设置数据配置路径,权重路径。模板定义路径 data_config = "config/coco.yaml" weights_path = "weights/yolov5s.pt" model_def = "config/yolov5s.yaml" # counter Thread 计算车辆数量的线程 self.counterThread = CounterThread() self.counterThread.sin_counterResult.connect(self.show_image_label) self.counterThread.sin_done.connect(self.done) self.counterThread.sin_counter_results.connect(self.update_counter_results) self.counterThread.sin_carResult.connect(self.show_car_label) self.counterThread.sin_plateResult.connect(self.show_plate_label) self.counterThread.sin_platepicResult.connect(self.update_plate_label) self.counterThread.sin_colorResult.connect(self.update_color_label)
class App(QMainWindow,Ui_mainWindow): #用来设置显示的主页面 def __init__(self): super(App,self).__init__() self.setupUi(self) self.label_image_size = (self.label_image.geometry().width(),self.label_image.geometry().height()) self.label_car_size = (320, 320) self.label_plate_size = (320, 80) self.video = None self.exampleImage = None self.imgScale = None self.get_points_flag = 0 self.countArea = [] self.road_code = None self.time_code = None self.show_label = names #这里用来定义想要显示的标签 #button function 设置按钮功能 self.pushButton_selectArea.clicked.connect(self.select_area) self.pushButton_openVideo.clicked.connect(self.open_video) self.pushButton_start.clicked.connect(self.start_count) self.pushButton_pause.clicked.connect(self.pause) self.label_image.mouseDoubleClickEvent = self.get_points self.pushButton_selectArea.setEnabled(False) self.pushButton_start.setEnabled(False) self.pushButton_pause.setEnabled(False) #some flags 设置一些标志信息 self.running_flag = 0 self.pause_flag = 0 self.counter_thread_start_flag = 0 self.device = torch.device("cuda" if torch.cuda.is_available() else "cpu") #这里设置跑的设备 #设置数据配置路径,权重路径。模板定义路径 data_config = "config/coco.yaml" weights_path = "weights/yolov5s.pt" model_def = "config/yolov5s.yaml" # counter Thread 计算车辆数量的线程 self.counterThread = CounterThread() self.counterThread.sin_counterResult.connect(self.show_image_label) self.counterThread.sin_done.connect(self.done) self.counterThread.sin_counter_results.connect(self.update_counter_results) self.counterThread.sin_carResult.connect(self.show_car_label) self.counterThread.sin_plateResult.connect(self.show_plate_label) self.counterThread.sin_platepicResult.connect(self.update_plate_label) self.counterThread.sin_colorResult.connect(self.update_color_label) def open_video(self): openfile_name = QFileDialog.getOpenFileName(self,'打开视频','','Video files(*.avi , *.mp4)') #设置选取视频的类型 self.videoList = [openfile_name[0]] vid = cv2.VideoCapture(self.videoList[0]) #打开视频获取内容 0可以调用摄像头 # self.videoWriter = cv2.VideoWriter(openfile_name[0].split("/")[-1], cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'), 10, (1920, 1080)) while vid.isOpened(): ret, frame = vid.read() if ret: self.exampleImage = frame self.show_image_label(frame) self.imgScale = np.array(frame.shape[:2]) / [self.label_image_size[1], self.label_image_size[0]] vid.release() break #设置按钮 self.pushButton_selectArea.setEnabled(True) self.pushButton_start.setText("开始") self.pushButton_start.setEnabled(False) self.pushButton_pause.setText("暂停") self.pushButton_pause.setEnabled(False) #clear counting results KalmanBoxTracker.count = 0 self.label_sum.setText("0") self.label_sum.repaint() def get_points(self, event): if self.get_points_flag: x = event.x() y = event.y() self.countArea.append([int(x*self.imgScale[1]),int(y*self.imgScale[0])]) exampleImageWithArea = copy.deepcopy(self.exampleImage) for point in self.countArea: exampleImageWithArea[point[1]-10:point[1]+10,point[0]-10:point[0]+10] = (0,255,255) #设置区域颜色 cv2.fillConvexPoly(exampleImageWithArea, np.array(self.countArea), (0,0,255)) self.show_image_label(exampleImageWithArea) print(self.countArea) def select_area(self): #change Area needs update exampleImage if self.counter_thread_start_flag: ret, frame = self.videoCapture.read() if ret: self.exampleImage = frame self.show_image_label(frame) if not self.get_points_flag: self.pushButton_selectArea.setText("提交区域") self.get_points_flag = 1 self.countArea = [] self.pushButton_openVideo.setEnabled(False) self.pushButton_start.setEnabled(False) else: self.pushButton_selectArea.setText("选择区域") self.get_points_flag = 0 exampleImage = copy.deepcopy(self.exampleImage) # painting area for i in range(len(self.countArea)): cv2.line(exampleImage, tuple(self.countArea[i]), tuple(self.countArea[(i + 1) % (len(self.countArea))]), (0, 0, 255), 2) self.show_image_label(exampleImage) #enable start button self.pushButton_openVideo.setEnabled(True) self.pushButton_start.setEnabled(True) def show_image_label(self, img_np): img_np = cv2.cvtColor(img_np,cv2.COLOR_BGR2RGB) img_np = cv2.resize(img_np, self.label_image_size) frame = QImage(img_np, self.label_image_size[0], self.label_image_size[1], QImage.Format_RGB888) #构造好图像 pix = QPixmap.fromImage(frame) self.label_image.setPixmap(pix) #在框框里显示视频 self.label_image.repaint() def show_car_label(self, img_np): img_np = cv2.cvtColor(img_np,cv2.COLOR_BGR2RGB) img_np = cv2.resize(img_np, self.label_car_size) frame = QImage(img_np, self.label_car_size[0], self.label_car_size[1], QImage.Format_RGB888) #构造好图像 pix = QPixmap.fromImage(frame) self.label_car_pic.setPixmap(pix) #在框框里显示视频 self.label_car_pic.repaint() def show_plate_label(self, img_np): img_np = cv2.cvtColor(img_np,cv2.COLOR_BGR2RGB) img_np = cv2.resize(img_np, self.label_plate_size) frame = QImage(img_np, self.label_plate_size[0], self.label_plate_size[1], QImage.Format_RGB888) #构造好图像 pix = QPixmap.fromImage(frame) self.label_plate_pic.setPixmap(pix) #在框框里显示视频 self.label_plate_pic.repaint() def start_count(self): if self.running_flag == 0: #clear count and display KalmanBoxTracker.count = 0 for item in self.show_label: vars(self)[f"label_{item}"].setText('0') # clear result file # with open("results/results.txt", "a") as f: # pass #start self.running_flag = 1 self.pause_flag = 0 self.pushButton_start.setText("停止") self.pushButton_openVideo.setEnabled(False) self.pushButton_selectArea.setEnabled(False) #emit new parameter to counter thread self.counterThread.sin_runningFlag.emit(self.running_flag) self.counterThread.sin_countArea.emit(self.countArea) self.counterThread.sin_videoList.emit(self.videoList) #start counter thread self.counterThread.start() self.pushButton_pause.setEnabled(True) elif self.running_flag == 1: #push pause button #stop system self.running_flag = 0 self.counterThread.sin_runningFlag.emit(self.running_flag) self.pushButton_openVideo.setEnabled(True) self.pushButton_selectArea.setEnabled(False) self.pushButton_pause.setEnabled(False) self.pushButton_start.setText("开始") def done(self,sin): if sin == 1: self.pushButton_openVideo.setEnabled(True) self.pushButton_start.setEnabled(False) self.pushButton_pause.setEnabled(False) self.pushButton_start.setText("开始") def update_plate_label(self,pic_result): self.label_plate.setText(pic_result) def update_color_label(self,color_result): self.label_color.setText(color_result) def update_counter_results(self,counter_results): #右边显示的结果 with open("results/results.txt", "a") as f: for i, result in enumerate(counter_results): label_var = vars(self)[f"label_{result[2]}"] label_var.setText(str(int(label_var.text())+1)) #类型 label_var.repaint() label_sum_var = vars(self)[f"label_sum"] label_sum_var.setText(str(int(label_sum_var.text()) + 1)) #总数 label_sum_var.repaint() f.writelines(str(time.strftime("%Y-%m-%d %H:%M:%S",time.localtime()))+' '+' '.join(map(lambda x: str(x),result))+"\t") #打印结果 f.write(("\n")) # print("************************************************",len(counter_results)) def pause(self): if self.pause_flag == 0: self.pause_flag = 1 self.pushButton_pause.setText("继续") self.pushButton_start.setEnabled(False) else: self.pause_flag = 0 self.pushButton_pause.setText("暂停") self.pushButton_start.setEnabled(True) self.counterThread.sin_pauseFlag.emit(self.pause_flag)
class App(QMainWindow, Ui_mainWindow): def __init__(self): super(App, self).__init__() self.setupUi(self) self.label_image_size = (self.label_image.geometry().width(), self.label_image.geometry().height()) self.video = None self.exampleImage = None self.imgScale = None self.get_points_flag = 0 self.countArea = [] self.road_code = None self.time_code = None self.show_label = names #button function self.pushButton_selectArea.clicked.connect(self.select_area) self.pushButton_openVideo.clicked.connect(self.open_video) self.pushButton_start.clicked.connect(self.start_count) self.pushButton_pause.clicked.connect(self.pause) self.label_image.mouseDoubleClickEvent = self.get_points self.pushButton_selectArea.setEnabled(False) self.pushButton_start.setEnabled(False) self.pushButton_pause.setEnabled(False) #some flags self.running_flag = 0 self.pause_flag = 0 self.counter_thread_start_flag = 0 self.device = torch.device( "cuda" if torch.cuda.is_available() else "cpu") data_config = "config/coco.data" weights_path = "weights/yolov3.weights" model_def = "config/yolov3.cfg" data_config = parse_data_config(data_config) self.yolo_class_names = load_classes(data_config["names"]) # Initiate model print("Loading model ...") self.yolo_model = Darknet(model_def).to(self.device) if weights_path.endswith(".weights"): # Load darknet weights self.yolo_model.load_darknet_weights(weights_path) else: # Load checkpoint weights self.yolo_model.load_state_dict(torch.load(weights_path)) # counter Thread self.counterThread = CounterThread(self.yolo_model, self.yolo_class_names, self.device) self.counterThread.sin_counterResult.connect(self.show_image_label) self.counterThread.sin_done.connect(self.done) self.counterThread.sin_counter_results.connect( self.update_counter_results) def open_video(self): openfile_name = QFileDialog.getOpenFileName( self, 'Open video', '', 'Video files(*.avi , *.mp4)') self.videoList = [openfile_name[0]] # opendir_name = QFileDialog.getExistingDirectory(self, "Open dir", "./") # self.videoList = [os.path.join(opendir_name,item) for item in os.listdir(opendir_name)] # self.videoList = list(filter(lambda x: not os.path.isdir(x) , self.videoList)) # self.videoList.sort() vid = cv2.VideoCapture(self.videoList[0]) # self.videoWriter = cv2.VideoWriter(openfile_name[0].split("/")[-1], cv2.VideoWriter_fourcc('X', 'V', 'I', 'D'), 10, (1920, 1080)) while vid.isOpened(): ret, frame = vid.read() if ret: self.exampleImage = frame self.show_image_label(frame) self.imgScale = np.array(frame.shape[:2]) / [ self.label_image_size[1], self.label_image_size[0] ] vid.release() break self.pushButton_selectArea.setEnabled(True) self.pushButton_start.setText("Start") self.pushButton_start.setEnabled(False) self.pushButton_pause.setText("Pause") self.pushButton_pause.setEnabled(False) #clear counting results KalmanBoxTracker.count = 0 self.label_sum.setText("0") self.label_sum.repaint() def get_points(self, event): if self.get_points_flag: x = event.x() # x는 왼쪽에서 오른쪽으로 값 증가 y = event.y() # y는 위에서 아래로 값 증가 #print("get_points",x) #print("get_points",y) self.countArea.append( [int(x * self.imgScale[1]), int(y * self.imgScale[0])]) exampleImageWithArea = copy.deepcopy(self.exampleImage) for point in self.countArea: exampleImageWithArea[point[1] - 10:point[1] + 10, point[0] - 10:point[0] + 10] = (0, 255, 255) cv2.fillConvexPoly(exampleImageWithArea, np.array(self.countArea), (0, 0, 255)) self.show_image_label(exampleImageWithArea) print(self.countArea) #self.countArea = 박스영역 좌표 def select_area(self): #change Area needs update exampleImage if self.counter_thread_start_flag: ret, frame = self.videoCapture.read() if ret: self.exampleImage = frame self.show_image_label(frame) if not self.get_points_flag: self.pushButton_selectArea.setText("Submit Area") self.get_points_flag = 1 self.countArea = [] self.pushButton_openVideo.setEnabled(False) self.pushButton_start.setEnabled(False) else: self.pushButton_selectArea.setText("Select Area") self.get_points_flag = 0 exampleImage = copy.deepcopy(self.exampleImage) # painting area for i in range(len(self.countArea)): cv2.line( exampleImage, tuple(self.countArea[i]), tuple(self.countArea[(i + 1) % (len(self.countArea))]), (0, 0, 255), 2) self.show_image_label(exampleImage) #enable start button self.pushButton_openVideo.setEnabled(True) self.pushButton_start.setEnabled(True) def show_image_label(self, img_np): img_np = cv2.cvtColor(img_np, cv2.COLOR_BGR2RGB) #cvtColor: img_np 이미지의 색상 스케일 변환 (BRG -> RGB) img_np = cv2.resize(img_np, self.label_image_size) frame = QImage(img_np, self.label_image_size[0], self.label_image_size[1], QImage.Format_RGB888) pix = QPixmap.fromImage(frame) self.label_image.setPixmap(pix) self.label_image.repaint() def start_count(self): if self.running_flag == 0: #clear count and display KalmanBoxTracker.count = 0 for item in self.show_label: vars(self)[f"label_{item}"].setText('0') # clear result file with open("results/results.txt", "w") as f: pass #start self.running_flag = 1 self.pause_flag = 0 self.pushButton_start.setText("Stop") self.pushButton_openVideo.setEnabled(False) self.pushButton_selectArea.setEnabled(False) #emit new parameter to counter thread self.counterThread.sin_runningFlag.emit(self.running_flag) self.counterThread.sin_countArea.emit(self.countArea) self.counterThread.sin_videoList.emit(self.videoList) #start counter thread self.counterThread.start() self.pushButton_pause.setEnabled(True) elif self.running_flag == 1: #push pause button #stop system self.running_flag = 0 self.counterThread.sin_runningFlag.emit(self.running_flag) self.pushButton_openVideo.setEnabled(True) self.pushButton_selectArea.setEnabled(True) self.pushButton_start.setText("Start") def done(self, sin): if sin == 1: self.pushButton_openVideo.setEnabled(True) self.pushButton_start.setEnabled(False) self.pushButton_start.setText("Start") def update_counter_results(self, counter_results): with open("results/results.txt", "a") as f: for i, result in enumerate(counter_results): label_var = vars(self)[f"label_{result[2]}"] label_var.setText(str(int(label_var.text()) + 1)) label_var.repaint() label_sum_var = vars(self)[f"label_sum"] label_sum_var.setText(str(int(label_sum_var.text()) + 1)) label_sum_var.repaint() f.writelines(' '.join(map(lambda x: str(x), result))) f.write(("\n")) print("**************STOP*******************", len(counter_results)) print("BOX coordinates:", self.countArea) print(type(self.countArea)) ############################################################ ############################################################ ############################################################ ############################################################ def pause(self): if self.pause_flag == 0: self.pause_flag = 1 self.pushButton_pause.setText("Continue") self.pushButton_start.setEnabled(False) else: self.pause_flag = 0 self.pushButton_pause.setText("Pause") self.pushButton_start.setEnabled(True) self.counterThread.sin_pauseFlag.emit(self.pause_flag)