딥러닝 데이터를 늘리기 위한 이미지 제너레이터 만들기

4) 이미지 제너레이터 만들기 - 파일 여러개 여는 기능 추가

잡동사니123 2023. 2. 27. 19:00

필요한 클래스 변수 추가

  • __init__ 함수에 필요한 변수를 넣는다(이전에 이미 넣었던 변수 생략)
self.folder = None  # 폴더의 경로 저장하는 변수

 

필요한 클래스 함수 추가 및 이벤트 함수와 연동하기

  • 기능을 구현할 클래스 함수를 추가한다. WindowClass 안에 함수를 넣는다.
def dirOpen(self):
    # 여기에 폴더 열어서 파일 여러개 여는 기능 구현할 예정

 

  • 이벤트를 구현하기 위한 코드이다. __init__ 함수안에 넣어준다.
self.directoryOpen_action.triggered.connect(self.dirOpen)  # 경로 열기 클릭 이벤트

 

dirOpen 함수 기능인 파일 열기 기능 구현

  • getExistingDirectory : 폴더 선택 화면을 열리게 해준다. 위 함수를 이용해 폴더의 경로명을 저장한다.
self.folder = QFileDialog.getExistingDirectory(self)

위 코드 실행시 뜨는 창

 

 

  • bool(self.folder) : 폴더를 열었는지 안열었는지 확인하는코드
  • 만약 열지 않고 취소하거나 나갔다면 빈 문자열로 구성된 튜플이 리턴됨
  • 폴더를 안열었는데 만들기나 미리보기를 제공하면 안되기 때문에 if문으로 검사할 필요 있음
if bool(self.folder):
    # 만약 폴더를 선택한다면 이전 결과물 초기화
    self.files_root = []

 

  • 이전 결과물과 섞이지 않기 위해 self.files_root 초기화 하기
  • os.walk를 이용해 폴더안 파일들 탐색 (root : 파일 경로, files : 파일들 이름 모은 리스트)
  • os.path.join : 경로를 병합시켜준다, 이미지를 1개씩 열어야하기 때문에 폴더와 파일이름을 합쳐야함
  • if문 : 이미지 확장자인것들만 file_root에 append 시킴, os.path.splitext는 (파일경로(확장자제외버전), 확장자)형식의 튜플을 만들어준다
if bool(self.folder):
    # 만약 폴더를 선택한다면 이전 결과물 초기화
    self.files_root = []
    
    # 파일들을 다 저장하되 이미지 파일만 저장
    for (root, directories, files) in os.walk(self.folder):
        for file in files:
            file_path = os.path.join(root, file)  # file_path 변수에 파일 경로 1개 불러옴
            # 이미지 확장자에 포함되는경우(이미지파일만 걸러냄)
            if os.path.splitext(file_path)[1] == '.jpg' or os.path.splitext(file_path)[1] == '.png' or \
                    os.path.splitext(file_path)[1] == '.bmp':
                self.files_root.append(file_path)  # files_root에 이미지 경로 1개 추가

 

  • if self.files_root : if문에 리스트 이름 그대로 넣으면 빈 리스트인지 검사 가능
  • 값이 있으면 True 비어있으면 False가 된다
  • 파일을 다 검사했어도 이미지가 없다면 빈 리스트가 될수도 있기 때문에 검사 필요
  • 과정이 다 끝난 뒤, setEnable로 버튼 활성화하기
if bool(self.folder):
    # ...코드 생략...
    if self.files_root:
        # 이제 미리보기와 이미지 만들고 저장하는 기능 이용하도록 버튼 활성화
        self.preview_button.setEnabled(True)
        self.generateAndSave_button.setEnabled(True)