[7] GUI 구현 - code

2020. 6. 25. 18:00· Capstone/Caostone2 - 2020-1학기
반응형

이번에는 프로젝트에 이전에 구성했던 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

 

반응형
저작자표시 (새창열림)

'Capstone > Caostone2 - 2020-1학기' 카테고리의 다른 글

[9] 도로 결함 탐지 최종 결과물  (0) 2020.06.30
[8] scp(ssh) 비밀번호 없이 하기  (0) 2020.06.30
[6] GUI 구현 - 설치, UI  (0) 2020.06.25
[5] 동영상 프레임 단위로 나누기  (3) 2020.06.25
[4] 라즈베리파이 GPS 모듈  (4) 2020.06.20
'Capstone/Caostone2 - 2020-1학기' 카테고리의 다른 글
  • [9] 도로 결함 탐지 최종 결과물
  • [8] scp(ssh) 비밀번호 없이 하기
  • [6] GUI 구현 - 설치, UI
  • [5] 동영상 프레임 단위로 나누기
흐성진
흐성진
개발자 흐성진의 블로그 입니다.
반응형
흐성진
망각의 코딩러 흐성진
흐성진
전체
오늘
어제
  • 분류 전체보기 (57)
    • 📱Flutter (17)
    • 🌐 Web (1)
      • ⚛️ React (0)
      • 🇯🇸‌JavaScript (1)
    • 💡CS (2)
    • iOS (8)
    • Capstone (22)
      • Capstone1 - 2019-2학기 (13)
      • Caostone2 - 2020-1학기 (9)
    • Linux, Mac (4)
    • Me (3)

인기 글

최근 글

hELLO · Designed By 정상우.v4.2.1
흐성진
[7] GUI 구현 - code
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.