라벨이 Python인 게시물 표시

Google MediaPipe를 활용한 인체관절 각도측정

이미지
개요 안녕하세요. 평소 육체적, 정신적 건강을 위해 자전거 를 즐겨탑니다. 훈련양이 적어 실력이 부족함에도 늘 더 잘타고 싶은 욕망에 좀 더 시간대비 효과적인 훈련방법에 대한 고민이 많습니다. 😓 특히 페달링을 하는 각도 와 안장의 높이에 대해 여러 공부를 하고 있습니다. 그러던 와중에 구글의 MediaPipe 라는 기술을 알게 되었고 취미인 싸이클에 적용하기 위해 앱을 만들어 보았습니다.  꼭 싸이클분야가 아니어도 아래의 내용을 읽은 후 관절 번호를 변경하면 신체의 어느 부위라도 관절 인식 및 각도 측정이 가능 합니다. YouTube 운동영상 녹화후 분석 골격인식 후 팔꿈치, 무릎각도 측정 주요 기능으로 1. 실시간, 또는 저장된 동영상에서 인체 골격 추출 2. 골격의 위치좌표 를 역탄젠트 함수로 각도 측정 3. 어깨, 팔꿈치, 팔목 3 좌표로 팔꿈치(ELBOW) 각도 측정 4. 엉덩관절, 무릎, 발목 3 좌표로 무릎(KNEE) 각도 측정   Google MediaPipe MediaPipe 솔루션은 애플리케이션에 인체특징인식 관련  인공지능 (AI) 및 머신러닝 (ML) 기법을 빠르게 적용할 수 있는 라이브러리와 도구 모음을 제공합니다. Google MediaPipe 소개   아래의 솔루션에서 인체 특징을 감지할 수 있으며 저는 "Pose Landmark" 기술을 활용해 앱을 제작하였습니다.  보통 구글 GCP( G oogle C loud P latform

PyQt6를 이용한 동영상플레이어앱

이미지
개요 안녕하세요. 예전에 PyQt5 기반의 동영상플레이어 를 만든 게시물이 있었습니다. 수업 때 종종 활용해왔던 코드인데, 2024년부터 학원수업에 Qt6 기반의 PyQt6 를 사용하다 보니 PyQt5와 다른 몇가지 변화가 있어 새롭게 동영상 플레이어를 만들어 보았습니다.  PyQt6 Multimedia 변경사항 새롭게 추가된 부분을 보면 레코딩 관련 클래스들이 추가되었습니다. 출처 : Qt Documentation 삭제된 부분은 추가보다 더 많습니다. 존재의 의미를 잘 몰랐던 QMediaContent (QUrl과 다른점이 🤔 )가 삭제되었으며, 잘 사용해오던 QMediaPlaylist 가 삭제되었습니다. 😩 출처 : Qt Documentation 이제 미디어 파일(비디오, 오디오 등)을 리스트로 관리해주던 QMediaPlaylist 클래스가 없어지면서 사용자가 직접 미디어 파일들을 관리 해야 합니다. 본 예제에서는 파이썬의 리스트를 사용해서 처리하였습니다. Qt는 크로스 플랫폼을 지원하기 때문에 그 클래스 내부는 다양한 OS에 대응하기 위해 복잡한 구조로 이루어져 있을 것으로 추측되고 편의적인 목적의 클래스들이 삭제된 것으로 추측됩니다. 좀 더 세부적인 변화는 아래 Qt 링크를 참조하기 바랍니다. Changes to Qt Multimedia 개발환경 Windows 11 Pro, MS Visual Studio 2022  Python 3.11.9 64bit, PyQt6 6.7.0   소스코드 Git Link : Movie

NYPC 문제풀이

이미지
개요 NYPC 는 넥슨에서 개최하는 청소년 프로그래밍 대회입니다. 매년 여름방학 시즌에 진행되어 비교적 학업에 지장을 덜 받고 출전해 볼 수 있습니다. 학원생 중 이 대회를 준비하는 친구들이 많아 문제풀이를 지속적으로 업데이트할 계획입니다. 자세한 대회 세부 요강 및 기출문제는 NYPC 홈페이지 를 참조하기 바랍니다.

파이썬 성능을 극대화하는 테크닉

이미지
개요 파이썬의 성능을 올리는 프로그래밍 팁 은 여러 가지가 있습니다. 여기 몇 가지 유용한 팁과 예시를 소개하겠습니다. 1. 리스트 컴프리헨션 사용 리스트 컴프리헨션 (List Comprehension) 은 for 루프를 사용한 리스트 생성보다 더 빠르고 간결합니다. 소규모 배열보다 대규모 배열 생성시 그 차이를 체감할 수 있습니다. # 일반적인 방법 squares = [] for x in range(10): squares.append(x**2) print(squares) # 리스트 컴프리헨션 사용 squares = [x**2 for x in range(10)] print(squares) 결과는 동일합니다. 참고로 "전문가를 위한 파이썬" 에서 저자인 루시아누 하말류는 List Comprehension을 "지능형 리스트" 라고 표현합니다. 지능형리스트나 리스트 컴프리헨션이나 이름이 중요하진 않지만 용어가 친숙하면 두려움없이 다가가는데 도움이 됩니다. 2. 제너레이터 사용 리스트나 튜플(Tuple) 대신 제너레이터(Generator)를 사용하면 메모리 사용을 줄일 수 있습니다. # 리스트 사용 nums = [x for x in range(1000000)] # 제너레이터 사용 nums = (x for x in range(1000000)) 리스트는 모든 요소를 메모리에 한 번에 저장합니다. 즉 리스트의 크기만큼 메모리가 필요합니다.  이를 위해 필요한 메모리 공간이 충분히 확보되어야 하며, 큰 리스트를 만들 경우 메모리 사용량이 급격히 증가할 수 있습니다. 반면, 제너레이터는 필요할 때마다 요소를 하나씩 생성합니다. 제너레이터는 전체 데이터를 한 번에 메모리에 올리지 않고, 데이터를 필요로 할 때 생성하여 처리하므로 메모리 사용이 매우 적습니다.   3. 내장 함수 사용 파이썬의 내장 함수(Built-in

PyQt5 기반Tetris(테트리스) 게임앱

이미지
개요 이번 주제는 Python + PyQt5 로 만든 테스리스 게임입니다. (키보드 화살표 ←, →, ↑(회전), ↓(빨리하강) 로 조작) 예전에 C++ 로 만들어 올려둔 게시물이 있는데, 구글에서 저작권 위반 신고가 들어와 게시물이 삭제(?)되어 현재는 게시글이 없어진 상태입니다. 제가 직접  짠 코드인데 이유는 정확히 모르지만 같이 넣어둔 게임 효과음이 원인이 아닐까 추측합니다.😓 

QTableWidget Copy & Paste 사용해보기

이미지
개요 최근 QTableWidget Class를 사용하는 중,  Excel 파일 값 복사, QTableWidget에 붙여넣기 QTableWidget의 값 복사 Excel에 붙여넣기 를 할 필요가 생겼습니다. 혹시나 해서, 코드를 따로 작성하지 않고 빈 QTableWidget 을 만들고 엑셀 데이터를 복사( Copy )해 붙여넣기( Paste ) 해보니 역시나 동작하지 않습니다. 세상에 공짜는 없습니다. 😅 아마도 QWidget 에서 Ctrl + C, V 키보드 이벤트 발생을 감지하고, 복사된 클립보드의 내용을 따로 처리해주는 코드가 필요할 것으로 예상됩니다. 간단하게 생각하고 바로 코드를 작성하기 진행하였지만 생각보다 복잡해 그 과정을 정리해 보았습니다.    목표 Copy data from Excel file to QTableWidget   Copy data from QTableWidget to Excel 소스코드 from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QTableWidget, QTableWidgetItem from PyQt5.QtCore import Qt import sys QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) class Window(QWidget): def __init__(self): super().__init__() self.initUi() self.resize(400,600) def initUi(self): self.setWindowTitle('Ocean Coding School') self.tw = QTableWidget() row = 10 col = 3 self.tw.set

