Ejemplo n.º 1
0
    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)
Ejemplo n.º 2
0
    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)
Ejemplo n.º 3
0
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)