본문 바로가기

Python20

Python - PyQt + OpenCV로 동영상 파일 재생하기 원래의 목표는 OpenCV를 활용해서 동영상 재생을 하면서 장면을 인식하는 프로그램을 만들어보고 싶었다. 그런데... 올해 회사 업무가 너무나도 정신없이 진행되면서 지난 6개월간 겨우 진행한 게 동영상 재생하기 뿐이었다ㅠ 아무래도 올해는 이정도에서 마무리하고 내년을 기약해봐야 하려나;;; 바로 전 포스팅... 이라지만 벌써 6개월 전에 진행했던;;; PyQT5를 사용해서 PC캠의 영상을 출력하는 어플을 만들었었다. 그리고 이번엔 PC캠 영상이 아니라 동영상 파일을 재생하는 어플을 만들어봤다.. PC캠 영상을 재생하던 코드에서 변경되는 주요한 내용은 세 가지다. 기존 포스팅에서 PC캠의 영상을 출력하는 부분을 동영상 파일을 출력하도록 해준다. Player영역에 영상이 모두 표시되도록 resize 해서 출력.. 2021. 10. 18.
Python - Scene Detector 만들기 첫단계 OpenCV 설치하기 OpenCV를 활용해서 동영상의 장면 전환을 Detect 하는 프로그램을 만들어보기로 했다. 기존에 사용해서 UI를 만들었던 PyQt5를 이번에도 사용해서 UI를 만들고, OpenCV를 활용해서 동영상을 재생하면서 장면이 전환되는 곳을 찾아내는 윈도우용 프로그램을 만들어보기로 했다. 이번에 담당하게 된 업무가 미디어와 관련된 업무이다 보니, 자연스럽게 관심이 생겨 시작했는데 끝까지 잘 마무리할 수 있을지... 그래도 열심히 해봐야겠다. Pycharm Python OpenCV Import Error 공부를 시작하면서 인터넷에 좋은 샘플 소스가 있어 돌려보려 했는데 역시나... Pycharm에서 cv2 모듈이 없다는 에러가 발생한다. OpenCV 설치 pip install opencv-python OpenC.. 2021. 4. 17.
Python chardet 모듈 활용 웹사이트, 문장단위 텍스트 인코딩 타입 확인하기 파이선으로 텍스트 관련 처리를 하다 보면 하나의 파일 안에서도 문장마다 다양한 형태로 인코딩 된 경우를 볼 수 있다. 메모장에서도 한글이 포함돼 있지 않다면 해당 문장은 ascii로, 한글이 포함되면 utf-8로 저장되는 것 같다. 혹은 텍스트 포맷을 일괄 변환해주는 툴들을 활용하면 그런 것 같기도 하다.(추측) 텍스트 분할기를 만들다 보니 일반적으로 메모장으로 생성했다면 나오기 힘든 인코딩 타입들을 접하게 된다. 어떻게 생성된 파일인지는 알 수 없지만 문장별로 인코딩이 다른 경우가 많았다. 따라서, 문서 내 정말 특이한 형태의 인코딩이 있는 경우는 가급적 본 작업을 하기 전에 예외처리를 하거나 알람을 줘야 했다. Python chardet모듈 detect 함수 활용 문장 인코딩 정보 확인 Python .. 2021. 3. 15.
Python UTF-8 파일 처리 중 BOM 출력 오류 해결 텍스트 분할기를 만들다 보니 역시 텍스트 관련 프로그램에서 늘 접하게 되는 인코딩 오류를 접하게 됐다. 그래서 사실 프로그램에서 파일을 열면 첫 100줄정도를 읽어서 텍스트 첫부분이라도 어떤 형태로 인코딩 된 건지를 알아보도록 기능을 넣기는 했다. UTF-8 BOM 출력 오류 텍스트를 분할하기 위해 원본 파일을 읽어 왔다. 흔히들 많이 쓰이는 코드를 사용했다. with open(filename, mode="r", encoding="utf-8") as file: return file.readlines() 그런데 readlines()로 가져온 결과물들을 처리하는 부분에서 exception 이 발생했었다. UnicodeEncodeError: 'ascii' codec can't encode character u.. 2021. 2. 22.
특정 문자열을 찾아 텍스트 분할하는 어플 - Blice Text Splitter 최근 혼자 하고 있는 Python으로 윈도우 어플 만들기의 시작은 사실 업무와 관련이 있었다. 작년까지 내가 담당하던 업무는 웹소설 콘텐츠를 유통하고 관리하는 플랫폼 PM업무였고, 당시 필요했던 기능중에 하나가 바로 확보한 콘텐츠(Text파일)에서 특정 문자열을 찾아 분할하는 기능이 필요했다. 서버의 기능으로 제공해주면 더욱 좋겠지만 또 아주 일반적으로 널리 쓰이는 기능은 아니다 보니 그냥 어플 형태로 직접 한번 만들어보기로 결심하고 시작하게 됐다. 그리고 UI가 멋스럽진 않지만, 기능에만 충실한... 간단한 어플이 완성되어 정리해본다. 그간 나름 스터디했던 Python으로 윈도우 어플 만들기 관련 각종 필요기술들을 활용해서 특정 문자열을 찾아 각각의 텍스트 파일로 분리해서 저장시켜주는 어플 블라이스 회.. 2021. 2. 15.
Pycharm에서 Github에 Repository생성, 소스 업로드하기 Pycharm에서 작성 중인 소스를 바로 Github에 업로드해보기로 했다. Github Desktop 으로 해도 되지만, 결국 두 번 일을 하는것다보니 Pycharm에서 바로 해보려고 한다. Repository 생성 메뉴의 VCS > VCS Operations Popup 선택 후 Create Git Repository 를 선택하거나 혹은 Import into Version Control > Create Git Repository를 선택하면 Repository를 생성할 수 있다. 생성할 Repository 대상 폴더를 선택하고, Commit 을 해준다. 소스 업로드 Github Desktop에서는 Commit을 하고나서 Push를 해줘야 소스가 업로드된다. 다만 그러려면 미리 Repository가 생성되.. 2021. 2. 10.
Python 특정 문자열을 찾아 텍스트 분할하는 코드 혼자서 진행하고 있는 Python으로 윈도우 어플 만들기의 하나의 기능은 하나의 텍스트 파일안에서 특정한 문자열을 찾고 문자열과 문자열 사이를 파싱해서 개별 파일로 분할 저장해주는 기능이다. 예를 들어, 하나의 텍스트 파일이 아래와 같다면 1, 2, 3이 본문내용인 3개의 파일이 생성되도록 하는 기능이다. 특정 문자열을 만날때까지 텍스트를 분할하기 나도 어디서 찾았는지 모르겠지만 참고용 코드를 찾아서 활용한 거라 다 공개함. split_file() 분할하고자 하는 파일경로와, 구분자, 파일을 쪼갤 때 붙일 숫자를 지정해서 split_file 함수를 호출하면 구분자를 만날때까지 버퍼링을 해두고, 다음 구분자를 만나면 그동안 버퍼링 된 문자열을 저장하기 위해 write_split_file 함수를 호출한다. .. 2021. 2. 4.
Python PyQt로 윈도우 어플 만들기 - Thread 정보 UI에 업데이트하기 대부분의 GUI 프로그램들이 그렇듯이 UI 에서는 사용자 액션을 처리하고, 실제 기능수행은 엔진 영역에 별도로 처리하도록 개발해야 한다. 그래야 어플이 Freezing 되는 걸 막을 수 있다.(일명 어플리케이션 일시 멈춤) 또, 잘못된 조작 혹은 어플이 동작중인 상태에서 중간에 중단시키는 동작들도 가능해진다. 이를 위해서 일반적으로 사용되는 방법이 엔진영역(Worker Thread)와 과 UI영역(Window)를 분리하는 방법이다. 이번에 만들고 있는 어플도 사용자 액션과 상태 표시등은 UI에 하고, 액션에 따른 실제 기능 동작 수행은 Thread로 구현했다. 그리고 Thread에서 중간중간 수행하는 과정 등을 Window에 표시하거나, 기능 동작에 따른 버튼 상태 등을 변경하려 한다. PyQt UI코드.. 2021. 1. 27.
Python 코딩량 줄여주는 PyQt QT Designer 사용팁 요 몇 년간 너무 스스로에 대한 발전에는 소홀히 하고, 자꾸 기존의 것들이 잊혀져가는 느낌이라 시작했던 나만의 프로젝트. 요즘 대세라는 Python으로 윈도우 어플 만들기의 끝이 어느정도 보인다. 그리고 Python으로 윈도우 어플을 만들기 위한 다양한 방법들 중 선택한 PyQt 어플을 만들려면 UI코드가 워낙에 많으니 자동화해주는 툴도 잘 써야 손이 편하다ㅎㅎ 처음에는 QT Designer를 실행시켜서 어플을 위한 버튼이나 라벨 같은 것들을 드래그해서 만들고 줄 맞춤점도 하고 python 코드로 변환하고 했는데... 사용하다 보니 UI는 계속 조금씩 바뀌고, 그때마다 UI코드를 머지하거나, 코드를 수정해야 하는 일이 많아지게 된다. 하지만 QT Desiagner에서 이런저런 세팅을 미리 해 두면 이런 .. 2021. 1. 25.