Capstone/Caostone2 - 2020-1학기

[7] GUI 구현 - code

흐성진 2020. 6. 25. 18:00
반응형

이번에는 프로젝트에 이전에 구성했던 ui 파일을 기반으로 파이썬 코드를 작성하는 방법에대해 알아보겠다.

하나씩 기능을 설명한후 코드의 전체 부분은 밑에 첨부하도록 하겠다.

 

다음과 같이 필요한 라이브러리를 import 해준다

import os
import sys
import time
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from PyQt5 import uic
import cv2
from PyQt5.QtCore import QCoreApplication, QThread

 

밑의 코드와 같이 ui파일의 경로, 이름을 넣어주어야 한다.

저희 팀과 같은 경우는 같은 위치에서 진행하였으므로 이름만 넣어주었다.

form_class = uic.loadUiType("gui.ui")[0]

 

gps 데이터 위치와 동영상을 프레임 단위로 자른 위치를 설정해주고

btn_1, .... ,btn_5 까지의 이름을 설정해준다.

    def __init__(self):
    
        super().__init__()
        self.setupUi(self)
        
        self.work = Worker()
        
        self.gpspath = "/Users/pel-macmini2/gps/"
        self.slicepath = "/Users/pel-macmini2/slice/"
        
        self.btn_1.clicked.connect(self.btn_videoslice)
        self.btn_2.clicked.connect(self.btn_yolo)
        self.btn_3.clicked.connect(self.btn_potholemap)
        self.btn_5.clicked.connect(self.btn_clear)
        self.btn_4.clicked.connect(QCoreApplication.instance().quit)

 

 

비디오 슬라이스의 버튼과 같은 경우 이전에 포스팅 했던 opencv를 이용하여 프레임단위로 추출하는 것을 이용하였다.

진행 상황 같은 경우는 터미널 창에 몇번재 이미지가 저장되고 있는지 뜨도록 하였고

textBrowser append를 통해 시작과 끝을 알렸다.

    def btn_videoslice(self):
        self.textBrowser_2.append("Slice Start")
        fname = QFileDialog.getOpenFileName(self)
        print(fname[0])

        vidcap = cv2.VideoCapture(fname[0])
        success,image = vidcap.read()
        
        count = 1
        success = True
        
        while success:
            cv2.imwrite("/Users/pel-macmini2/slice/%d.jpg" % count, image)
            success,image = vidcap.read()
            print("saved image %d.jpg" % count)
            
            count += 1
            
        self.textBrowser_2.append("Slice Finish")
            
        vidcap.release()

https://sj-d.tistory.com/24?category=912070

 

[5] 동영상 프레임 단위로 나누기

동영상을 프레임 단위로 추출하기 위해 opencv를 사용하였다. opencv 설치 방법은 pip을 통하여 설치할수 있다. python -m pip install opencv-python 다음과 같이 파이썬 내에서 입력을 하게되면 자신의 opencv..

sj-d.tistory.com

 

yolo 버튼과 같은 경우는 비디오를 프레임 단위로 잘라진 이미지를 분석하는 버튼이다.

gui는 python3로 진행되는데 yolo.py와 같은경우 python2를 기반으로 실행되기 때문에 모듈화를 진행시키지못하고 os.system 을 이용해서 실행시키도록 하였다.

버튼을 클릭시 textBrowser에 append 해주어 상태를 나타내도록 하였다.

    def btn_yolo(self):
        self.textBrowser_2.append("YOLO start!!")
        time.sleep(1)
        os.system('python yolo.py')
        QApplication.processEvents()
        self.textBrowser_2.append("YOLO Finish!!")
        self.work.start()

yolo.py의 코드 부분은 이전의 포스팅을 참고하면 된다.

https://sj-d.tistory.com/21?category=912070

 

[2]Yolo v3 python

YOLO를 실행하기 위해 기본적으로 알아야하는 방법들이다. 이전 프로젝트에 설명한 내용들이므로 링크를 첨부하였다. Opencv 설치 YOLO 설치 및 실행 방법 Yolo mark 사용법 구글 이미지 크롤러 이미지

sj-d.tistory.com

 

 

포트홀맵 버튼의 경우 yolo의 분석결과를 이용해 지도위에 마커를 찍어주는 기능을 한다.

forlium을 이용하여 작성하였고 코드의 matching.py의 부분은 밑에 첨부하였다.

    def btn_potholemap(self):
        self.textBrowser_2.append("Mapping start!!")
        time.sleep(1)
        os.system('python3 matching.py')
        self.textBrowser_2.append("Mapping file save!!")

 

matching.py

import folium
import csv
import base64
import cv2

a = open('/Users/pel-macmini2/detection_result.txt','r')

m = folium.Map(location=[36.826157 , 127.187362], zoom_start=16)

line = a.readlines()

count = 0

gpslist = []