엑셀파일에서 데이터 추출 후 분석앱 제작

이미지
개요 오늘은 파이썬으로 엑셀파일을 분석 해 데이터를 통계화 하고 박스차트 로 표현하는 예제를 만들어 보겠습니다. 

좌표들의 Fitting 근사함수 생성앱 만들기

이미지
개요 이번 예제는 마우스로 드래그한 좌표를 기반으로 근사함수를 Fitting 하는 예제 입니다.  차트 위 마우스로 선을 그리면 해당 좌표에 적합한 근사함수를 차수에 따라 만들어주는 기능을 가지고 있습니다.  (함수 항의 0.00 은 소수점 표시가 2자리로 고정 되어 그 이하값이 생략되지만 연산에는 반영)  [DragFit 실행화면] 동영상을 통해 차수가 올라갈 수록 보다 적합 해지는 과정을 확인 할 수 있습니다. 참고로 위 예제는 Numpy의 polyfit () 함수 에 의해 데이터 셋을 근사화 하고 있습니다. 좀 더 들여다 보면 polyfit 함수는 3개의 전달인자 x data, y data, deg(차수) 를 전달하면 최소제곱법 을 사용하여 직선의 기울기 와 절편 을 찾을 수 있습니다. 직선의 기울기와 절편은 데이터 셋과 직선 사이의 오차의 제곱합을 최소화 하는 값입니다. 예를 들면 아래의 데이터 셋을 최소제곱법으로 근사하면 아래와 같습니다. import numpy as np # 주어진 데이터 포인트들 x = np.array([1, 2, 3, 4, 5]) y = np.array([3, 6, 5, 8, 10]) z = np.polyfit(x, y, 1) print(z) # z = [1.6 1.6] # 기울기, 절편 # f(x) = 1.6 * x + 1.6 [최소제곱법 예]

