1. 개발 동기
(블로그를 쭉 보신 분들은 알겠지만) 난 원래 고등학교 물리교사다. 물리 교사라면 실험을 해야 한다.
그 당시에 스마트폰을 이용한 활용 교육이 대세였는데 특히 영상 분석이 그러하였다.
스마트폰으로 물체의 운동을 영상으로 찍고 분석하는 방법이 있었다. 10년전(그러니까 2015년 쯤?)은 많은 학생들이 아이폰보단 갤럭시를 사용하였고 안드로이드 어플에서 Vidanalysis라는 프로그램이 있었다.
이 프로그램은 동영상을 촬영하고 실제 거리 설정, 축 설정, 프레임별 위치를 기록하면 표와 그래프로 출력해주는 프로그램이었다.
문제는 터치 잘못하면 결과값이 완전 틀리게 나온다... 그런데 스마트폰의 정확한 터치가 어려우므로 실제 수행평가에서 정밀한 활용이 어려웠지만 나름 잘 쓰긴 했다.
2025년 현재, 대다수 학생들이 아이폰을 쓴다. 문제는 iOS에서는 이러한 분석 프로그램 대다수가 '유료'이다!
사실 많은 물리 선생님분들이 Tracker를 사용한다.
https://opensourcephysics.github.io/tracker-website/
Tracker Video Analysis and Modeling Tool for Physics Education
What is Tracker? Tracker is a free video analysis and modeling tool built on the Open Source Physics (OSP) Java framework. It is designed to be used in physics education. Tracker video modeling is a powerful way to combine videos with computer modeling. Fo
opensourcephysics.github.io
https://www.youtube.com/watch?v=DwDn9i40oxE
(난 트랙커를 사용 안하지만) 얘가 뭔가 복잡해 보이고 물체 자동 추적이 크게 마음에 들지 않아서 Vidanalysis와 Tracker의 기능을 합쳐서 분석 프로그램을 만들어 보기로 했다!
이 포스트는 AI를 이용하여 파이썬 코드를 잘 모르더라도 개발에 실제로 어떻게 사용할 수 있는지 알 수 있다. (그래도 파이썬에 대하여 기초적인 지식은 있어야 한다.)
2. 개발 준비
Open-webui에 Gemini api를 연결하여 인공지능을 준비하였다. Openai나 gemini 플러스는 20$로 환화 약 3만 3천원 하는데 이 돈이 너무 아까웠다. 그래서 사용한 만큼 지불하는 API를 선호한다.
사실 이 프로젝트하려고 웹 기반 챗봇을 만든것이라 해도 과언이 아니다.
덕분에 수업 후 공강 시간에 짬짬히 수행평가를 위한 등가속도 운동 분석 프로그램을 개발할 수 있었다. 한 3일 걸렸나?
Open-webui 환경 구성 방법은 아래 포스트 참고(좀 길다;;;)
https://toyourlight.tistory.com/132
Open-webui 웹 기반 챗봇 만들기
1. 웹 환경 구성하기• Chatbox 와 같은 방법은 설치된 컴퓨터에서만 사용 가능• 채팅 이력 공유 안됨. 다시 말해, 각 컴퓨터마다 설치해야 함 .2. 웹 애플리케이션 특징• 특정 컴퓨터에 설치한 후
toyourlight.tistory.com
1. 개발 계획 및 환경 구성
AI에게 개발 계획을 알려주어야 한다. 그 전에 손으로 그림과 과정을 그려가며 프로그램이 어떻게 돌아가는지 구상을 해야 한다.
그리고 AI에게 계획을 알려준다.
왜 이렇게 해야 하냐면 '등가속도 프로그램을 만들어줘' 하면 절대 못만들어준다! 각 단계별로 하나씩 시행해야 한다. 답변을 확인해 보자.
알겠습니다. 파이썬으로 등가속도 운동 분석기를 만드는 계획을 잘 이해했습니다. 단계별로 기능을 구현해 나갈 예정이군요. 제시된 계획은 매우 체계적이며, 필요한 기능들이 잘 정의되어 있습니다. 각 단계별로 고려해야 할 세부 사항이나 구현 방식을 정리해 보았습니다.
기본 설정 및 준비
라이브러리: tkinter (GUI), cv2 (OpenCV - 비디오 처리), PIL (Pillow - Tkinter에 이미지 표시), numpy (수치 계산), pandas (데이터 처리 및 표 생성), matplotlib (그래프) 등이 필요합니다.
GUI 구조: 메인 창 (tkinter.Tk) 안에 비디오/이미지를 표시할 영역 (tkinter.Canvas 또는 tkinter.Label), 각종 버튼 (tkinter.Button), 정보 표시 레이블 (tkinter.Label) 등을 배치합니다.
상태 관리: 현재 진행 단계(스케일 설정, 원점 설정, 분석 중 등), 사용자 입력 값(좌표, 길이, 각도), 처리된 데이터(프레임 목록, 추적 좌표) 등을 저장할 변수나 클래스 속성이 필요합니다.
계획 검토 및 세부 사항
동영상 로드 및 초기 화면:
tkinter.filedialog.askopenfilename으로 동영상 파일을 선택합니다.
cv2.VideoCapture로 동영상을 엽니다.
첫 프레임을 읽어옵니다 (cap.read()).
동영상 원본 해상도 (cap.get(cv2.CAP_PROP_FRAME_WIDTH), cap.get(cv2.CAP_PROP_FRAME_HEIGHT))를 확인합니다.
가로 영상(너비 > 높이)이면 1280x720, 세로 영상(높이 > 너비)이면 720x1280으로 cv2.resize를 사용하여 프레임 크기를 조절합니다.
조절된 크기에 맞춰 GUI 창 또는 이미지 표시 영역의 크기를 설정합니다. (Canvas 크기 조절 또는 Label에 맞는 이미지 형식 변환)
PIL.ImageTk.PhotoImage를 사용하여 Tkinter Canvas나 Label에 첫 프레임 이미지를 표시합니다.
초기에는 '기준 길이 설정' 버튼 외 다른 버튼(원점 설정, 분석 시작, 이전/다음, 분석 완료 등)을 비활성화(state='disabled') 합니다.
기준 길이 설정 (1번 항목):
상호작용: 이미지 표시 영역(Canvas)에 마우스 클릭 이벤트 (<Button-1>)를 바인딩합니다.
좌표 저장: 첫 번째 클릭 좌표, 두 번째 클릭 좌표를 저장할 변수를 준비합니다.
시각적 피드백: 클릭한 위치에 'X' 마크 (canvas.create_text 또는 canvas.create_oval)를 그리고, 두 점 사이에 직선 (canvas.create_line)을 그립니다.
실제 길이 입력:
팝업 방식 (권장): 두 점이 클릭되면 tkinter.simpledialog.askfloat 또는 tkinter.Toplevel을 이용한 커스텀 팝업창을 띄워 사용자에게 실제 길이를 입력받습니다. 이 방식이 사용자 흐름상 더 명확할 수 있습니다.
활성화/비활성화 방식: GUI 내에 tkinter.Entry 위젯과 '길이 확정' 버튼을 미리 만들고 비활성화해 둡니다. 두 점이 클릭되면 이들을 활성화하여 길이를 입력받고 버튼을 누르게 합니다.
스케일 계산: 실제 길이 / 픽셀 거리로 스케일(pixel/m 또는 m/pixel)을 계산하여 저장합니다. (픽셀 거리는 numpy.linalg.norm 사용)
상태 변경: 길이 입력 및 스케일 계산이 완료되면 '기준 길이 설정' 관련 기능을 비활성화하고 '원점/좌표축 설정' 버튼을 활성화합니다.
원점 및 좌표축 설정 (2번 항목):
원점 클릭: 마우스 클릭 이벤트(<Button-1>)로 원점으로 사용할 좌표를 입력받아 저장합니다.
좌표축 그리기: 저장된 원점 좌표를 기준으로 초기 좌표축(예: x축은 수평, y축은 수직)을 Canvas에 그립니다 (canvas.create_line).
키보드 이벤트: 메인 창 또는 Canvas에 키보드 누름 이벤트 (<KeyPress>)를 바인딩합니다.
좌표축 회전:
← 키: 반시계 90도 회전 (각도 변수 업데이트 및 좌표축 다시 그리기)
→ 키: 시계 90도 회전
↑ 키: 반시계 1도 회전
↓ 키: 시계 1도 회전
각도 저장: 현재 좌표축의 회전 각도를 저장합니다. 이 각도는 나중에 픽셀 좌표를 실제 물리 좌표로 변환할 때 사용됩니다.
상태 변경: 원점 설정 및 좌표축 방향 조정이 완료되면 (예: '좌표축 확정' 버튼 추가 또는 원점 클릭 후 바로) '분석 시작' 버튼을 활성화합니다.
프레임 추출 (3번 항목):
'분석 시작' 클릭 시 동작:
동영상의 FPS (cap.get(cv2.CAP_PROP_FPS))를 얻습니다.
0.1초 단위 프레임 간격 계산: frame_interval = int(fps * 0.1) (최소 1 이상).
동영상을 처음부터 읽으면서 frame_interval 간격으로 프레임을 추출합니다.
추출된 프레임은 리사이징 후 리스트(analyzed_frames)에 저장합니다. 각 프레임의 시간(t = frame_number / fps)도 별도 리스트(time_stamps)에 저장합니다.
(선택) 진행률 표시줄 (tkinter.ttk.Progressbar)을 업데이트하여 사용자에게 처리 과정을 보여줄 수 있습니다.
상태 변경: 프레임 저장이 완료되면 '분석 시작' 버튼을 비활성화하고, '이전', '다음' 버튼을 활성화합니다. 첫 번째 분석 프레임(0번째)을 화면에 표시하고 프레임 정보 레이블(예: "1 / [총 프레임 수]")을 업데이트합니다.
물체 위치 추적 및 프레임 이동 (4, 5번 항목):
화면 표시: 현재 분석 중인 프레임(analyzed_frames[current_index])을 Canvas에 표시합니다.
마우스 이벤트:
왼쪽 클릭 (<Button-1>):
클릭된 픽셀 좌표를 얻습니다.
현재 프레임(current_index)에 이미 표시된 'X' 마크가 있다면 삭제합니다 (canvas.delete(marker_id)).
클릭 위치에 새로운 'X' 마크를 그립니다 (canvas.create_text). 마크 ID를 저장해 둡니다.
현재 프레임 인덱스와 클릭된 픽셀 좌표를 딕셔너리나 리스트에 저장합니다 (예: tracked_pixel_coords[current_index] = (x, y)).
오른쪽 클릭 (<Button-3>):
현재 프레임에 'X' 마크가 있다면 삭제합니다.
저장된 좌표 데이터도 삭제/무효화합니다 (예: tracked_pixel_coords[current_index] = None).
프레임 이동:
'다음' 버튼: current_index를 1 증가시키고 (마지막 프레임이 아닐 경우), 해당 프레임 이미지와 저장된 마크(있다면)를 표시합니다. 프레임 정보 레이블을 업데이트합니다.
'이전' 버튼: current_index를 1 감소시키고 (첫 프레임이 아닐 경우), 위와 동일하게 업데이트합니다.
프레임 정보: tkinter.Label을 사용하여 "현재 프레임 번호 / 총 프레임 수" (예: "5 / 30") 형식으로 표시합니다.
분석 완료 조건 확인 (6번 항목):
'이전' 또는 '다음' 버튼을 누르거나 마우스 클릭으로 좌표를 저장/수정할 때마다 확인합니다.
모든 분석 대상 프레임에 대해 좌표가 저장되었는지 (tracked_pixel_coords 딕셔너리의 모든 값이 None이 아닌지, 또는 리스트 길이가 총 프레임 수와 같은지 등) 검사합니다.
조건이 충족되면 '분석 완료' 버튼을 활성화합니다.
결과 분석 및 표시 (7번 항목):
'분석 완료' 클릭 시 동작:
좌표 변환: 저장된 각 프레임의 픽셀 좌표 (tracked_pixel_coords)를 물리 좌표로 변환합니다.
픽셀 좌표 - 원점 픽셀 좌표로 원점 기준 상대 픽셀 좌표를 구합니다.
회전 각도(axis_angle)를 이용한 2D 회전 변환 행렬을 적용합니다.
계산된 스케일(scale_factor)을 곱하여 실제 거리 단위의 (x, y) 좌표를 얻습니다. (x_physical, y_physical) 리스트를 만듭니다.
물리량 계산:
속도 (v_x, v_y): 시간(time_stamps)과 물리 좌표(x_physical, y_physical)를 이용하여 수치 미분(예: 중앙 차분법)으로 계산합니다. vx = Δx / Δt, vy = Δy / Δt.
가속도 (a_x, a_y): 계산된 속도(vx, vy)를 시간으로 다시 수치 미분하여 계산합니다. ax = Δvx / Δt, ay = Δvy / Δt.
데이터 정리: pandas.DataFrame을 생성하여 시간, x위치, y위치, x속도, y속도, x가속도, y가속도 데이터를 보기 좋게 정리합니다.
결과 팝업: tkinter.Toplevel로 새 창을 띄웁니다.
그래프 표시: matplotlib.pyplot을 사용하여 시간-위치(x, y), 위치(x-y), 시간-속도(vx, vy), 시간-가속도(ax, ay) 그래프를 생성하고, matplotlib.backends.backend_tkagg를 이용해 Tkinter 창에 임베드합니다. 여러 그래프를 subplot으로 표시할 수 있습니다.
표 표시: 생성된 Pandas DataFrame을 tkinter.ttk.Treeview 위젯을 사용하거나, pandas의 스타일링 기능을 활용하여 텍스트 형태로 표시하거나, pandastable 같은 외부 라이브러리를 사용하여 인터랙티브하게 보여줄 수 있습니다.
엑셀 저장: '엑셀로 저장' 버튼을 추가하고, 클릭 시 tkinter.filedialog.asksaveasfilename으로 저장 경로와 파일명을 입력받아 dataframe.to_excel(filepath, index=False)를 실행합니다.
이 계획대로 순차적으로 개발하면 원하는 등가속도 운동 분석기를 만들 수 있을 것입니다. 각 단계별 구현 시 막히는 부분이 있다면 언제든지 다시 질문해주세요.
라이브러리, GUI 구조, 상태 관리, 세부 사항 등을 상세히 알려준다. 본인은 Pyqt5를 이용할 계획이였는데 tkinter로도 구현할 수 있다는 자신감을 보여주었다. 그래서 tkinter로 개발하기로 하였다.
개발을 위한 miniconda 가상환경을 만들어야 한다. (위 open-webui 챗봇 만들기에 miniconda 가상환경 만들기 참고)
가상환경명은 iama( Isometric acceleration motion analyzer) 약자이다.
conda create -n iama python=3.10
안내에 따라 필요 라이브러리를 설치하자 (pyinstaller는 exe 파일 배포를 위해 추가 설치)
pip install -U opencv-python Pillow numpy pandas matplotlib openpyxl spyder pyinstaller
본인은 spyder 개발 환경을 사용하기로 했다.
그러니까, 최소한의 파이썬, 개발 환경 구축 지식 등은 필요하다. 100% AI가 할 수는 없다.
3. 개발 과정
기본적으로 그림 + 설명을 입력해주어야 한다. 그래서 Gemini 2.5 pro preview를 사용하였다. API 비용은 한 15000원 든 것 같다. 왜냐면 그림 입력이 참 비싸거든요...
먼저 큰 밑그림을 제공해 주어야 한다.
동영상 로드, 첫 이미지 보여줌, 2, 3, 4번 버튼 비활성화
동영상을 불러올 때 1280x720(가로 영상, 빗면 운동 영상 등), 720x1280(세로 영상, 자유낙하 등)
으로 리사이징을 하고 그에 맞추어 화면도 조절되어야 한다.
(캡쳐 남겨둔 것은 없지만) 일단 열기 누른 후 재생 버튼까지 성공하였다.
1. 실제 거리를 설정하기 위한 좌표 작업
두 좌표를 클릭하면 각각 X, X 마크가 찍히고 직선이 그어지며 실제 길이값을 구하는 과정을 구현
1) 동영상을 불러오면 재생 버튼 하단에 ‘좌표 작업 시작’이 활성화 됨. 버튼 클릭
2) 버튼을 클릭하면 재생 버튼 비활성화
3) 상태표시줄에 ‘운동 시작점을 클릭하세요.’ 뜨고 클릭하면 빨간색 16포인트 크기의 X_i가 찍힘.
4) 상태표시줄에 ‘운동 종료점을 클릭하세요.’ 뜨고 클릭하면 빨간색 16포인트 크기의 X_f이 찍힘.
5) 이후 팝업창으로 ‘두 지점 간의 실제 거리를 m 단위로 입력하세요’뜨고 숫자를 입력받는 칸이 나옴
6) 숫자를 입력하고 엔터 또는 하단의 OK 버튼을 누르면 종료되고 ‘좌표 작업 시작’ 버튼 하단에
실제 거리 : OOm 라고 뜸.
좌표 작업 시작, 실제거리, X_i, X_f을 그림판으로 작성하고 이미지를 입력하였다.
2. 좌표축(X, Y축) 설정하기
영점(0, 0)으로 지정할 곳을 클릭하면 좌표축을 그려줌, ←, → 키를 누르면 각각 반시계, 시계로 90도 좌표를 돌려주고, ↑, ↓를 누르면 각각 반시계, 시계로 1도씩 돌려줌, 이를 완료하면 "분석시작" 버튼이 활성화 됨.
1) 좌표축 설정 버튼을 누르면 팝업창과 상태표시줄에 ‘좌표의 원점(0, 0)을 클릭하세요’ 라고 뜨고 클릭하면 클릭한 지점을 원점으로 (x, y)의 2차원 직각 좌표계가 그려짐, 직각좌표계는 오른쪽이 (+)인 오른쪽 방향 화살표, 왼쪽이 (+)인 위쪽 화살표가 그려지며 파란색임.
2) 팝업창과 상태표시줄에 ‘방향키로 좌표계를 조절하고 엔터를 입력하세요.’ 라고 표시됨. 방향키의 ←, →를 누르면 각각 반시계, 시계로 90도 좌표로 돌려주고, ↑, ↓를 누르면 각각 반시계, 시계로 1도씩 돌려줌
3) 엔터를 누르면 팝업창으로 ‘좌표계 조절을 완료하시겠습니까? 아니오 버튼을 누르면 좌표 작업이 초기화 됩니다.’ 라고 뜸. 예, 아니오 버튼을 누를 수 있고 예 버튼을 누르면 상태표시줄에 ‘좌표축 설정을 완료하였습니다.’ 라고 뜸. 그리고 실제 거리 하단에 좌표축 설정 : 완료 라고 뜸. 만약 아니오 버튼을 누르면 좌표축 작업을 다시해야 함.
X, Y를 정하기 위한 좌표축을 파란색으로 그리고 좌표축 설정 버튼, 좌표축 설정 완료 여부를 그림판으로 그리고 입력함.
3. 시간 단위 분할하기
0.01 ~ 1.0초 로 동영상을 분할하기 위한 과정이다.
1. 좌표 작업 시작과 좌표축 설정이 완료되어야만 시간 단위 분할 버튼과 아래 이전, 다음 버튼들이 활성화됨.
2. "시간 단위 분할"을 클릭하면 팝업창에 “분석 시간 단위를 입력하세요 (1.0 ~ 0.01 사이 값으로 입력)” 으로 분석 시간 단위를 입력받음.
3. 이 때부터 재생, 좌표 작업 시작, 좌표축 설정은 비활성화 되고 열기만 활성화 되며 동영상을 새로 열어 불러올 경우 처음부터 초기화
4. 분석 시간 단위를 기반으로 동영상을 분석 시간 단위로 분할함. 예를 들어 0.1이 입력되었다면 0.1초 단위로 프레임을 분할함.
5. 분할이 완료되면 "-1이전", "+1다음" 버튼이 활성화되며 -1이전, +1다음 버튼으로 분석 시간 단위로 볼 수 있음. (예를 들어 0.1초 단위라면 이전, 다음 버튼으로 0.1초 이전, 뒤의 프레임을 볼 수 있음.),
6. 같은 논리로 밑에 “-10이전”, “+10다음” 버튼이 활성화되며 -10이전, +10다음 버튼으로 10프레임 단위로 볼 수 있음.
7. 동영상 하단에 현재프레임/총프레임 수를 표기함.
시간 단위 분할 버튼, 네비게이션 버튼, 현재화면과 전체화면 표시 여부등을 그림판으로 그리고 요구함.
4. 위치 측정 시작하기
Vidanalysis처럼 위치를 마우스로 찍어서 기록하는 기능을 요구하였다.
1. 시간 단위 분할 버튼을 눌렀을 때 “시간 단위 분할을 시작합니다” 팝업창을 띄우고 “예”, “아니오” 로 진행할 수 있게 변경
2. 이전, 다음 네비게이션 위에 “위치 측정 시작”버튼과 “측정 OO개 완료” 라벨을 생성함.
3. 위치 측정 버튼을 누르면 팝업창으로 “위치 측정을 시작합니다, 물체 위치에 왼쪽 클릭을 하면 초록색 X로 위치를 기록합니다. 오른쪽 마우스를 누르면 기존 X위치가 초기화됩니다.” 표시, 예, 아니오 버튼 생성
4. 위치 측정 버튼을 눌렀다면 재생, 좌표 작업 시작, 좌표축 설정, 시간 단위 분할은 비활성화 됨. 위치 측정 시작 버튼을 누르면 위치 측정 작업 초기화.
5. 위치를 확인할 곳에 클릭하면 초록색으로 X 표시, 다시 왼쪽 클릭하면 기존 초록색 X는 사라지고 새로운 X가 표시됨. 오른쪽 마우스를 누르면 초록색 X표시가 취소됨.
6. 위치가 측정되었다면 위치 측정 시작 밑에 측정 개수 표기
7. 하단에 “현재 화면” 옆에 “위치측정 : 완료” 와 같이 위치측정이 완료되었는지 표기함
위치 측정 시작 버튼, 측정 개수, 프레임 표시 여부 등을 요구함.
5. 분석 완료하고 표로 출력하기
분석 완료를 눌렀을 때 X, Y의 위치, 속도, 가속도를 구하는 방법을 알려주어야 한다. (이래서 도메인 지식(물리)가 중요하다.)
1. "분석 완료" 버튼을 클릭하면 팝업이 띄워지며 그래프가 뜸.시간-X위치, 시간-Y위치, X위치-Y위치, 시간-X속도, 시간-Y속도, 시간-X가속도, 시간-Y가속도, 위 자료에 대한 표가 뜨며 판다스 데이터 프레임 디자인… 엑셀로 저장?
1. 5개 이상 점을 찍으면 “이전”, “다음” 네비게이션 아래 “분석 완료” 버튼이 활성화가 됨. 이 버튼을 누르면 팝업창으로 “분석을 완료하고 데이터를 확인하시겠습니까?” 예/아니오 표기됨.
2. 예를 누르면 새로운 창이 뜨고 측정한 거리, 설정한 좌표를 기반으로 X위치, Y위치를 계산함.
3. 등가속도 운동이므로 계산한 각 X, Y위치 차이(변위)를 시간 단위로 나누면 평균속도를 계산할 수 있음. 평균속도와 그 다음 평균속도의 평균속도를 구하면 위치 측정한 곳에서의 순간속도를 구할 수 있음(왜냐하면 등가속도 운동에서 어떤 구간에서의 평균속도는 구간 중간시각에서의 순간속도가 됨) 이를 X속도, Y속도라고 하자. (예를들어 13프레임과 16프레임의 평균속도를 v_1, 16프레임과 19프레임의 평균속도를 v_2라고 하자. v_1에서 v_2까지의 평균속도(v_1 + v_2)/2를 하면 16프레임에서의 순간 속도를 구할 수 있음.)
4. X, Y의 속도를 각각 구했으면 걸린 시간을 기반으로 평균 가속도를 구할 수 있음.
5. 이렇게 하여 시간-X위치-Y위치-X속도-Y속도-X가속도-Y가속도 를 표로 나타내고 저장 버튼을 누르면 엑셀로 저장할 수 있음. (아직 그래프 보기는 절대 구현하지 말것!)
분석 완료 버튼과 이를 눌렀을 때 X, Y에 대한 위치, 속도, 가속도를 계산하고 어떻게 출력되어야 하는지 요구함.
6. 그래프 출력하기
그래프 출력하는 방법을 알려주어야 한다. 어려운 과정은 아니므로 그림으로 그려서 설명하지는 않았다.
1. 엑셀로 저장 옆에 “그래프 보기” 버튼 생성 및 활성화
2. 이 버튼을 누르면 새로운 창이 뜨고 시간-위치, 시간-속도, 시간-가속도 탭이 각각 형성됨.
3. 시간-위치 그래프 탭은 시각에 따른 X위치, Y위치 그래프를 사진과 같이 각각 꺽은선형 그래프를 그려준다. X위치 그래프 색은 빨간색, Y위치 그래프 색은 파란색이다.
4. 하단에 이미지(jpg)로 저장할 수 있는 버튼을 각각 생성한다.
5. 시간-속도 탭에서는 시간-위치와 원리가 동일한데 사진과 같이 각 그래프에 검은색 선으로 추세선을 그려주고 수식을 차트에 표시한다.
6. 시간-가속도 탭에서는 시간-위치와 원리가 동일한데 사진과 같이 각 그래프에 추세선에서 구한 기울기를 기준선 처럼 그려준다.
7. 최종 수정하기
개발 완료 후 아쉬운 부분을 조금 더 보강하였다. 아이폰은 세로로 찍어도 가로로 불러와져서 불편했다. 그래서 회전/반전 기능을 추가하기로 하였다.
동영상 불러온 후 회전, 반전 기능이 있었음 좋겠다. (90도씩 회전, 좌우, 상하 반전)
1)동영상 불러온 후 90도, 상하, 좌우 버튼을 누르면 순서대로 동영상 90도 회전, 상하반전, 좌우 반전됨.
2)특히 동영상 90도 돌릴 때 GUI 창 크기는 가로로 불러올때, 세로로 불러올 때 창 크기로 조절되어야 함.
3)재생, 처음 버튼을 누를때 90도, 상하, 좌우 버튼 비활성화
4)거리 측정 완료 된 이후부터는 90도회전, 좌우반전, 상하반전 비활성화
5)당연히 새롭게 동영상 열기를 누르면 회전, 반전기능 활성화
90도, 상하, 좌우 버튼 추가한 그림을 입력함.
동영상 운동 시작점이 너무 먼 경우, 이동하기 힘들어 직접 프레임을 입력할 수 있는 기능을 추가하였다.
프레임 이동을 추가하자
좋았어. 여기에 방금 위에서 니가 작성한 회전/반전 기능 관련 로직을 추가한 코드에서 그림과 같이 원하는 번호를 입력 후 엔터를 치면 해당 프레임으로 이동하는 기능을 위의 코드에서 “추가” 해줘, 다른거 수정하지 말고!
그림판으로 프레임 이동 방법을 설명하고 입력함.
8. exe 파일로 배포하기
일단 가상환경에서 conda clean —all 을 입력하여 캐시를 지우자
.py와 .ico가 있는 곳으로 이동 cd path\\to\\your\\project\\folder
하나의 파일, GUI모드, 아이콘 포함 설치
pyinstaller --onefile --windowed --icon="gravity.ico" --add-data "gravity.ico;." your_script_name.py
- your_script_name.py: 실제 파이썬 스크립트 파일 이름으로 바꿔주세요 (예: analyzer_app.py).
- -onefile: 필요한 모든 것을 하나의 .exe 파일로 묶습니다. 배포가 간편하지만, 실행 시 임시 폴더에 압축을 해제하므로 초기 실행 속도가 약간 느릴 수 있습니다.
- -windowed 또는 w: GUI 애플리케이션이므로 실행 시 뒤에 검은색 콘솔 창이 뜨지 않도록 합니다. (중요)
- -icon="gravity.ico": 생성될 .exe 파일 자체의 아이콘을 **gravity.ico**로 지정합니다.
- -add-data "gravity.ico;.": 애플리케이션 실행에 필요한 데이터 파일(여기서는 아이콘 파일 자체)을 포함시킵니다.
- gravity.ico: 포함시킬 원본 파일 이름입니다.
- ;: Windows에서 원본 경로와 대상 경로를 구분하는 문자입니다. (macOS/Linux에서는 : 사용)
- .: 대상 경로입니다. **.**은 실행 파일이 있는 루트 디렉토리를 의미합니다. 코드에서 **os.path.join(os.path.dirname(__file__), "gravity.ico")**로 아이콘을 찾으므로, 실행 파일과 같은 위치에 아이콘 파일이 있도록 지정해야 합니다.
왠 에러?
ERROR: The 'pathlib' package is an obsolete backport of a standard library package and is incompatible with PyInstaller. Please remove this package (located in C:\Users\MyITX\AppData\Roaming\Python\Python310\site-packages) using conda remove then try again.
여기 들어가보니 pip uninstall pathlib 해도 상관 없다더라
'pathlib' obsolete backport of a standard library package and incompatible with PyInstaller
'pathlib' obsolete backport of a standard library package and incompatible with PyInstaller
bwoodsend 읽지 않음, 2023. 7. 3. 오후 3:57:3423. 7. 3. 작성자에게 답장하려면 로그인하세요. 전달하려면 로그인하세요. 이 그룹의 메시지를 삭제할 권한이 없습니다. 그룹의 이메일 주소가 익명이거
groups.google.com
그리고 pyinstaller 하니 정상 인식 됨. 아니 또 이건 뭔 에러여?
[Python] Pyinstaller 오류 : A RecursionError (maximum recursion depth exceeded) occurred.For working around please follow thes
Concept Pyinstaller는 파이썬 기반 실행 파일을 만드는 강력한 툴입니다. 윈도우나 맥 환경에 맞추어 자동으로 라이브러리와 필요 모듈을 내장하기 때문에 쉽게 배포판을 만들수 있죠. 하지만, 파이
deep-eye.tistory.com
A RecursionError (maximum recursion depth exceeded) occurred.
재귀 문제라고? .spec 파일을 메모장 열어서 제한을 늘리면 된다고 한다.
상단에 import sys sys.setrecursionlimit(5000)
추가, 기본적으로는 1000회가 최대라고 한다.
그리고 pyinstaller IAMA_analyzer.spec 입력
간단한데 왜 15000원 정도가 들었을까? 이미지 입력도 있지만 이 코드가 약 1200줄 정도 된다. 즉, 수정할 때 마다 코드를 전체 출력하다보니 토큰값이 비싸게 나온다. 실제로 이런 방법으로 개발하는 것은 비추천하지만, 간단한 로직의 경우 사용해 볼 수 있는 방법이다.
실제 사용 방법은 아래 포스트를 참고하자.
https://toyourlight.tistory.com/134
(통합과학1) 수평으로 던진 공의 운동, 자유낙하 운동 분석하기
https://drive.google.com/file/d/1Qw4zW2rmWrHZxeVb9ekQUWJOtyJ4tqLo/view?usp=sharing IAMA_analyzer1.1.1.exe drive.google.com
toyourlight.tistory.com
https://toyourlight.tistory.com/135
(물리학I) 빗면에서 움직이는 등가속도 운동 분석하기
https://drive.google.com/file/d/1Qw4zW2rmWrHZxeVb9ekQUWJOtyJ4tqLo/view?usp=sharing IAMA_analyzer1.1.1.exe drive.google.com 아래 글은 IAMA 개선 이전의 PPT로 조금 다를 수 있지만 활용에 큰 문제 없음.
toyourlight.tistory.com
'파이썬 프로그래밍 > 파이썬 개발' 카테고리의 다른 글
2. DSPy 생기부 AI 에이전트-1 (2) | 2025.05.13 |
---|---|
1. DSPy 기초적인 사용법 탐구하기, 생기부 작성 예제 (2) | 2025.05.11 |
생활기록부 AI 에이전트 만들기 프로젝트 (0) | 2025.05.10 |
파이썬 패키지 만들기-2 PYPI, Github 올리기 (0) | 2024.06.09 |
파이썬 패키지 만들기-1 환경 구성하기 (0) | 2024.06.07 |