for i in line :
    split = line[count].split('.')

    b = open('/Users/pel-macmini2/gps/' + split[0] + '.csv', 'r', encoding='utf-8')
    
    bb = csv.reader(b)

    for gps in bb :
        gpslist.append(gps)

    b.close()

    img = cv2.imread('/Users/pel-macmini2/slice/'+ split[0] + '.jpg')
    remap = cv2.resize(img,(300, 300))
    cv2.imwrite('/Users/pel-macmini2/slice/'+ split[0] + '.jpg',remap)
    
    count += 1
    mapgps = ''.join(str(e) for e in gpslist)

    pic = base64.b64encode(open('/Users/pel-macmini2/slice/'+ split[0] + '.jpg' ,'rb').read()).decode()
    image_tag = '<img src="data:image/jpeg;base64,{}">'.format(pic)
    iframe = folium.IFrame(image_tag, width=352, height=288)
    popup = folium.Popup(iframe, max_width=300)
    folium.Marker([mapgps[2:11], mapgps[15:-2]], popup = popup).add_to(m)

    gpslist.clear()

m.save('file.html')

 

클리어 버튼의 경우에는 이전에 받아온 데이터를 삭제해 주는 기능을 한다.

    def btn_clear(self) :
        self.textBrowser_2.append("Data Clear Start")
        if os.path.isdir(self.gpspath):
            filelist1 = os.listdir(self.gpspath)
            for file in filelist1:
                os.remove(self.gpspath + file)
        else:
            self.textBrowser_2.append("GPS Folder not exist!")
        
        if os.path.isdir(self.slicepath):
            filelist2 = os.listdir(self.slicepath)
            for file in filelist2:
                os.remove(self.slicepath + file)
        else:
            self.textBrowser_2.append("Slice Folder not exist!")
        self.textBrowser_2.append("GPS and Slice Data clear")

 

 

gui 코드의 전체는 다음과 같다.

import os
import sys
import time
from PyQt5.QtWidgets import *
from PyQt5 import QtCore
from PyQt5 import uic
import threading
import cv2
from PyQt5.QtCore import QCoreApplication, QThread

form_class = uic.loadUiType("gui.ui")[0]

class Worker(QThread):
    def run(self):
        os.system('python yolo.py')
        
class WindowClass(QMainWindow, form_class) :
    def __init__(self):
    
        super().__init__()
        self.setupUi(self)
        
        self.work = Worker()
        
        self.gpspath = "/Users/pel-macmini2/gps/"
        self.slicepath = "/Users/pel-macmini2/slice/"
        
        self.btn_1.clicked.connect(self.btn_videoslice)
        self.btn_2.clicked.connect(self.btn_yolo)
        self.btn_3.clicked.connect(self.btn_potholemap)
        self.btn_5.clicked.connect(self.btn_clear)
        self.btn_4.clicked.connect(QCoreApplication.instance().quit)

    def btn_videoslice(self):
        self.textBrowser_2.append("Slice Start")
        fname = QFileDialog.getOpenFileName(self)
        print(fname[0])

        vidcap = cv2.VideoCapture(fname[0])
        success,image = vidcap.read()
        
        count = 1
        success = True
        
        while success:
            cv2.imwrite("/Users/pel-macmini2/slice/%d.jpg" % count, image)
            success,image = vidcap.read()
            print("saved image %d.jpg" % count)
            
            count += 1
            
        self.textBrowser_2.append("Slice Finish")
            
        vidcap.release()
        
        
    def btn_yolo(self):
        self.textBrowser_2.append("YOLO start!!")
        time.sleep(1)
        os.system('python yolo.py')
        QApplication.processEvents()
        self.textBrowser_2.append("YOLO Finish!!")
        self.work.start()
    
    def btn_potholemap(self):
        self.textBrowser_2.append("Mapping start!!")
        time.sleep(1)
        os.system('python3 matching.py')
        self.textBrowser_2.append("Mapping file save!!")
        
        
    def btn_clear(self) :
        self.textBrowser_2.append("Data Clear Start")
        if os.path.isdir(self.gpspath):
            filelist1 = os.listdir(self.gpspath)
            for file in filelist1:
                os.remove(self.gpspath + file)
        else:
            self.textBrowser_2.append("GPS Folder not exist!")
        
        if os.path.isdir(self.slicepath):
            filelist2 = os.listdir(self.slicepath)
            for file in filelist2:
                os.remove(self.slicepath + file)
        else:
            self.textBrowser_2.append("Slice Folder not exist!")
        self.textBrowser_2.append("GPS and Slice Data clear")
        
if __name__ == "__main__" :
    app = QApplication(sys.argv)
    myWindow = WindowClass()
    myWindow.show()
    app.exec_()

 

기능들일 실행한 UI는 다음과 같이 append를 통해 메세지가 출력된다.

 

참고

https://wikidocs.net/35477

 

위키독스

온라인 책을 제작 공유하는 플랫폼 서비스

wikidocs.net

 

반응형