Meta Segment Anything Model에 GUI 적용하기

이미지
개요 최근 심화반수업을 수강하는 학원생분을 통해 Meta AI (과거 Facebook ) 에서 발표한 SAM ( S egment A nything M odel) 이라는 기술을 알게되었습니다. 

PyQt5를 이용한 GUI 오목앱 만들기

이미지
개요 오목게임을 파이썬을 이용해 만들어본 예제입니다. GUI 앱 을 처음 시도해보는 초보가가 공부하기 좋은 예제라고 생각합니다.  

PyQt5를 이용한 이메일 클라이언트(다중 계정지원)

이미지
개요 이번에 소개할 예제는 MS 아웃룩 (Outlook)과 비슷하게 만들어본 이메일 클라이언트 입니다. 예제로서 소개하기 위해 아웃룩처럼 복잡한 기능은 빼고, IMAP을 지원하는 이메일 계정에 접속해 메일을 읽어 오는 기능까지만 구현하였습니다. 로그인 부분에서 다수의 이메일 계정을 입력하면 추가로 탭을 구성하고 메일수신이 가능합니다. 먼저 전자메일 서버에 로그인 해야 합니다. 대부분 전자 메일 서버는 IMAP을 지원 하며, 서버에 2단계 인증 및 앱 비밀번호 를 미리 등록해 두어야 합니다. (앱 비번은 로그인 비번 X, 전자메일 전용 비밀번호 O) [ 예) Goggle 보안 - 2단계 인증, 앱 비밀번호 생성 ] 해당 전자메일 전용 앱 비밀번호를 이용해 로그인을 시도합니다. [eMail Account] 전자메일 서버 로그인 후, 읽어들인 전자메일을 QTableWidget 에 표시. [eMail Contents]   유의 사항 본인 메일서버의 IMAP 기능을 활성 화 시킨 후 적용하기 바랍니다. POP3는 지원하지 않으며, IMAP SSL (TLS X)만 읽을 수 있도록 설정해 두었습니다. TLS 암호화를 사용하는 분은 소스코드의 로그인 부분만 수정하면 됩니다. SMTP는 향후 추가할 계획입니다. 예제에서 테스트된 메일 서버는 Naver, Google Gmail 입니다. 

Matplotlib 마우스 이벤트 처리하기

이미지
개요 이번 주제는 Matplotlib 의 마우스 이벤트 처리 에 대해 살펴보겠습니다. 차트를 그리는 예제는 많은데 그려진 차트에 마우스, 키보드 등 이벤트를 처리하는 코드는 찾기가 어려워 공부삼아 만들어 보았습니다. 먼저 완성된 결과물은 아래와 같습니다.   이 예제에서 다루는 Matplotlib Mouse Event 는 다음과 같습니다. Pressed           (Matplitlib callback 이용) Released         (Matplitlib callback 이용) Move             (Matplitlib callback 이용) ContextMenu   (PyQt5 callback 이용) 아래와 같이 차트위 마우스 이벤트 발생시 해당 좌표가 출력되며, 수직선을 변경된 위치로 옮겨 그려주도록 구성하였습니다. [예제 프로그램 실행화면]

파이썬의 멀티프로세싱(multiprocessing) vs Thread

이미지
개요 안녕하세요. 오늘은 파이썬의 multiprocessing (프로세스 기반 병렬처리) 에 대해 살펴보려고 합니다. 아시다시피 파이썬은 GIL ( G lobal I nterperter L ock) 메커니즘으로 구현되어 있으며, 이로인해 얻은 이점도 ( Thread-Safe ) 있지만, Multi-Thread 기반 병렬처리에서 많은 손해를 봅니다.   잠깐 상상해 볼까요. 만약 1부터 1억까지 모든 수가 나열된 수열이 있고, 이를 모두 더한 합을 구하고 싶습니다. 싱글쓰레드, 멀티쓰레드, 멀티프로세싱 모두 답은 얻을 수 있지만 무엇이 가장 빠를까요? 자세한 내용은 뒤에 소개하겠습니다.   우선 이해를 돕기위해 Application , Proecss, Thread 개념을 간단히 살펴보고 진행하겠습니다. Application (앱) 줄여서 앱(App) 이라고 부르며, 어떤 목적을 가지고 실행중인 프로그램 입니다. 하나 이상의 Proecss 로 구성됩니다. 아래 그림 예시에서 게임앱은 2개의 프로세스 가 서로 통신 ( IPC , 프로세스간 통신) 하며 실행되고 있고 엑셀앱은 단일 프로세스 로 실행중인 모습입니다. 앱은 1개이상의 프로세스로 구성될 수 있습니다. 그리고 프로세스는 1개의 메인쓰레드를 (실행흐름) 갖지만, 별도로 N개의 쓰레드를 생성해 구성할 수도 있습니다. [App, Process, Thread 관계] Process (프로세스) 실행중인 앱을 구성하는 단위(Task) 이며, 1개 이상의 프로세스가 모여 앱을 구성합니다. 하나의 앱은 꼭 1개의 프로세스가 아니라 다수의 프로세스로 구성될 수도 있다는 의미입니다. 예를 들어 게임이라면 아군이동, 적군이동, 코드가 프로

QWidget 의 전역 이벤트(installEventFilter) 처리방법

이미지
개요 Qt 의 Class를 이용 앱 제작시,  QWidget 에서 상속받은 컨트롤 ( QListWidget, QTableWidget, QLineEdit 등) 클래스의 이벤트 처리를 위해 서브 클래싱 (Subclassing) 을 자주 사용하게 됩니다. 예를 들면, 화면위젯에 생성된 리스트위젯에 키보드가 눌러졌는지 등을 체크하기 위해서 말이죠. 하지만, 매번 컨트롤의 이벤트를 감지하기 위해 서브클래싱을 이용하는 것은 피곤한 절차입니다. 왜냐하면 상속받은 클래스를 따로 만들고, 해당 이벤트 처리 함수를 매번 오버라이딩 (Overriding) 하는 소모적인 작업이 뒤따르기 때문입니다.

PyQt5 기반의 T-Rex 게임 만들기

이미지
개요 안녕하세요. 요즘 자전거 타는 재미에 빠져 오랜만에 글을 올리는것 같네요. 이번시간에는 구글 크롬 웹브라우저 에 내장되어 인터넷 연결이 원활하지 않을때 실행되는 T-Rex Game 을 파이썬으로 만들어 보았습니다. 심화반 수업을 듣는 학원생 중, 이 게임을 주제로 진행하는 친구들이 많은데 참조바랍니다. [ T-Rex Game 실행화면 ] 실행화면은 아래 동영상 참조 바랍니다.  

재귀호출을 활용한 GUI 랜덤미로 생성

이미지
개요 이번엔 Python, PyQt5를 이용해 랜덤 미로 생성기 (Maze Generator) 를 만들어 보았습니다.  자세한 내용은 소스코드 분석을 참조하기 바라며, 동작방식은 아래와 같습니다. 화면에 표시되는 위젯(윈도우)을 15x15 크기로 잘라, 작은 격자 사각형을 2차원 리스트에 저장 해 둡니다. 미로 생성이 시작되면 현재 격자의 행,열에서 이동가능한 방향 (상, 하, 좌, 우)을 랜덤으로 선택해 이동합니다. (단, 이미 방문한 곳이 아닌 경우, 재귀호출 , Push Stack ) 만약 더 이상 이동가능한 방향이 없는 경우는 재귀호출의 스택이 풀리며 ( Pop Stack ) 퇴각 검색 ( Backtrack )이 진행되고, 이동가능한 방향이 있는지 다시 찾는 원리로 모든 격자를 방문하게 됩니다.   15 X 15 크기의 랜덤 미로 생성. (사이즈 변경가능) DFS (Depth First Search), 재귀호출을 이용해 구현. 미로 진행 방향에 따른 벽 생성 및 벽 삭제. (상,하,좌,우)  

PyQt기반 회원가입, 로그인 앱 제작

이미지
개요 이번에는 Python, PyQt5 를 이용해 간단한 회원가입, 로그인 을 진행하는 앱을 만들어 보겠습니다. [회원 가입]   [로그인]      주요 기능은 아래와 같습니다. QTabWidget 을 활용해 회원가입, 로그인 위젯 분리 회원가입된 ID, PW는 파일에 저장 로그인시 파일에서 저장된 ID, PW를 읽어와 로그인 여부 판단   SQLite DB 를 사용하는 것보다 코드를 이해하는데 부담이 적을 것으로 판단합니다. Database 를 이해하는 분들은 이 코드를 수정해 DB 를 적용 해보기 바랍니다.

파이썬 반복문에서 리스트 삭제시 유의점

이미지
개요 오늘은 파이썬에서 많이 사용되는 자료형 (Data Type) 인 list 의 삭제 방법 에 대해 깊이 살펴보고자 합니다.   리스트 추가, 삽입, 검색 은 비교적 쉽게 구현 가능하지만, 삭제 는 상황에 따라 생각할 부분이 많습니다. [리스트의 다양한 삭제 경우] 리스트 특정 값 1개 삭제 리스트 인덱스 기반 (몇 번째 요소인지) 삭제 리스트 특정 값 전체 삭제 리스트 복사본을 이용한 삭제  지능형 리스트 (List Comprehension) 를 이용한 삭제

파이썬으로 구현한 윈도우 파일탐색기

이미지
개요 이번 시간에는 Python, PyQt5 QTreeWidget 을 이용해 윈도우 탐색기 를 만들어 보겠습니다. Windows API 함수를 이용해 논리 드라이브를 찾고, 찾은 드라이브를 더블 클릭하면 하위 디렉토리, 파일을 검색해 트리 위젯에 추가합니다. 찾은 경로가 디렉토리인 경우에는 하위 디렉토리를 다시 검색 하고, 파일인 경우 기본 연결 프로그램으로 연결 해 파일을 열어서 보여줍니다. [윈도우 탐색기 앱 실행화면] 완성된 앱의 동작은 아래 동영상을 참조 바라며, 기능은 다음과 같습니다. 1. 윈도우 운영제체의 드라이브 찾기 2. 드라이브의 하위 디렉토리 or 파일 탐색 및 구분 (더블 클릭시) 3. 파일의 경우 더블 클릭시 기본 연결프로그램으로 연결 (*.txt는 메모장 등) 개발 환경 Windows 10 Pro 64bit Python 3.8.8 64bit, Pycharm PyQt5 5.15.3 소스코드 main.py 단일 파일로 구성되어 있으며, 소스코드를 먼저 살펴보고 설명을 이어가겠습니다. from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QTreeWidget, QTreeWidgetItem,QVBoxLayout from PyQt5.QtCore import Qt from ctypes import windll import sys import socket import string import os QApplication.setAttribute(Qt.AA_EnableHighDpiScaling, True) class Form(QWidget): def __init__(self): super().__init__() self.

이 블로그의 인기 게시물

Qt Designer 설치하기

PyQt5 기반 동영상 플레이어앱 만들기