<?xml version="1.0"?>
<rss version="2.0">
   <channel>
      <title>비전기술 구현2 - 미디어파이프 by 박경숙</title>
      <link>https://padlet.com/cs96960328/vision</link>
      <description></description>
      <language>en-us</language>
      <pubDate>2025-05-19 01:26:36 UTC</pubDate>
      <lastBuildDate>2026-05-10 03:09:08 UTC</lastBuildDate>
      <webMaster>hello@padlet.com</webMaster>
      <image>
         <url></url>
      </image>
      <item>
         <title>LLM 다음으로 월드모델?</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3456690398</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://youtu.be/HKFeEnDgBMc?si=OugSBTEQqEfquWM-&amp;t=359" />
         <pubDate>2025-05-19 05:30:41 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3456690398</guid>
      </item>
      <item>
         <title>AI 발전에 대한 시각차이</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3456692354</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://youtu.be/HKFeEnDgBMc?si=Y6HZRhLDeFnnkamW&amp;t=266" />
         <pubDate>2025-05-19 05:31:50 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3456692354</guid>
      </item>
      <item>
         <title>아래 영상 시청 후 설문</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3456903570</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/forms/d/e/1FAIpQLScLmagPPNl3-4Jo99OGSRzN2yMrj44xrg7NuRlRwpUiw6wi5A/viewform?usp=sharing&amp;ouid=110672464550622468726" />
         <pubDate>2025-05-19 07:28:09 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3456903570</guid>
      </item>
      <item>
         <title>미디어 파이프1-1</title>
         <author>cs9636</author>
         <link>https://padlet.com/cs96960328/vision/wish/3459898238</link>
         <description><![CDATA[<p>기본 핸드랜드마크 인식</p>]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/483229584/da79cf9cfd7254bfa699641aa3476daf/__________1__1_.pdf" />
         <pubDate>2025-05-20 21:12:49 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3459898238</guid>
      </item>
      <item>
         <title></title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3462115089</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

# Mediapipe 핸드 추적 모듈 초기화
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils

# 웹캠 열기
cap = cv2.VideoCapture(0)

while True:
    success, img = cap.read()  # 비디오 프레임 캡처
    if not success:  # 이미지가 제대로 캡처되지 않으면 종료
        print("이미지 캡처 실패")
        break
    
    # BGR에서 RGB로 변환 (Mediapipe는 RGB 이미지를 요구)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    # 핸드 트래킹 결과 처리
    result = hands.process(img_rgb)

    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)

    # 결과 이미지를 화면에 표시
    cv2.imshow("Hand Tracking", img)

    # 'ESC' 키가 눌리면 종료
    if cv2.waitKey(1) &amp; 0xFF == 27:
        break

# 리소스 해제
cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-05-22 01:20:36 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3462115089</guid>
      </item>
      <item>
         <title>과제 셀프 체크💎(매실습마다)</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3465854627</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/spreadsheets/d/1fRn16HV9UnSrJoIgdOghZ5HUv8AhIGZZB-TJtdfx3yQ/edit?usp=sharing" />
         <pubDate>2025-05-25 00:23:21 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3465854627</guid>
      </item>
      <item>
         <title>lr 오류2</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3465870113</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands=2)
mp_draw = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)

while True:
    success, img = cap.read()
    img = cv2.flip(img,1)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    
    result = hands.process(img_rgb)
    
    #if result.multi_hand_landmarks:
    #    for handLms in result.multi_hand_landmarks:
    #        mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)

    if result.multi_hand_landmarks and result.multi_handedness:
        h, w, c = img.shape
        
        for i, handLms in enumerate(result.multi_hand_landmarks):        
            label = result.multi_handedness[i].classification[0].label
            cx = int(handLms.landmark[0].x * w)
            cy = int(handLms.landmark[0].y * h)
            cv2.putText(img, label, (cx, cy), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,255), 2)
            mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)


    cv2.imshow("Hand Tracking", img)
    
    if cv2.waitKey(5) &amp; 0xFF == 27:  # ESC 키로 종료
        cap.release()
        cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-05-25 01:26:31 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3465870113</guid>
      </item>
      <item>
         <title>30915 박oo</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3466584571</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3892621985/87e536ebe34f375211aeccc32dcf7143/hand.py" />
         <pubDate>2025-05-26 01:21:06 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3466584571</guid>
      </item>
      <item>
         <title>홍oo</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3467023473</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw= mp.solutions.drawing_utils
cap= cv2.VideoCapture(0)
while True:
    success, img = cap.read()
    if not success:
                        break
    img_rgb= cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
    result = hands.process(img_rgb)
    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)
    cv2.imshow("Hand Tracking",img)
    if cv2.waitKey(5) &amp; 0xFF == 27:
        break
cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-05-26 05:19:46 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3467023473</guid>
      </item>
      <item>
         <title>강oo</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3467024799</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils
cap = cv2.VideoCapture(0)
while True:
    success, img = cap.read()
    img_rgb = cv2.cvtColor(img, cv2. COLOR_BGR2RGB)
    result=hands.process(img_rgb)
    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(img,handLms,mp_hands.HAND_CONNECTIONS)
        cv2.imshow("Hand Tracking", img)
        if cv2.waitKey(5) &amp; 0xFF == 27:
            break
cap.release()
cv2.destroyAllWindows()
    </code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-05-26 05:20:27 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3467024799</guid>
      </item>
      <item>
         <title>채oo</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3467026927</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils

cap = cv2.videoCapture(0)

while True:
success, img = cap.read()
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

result = hands.process(img_rgb)

if result.multi_hand_landmarks:
    for handLms in result.multi_hand_landmarks:
        mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)

cv2.imshow("Hand Tracking", img)

if cv2.waitkey(5) &amp; 0xFF == 27:
    cap.release()
    cv2.destroyAllWindows()
    </code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-05-26 05:21:24 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3467026927</guid>
      </item>
      <item>
         <title>미디어 파이프 1-2</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3468000031</link>
         <description><![CDATA[<ol><li><p>비주얼 스튜디오 실행</p></li><li><p>에러나는 코드 수정해보기</p></li><li><p>추가 코드( 반복 while True: ,종료키 수정,  좌우반전, 여러개 손인식?,...)</p></li><li><p>과제 셀프체크 💎 </p></li><li><p>오늘의 코드 설문 <a rel="noopener noreferrer nofollow" href="https://forms.gle/SRXxN4mfABeRngaU8">https://forms.gle/SRXxN4mfABeRngaU8</a></p></li></ol>]]></description>
         <enclosure url="https://forms.gle/SRXxN4mfABeRngaU8" />
         <pubDate>2025-05-26 23:19:52 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3468000031</guid>
      </item>
      <item>
         <title>30130 홍하진</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3468256653</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils
cap = cv2.VideoCapture(0)

while True:
    success, img = cap.read()
    img = cv2.flip(img, 1)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    result = hands.process(img_rgb)

    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)

    cv2.imshow("Hand Tracking", img)

    if cv2.waitKey(5) &amp; 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-05-27 01:49:15 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3468256653</guid>
      </item>
      <item>
         <title>30101 강택열</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3468258667</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils
cap = cv2.VideoCapture(0)

while True:
    success, img = cap.read()
    img = cv2.flip(img, 1)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    result = hands.process(img_rgb)

    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)

    cv2.imshow("Hand Tracking", img)

    if cv2.waitKey(5) &amp; 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-05-27 01:50:18 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3468258667</guid>
      </item>
      <item>
         <title>30406 김태호</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3468288826</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)
while True:
    success, img = cap.read()
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    result = hands.process(img_rgb)

    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)

    cv2.imshow("Hand Tracking", img)

    if cv2.waitKey(5) &amp; 0xFF ==ord('x'):
        cap.release()
        cv2.destroyAllWindows()
        img = cv2.flip(img, 1)</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-05-27 02:05:26 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3468288826</guid>
      </item>
      <item>
         <title>미디어 파이프 2 </title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3469740548</link>
         <description><![CDATA[<p>왼손오른손 구분-&gt; 손가락 카운팅까지</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/483229584/fc42d1d3bc248e6541b75b47a0a34ec7/__________2__3_.pdf" />
         <pubDate>2025-05-27 20:59:28 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3469740548</guid>
      </item>
      <item>
         <title>30602 고건영</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3469860528</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3903447676/70490484331cb1ed8f9c5dd9ff2c85ec/image.png" />
         <pubDate>2025-05-28 00:05:54 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3469860528</guid>
      </item>
      <item>
         <title>30603 국빈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3469861480</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3903441694/e60357a601ab0307d95f78da11421ec8/image.png" />
         <pubDate>2025-05-28 00:06:45 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3469861480</guid>
      </item>
      <item>
         <title>30602 고건영</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3469861513</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3903447676/f3800871e2b5aba26e447f05ca04913c/image.png" />
         <pubDate>2025-05-28 00:06:48 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3469861513</guid>
      </item>
      <item>
         <title>30110 백한빈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3469877524</link>
         <description><![CDATA[<p><br></p><p>● 텍스트 변경(크기, 색)</p>]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3903566473/3f3e15435177e733de04e1418230aa2e/8.PNG" />
         <pubDate>2025-05-28 00:17:30 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3469877524</guid>
      </item>
      <item>
         <title>30428 최재민</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3469878468</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3903498976/87aabcbb132a8d87b50e634e25f7355d/image.png" />
         <pubDate>2025-05-28 00:18:04 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3469878468</guid>
      </item>
      <item>
         <title>30407 박건</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3469883981</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3903577946/0cb9d37986724879bd79ddaa5e412a63/______2025_05_28_092224.png" />
         <pubDate>2025-05-28 00:21:14 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3469883981</guid>
      </item>
      <item>
         <title>30317 안은호</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3469884413</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3903506973/6035a908a1cb1cb03d9f7116860e3ceb/image.png" />
         <pubDate>2025-05-28 00:21:27 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3469884413</guid>
      </item>
      <item>
         <title>김현 - 손가락 카운팅 작성확인/화면 추후</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3469884424</link>
         <description><![CDATA[]]></description>
         <enclosure url="" />
         <pubDate>2025-05-28 00:21:27 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3469884424</guid>
      </item>
      <item>
         <title>30217 유동권</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3469887357</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads.storage.googleapis.com/3903448941/df10b642e3a7065a348fe3e284b2e7bb/image.png" />
         <pubDate>2025-05-28 00:23:04 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3469887357</guid>
      </item>
      <item>
         <title>1. hand 랜드마크 그리고 좌우반전까지</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3473337710</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

mp_hands = mp.solutions.hands
hands = mp_hands.Hands()
mp_draw = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)

while True:
    success, img = cap.read()
    #img = cv2.flip(img,1)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    result = hands.process(img_rgb)
    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(img,handLms,mp_hands.HAND_CONNECTIONS)
    
    cv2.imshow("Hand Tracking", img)

    if cv2.waitKey(5) &amp; 0xFF == 27:
        cap.release()
        cv2.destroyAllWindows()

</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-05-30 02:48:01 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473337710</guid>
      </item>
      <item>
         <title>30719 이현우</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473381895</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3914953578/207e01fd2c5c44d284cf30538460461e/______2025_05_30_121225.png" />
         <pubDate>2025-05-30 03:12:52 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473381895</guid>
      </item>
      <item>
         <title>31022 임정우</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473384094</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915012207/28670cbaadb5a11dee2a87f454770707/image.png" />
         <pubDate>2025-05-30 03:14:13 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473384094</guid>
      </item>
      <item>
         <title>31122 이지호</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473388372</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3914967044/38d2607a3a7fe59c69437f9973eda5c6/______2025_05_30_121635.png" />
         <pubDate>2025-05-30 03:17:00 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473388372</guid>
      </item>
      <item>
         <title>31106김유찬</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473388731</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915061078/5884ddefd10847e0bc4cd913faf4f2ec/image.png" />
         <pubDate>2025-05-30 03:17:12 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473388731</guid>
      </item>
      <item>
         <title>31001 김동연</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473389816</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3914986614/7039319b322801beff3462eae7ba049c/image.png" />
         <pubDate>2025-05-30 03:17:50 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473389816</guid>
      </item>
      <item>
         <title>30910 문승현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473389935</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915080511/ae8ed1130bb96c78be3f787842af17e1/______2025_05_30_121657.png" />
         <pubDate>2025-05-30 03:17:55 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473389935</guid>
      </item>
      <item>
         <title>30728 한태민</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473390106</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3914983227/84d150d744c6fafd4c0d54170a666f8b/______2025_05_30_121743.png" />
         <pubDate>2025-05-30 03:18:02 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473390106</guid>
      </item>
      <item>
         <title>30922 염준현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473391749</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3914955660/102cd320932976b23b4582ae064d0977/eqqqqqqqqqqqqqqqq.png" />
         <pubDate>2025-05-30 03:19:01 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473391749</guid>
      </item>
      <item>
         <title>30818 이승민</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473392327</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3914970862/a8c9130584dac5508d1c5026ce3119eb/dltmdals.png" />
         <pubDate>2025-05-30 03:19:14 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473392327</guid>
      </item>
      <item>
         <title>30703 곽성빈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473395252</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3914986726/76c4a3c3236149451b4c2892d2bb1703/image.png" />
         <pubDate>2025-05-30 03:20:42 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473395252</guid>
      </item>
      <item>
         <title>30923 이도운</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473399938</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915049510/4ac0ef325cea1422f8fe1cf03202b099/image.png" />
         <pubDate>2025-05-30 03:23:49 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473399938</guid>
      </item>
      <item>
         <title>30921 안예현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473665469</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915936616/2308ce895a5137685befee6c7c866c3c/___.PNG" />
         <pubDate>2025-05-30 07:11:40 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473665469</guid>
      </item>
      <item>
         <title>30724 정진규</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473667992</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915907576/207e7838261737200db23e4f4dfb9183/image.png" />
         <pubDate>2025-05-30 07:14:18 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473667992</guid>
      </item>
      <item>
         <title>30811 송민재</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473668368</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915958187/371881adc5bed57ffc2a3e307d6ddf2b/______2025_05_30_161249.png" />
         <pubDate>2025-05-30 07:14:41 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473668368</guid>
      </item>
      <item>
         <title>30803 김대현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473668890</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915941494/f11361166b09f1307d0582cd56be2ecf/image.png" />
         <pubDate>2025-05-30 07:15:18 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473668890</guid>
      </item>
      <item>
         <title>30707 김민재</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473669972</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915976222/460da40305647ab8e45d3b7ef746ca05/image.png" />
         <pubDate>2025-05-30 07:16:37 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473669972</guid>
      </item>
      <item>
         <title>30817 이성우</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473670136</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3916018460/2b3d984262e4e205b014f5118d3a693f/30817.png" />
         <pubDate>2025-05-30 07:16:50 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473670136</guid>
      </item>
      <item>
         <title>30827 차정훈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473670341</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915968332/73b5f74144b33eeab681f36c37b30fdb/__2.jpg" />
         <pubDate>2025-05-30 07:17:06 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473670341</guid>
      </item>
      <item>
         <title>30803김대현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473671264</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915941494/db5698d5a19a3535bb18e79aad5df1b1/image.png" />
         <pubDate>2025-05-30 07:18:06 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473671264</guid>
      </item>
      <item>
         <title>30911 박규현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473673242</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915932147/bfdbca347e87516a423845fbcee50ecb/30911____.png" />
         <pubDate>2025-05-30 07:20:31 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473673242</guid>
      </item>
      <item>
         <title>30925 이재호</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473674515</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3915900500/f13d82fb5b3e5997b1966d63558dd7b2/______2025_05_30_162138.png" />
         <pubDate>2025-05-30 07:22:10 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473674515</guid>
      </item>
      <item>
         <title>31003 김준호</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473676123</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3916107884/3bc83472834e67b76e657c4aa3e1407e/______2025_05_30_162208.png" />
         <pubDate>2025-05-30 07:24:02 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473676123</guid>
      </item>
      <item>
         <title>31110박진수</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3473677435</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3916100469/c871fe1ab58c6c7accbfd27e05b0cbb8/______2025_05_30_162431.png" />
         <pubDate>2025-05-30 07:25:15 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3473677435</guid>
      </item>
      <item>
         <title>30805 김민제</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3474525377</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/483229584/16c5543741b0c88c9ab52af1794c3924/KakaoTalk_20250530_162741220.jpg" />
         <pubDate>2025-05-31 12:39:34 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3474525377</guid>
      </item>
      <item>
         <title>프로젝트 학생 제출용 공유 양식</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3479441862</link>
         <description><![CDATA[<p>사본으로 저장 후 사용</p>]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1P7bsfyTunbXSmk43_VlAwRgQu0QEJbjVXyhdmgOlBvA/edit?usp=sharing" />
         <pubDate>2025-06-05 00:29:35 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3479441862</guid>
      </item>
      <item>
         <title>30805 김민제(문자로 보내드린 것 중에 이걸 못 보신 것 같아 추가로 올립니다)</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3479463101</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3943459945/7308ed5e4dc96a44f374597c78ff3392/temp_1749084002563__1676072903.jpeg" />
         <pubDate>2025-06-05 00:41:49 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3479463101</guid>
      </item>
      <item>
         <title>30112 서문빈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3479903789</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3943475397/0b50d95a3b88e228e8908e1a4a5b7e55/30112___.png" />
         <pubDate>2025-06-05 05:14:53 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3479903789</guid>
      </item>
      <item>
         <title></title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3479907637</link>
         <description><![CDATA[<p>30621 이하율</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3944502691/a5c6a20ed445739555cb4a93b323770d/_____2025_06_05_141600.png" />
         <pubDate>2025-06-05 05:17:00 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3479907637</guid>
      </item>
      <item>
         <title>30221 이정현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3479909752</link>
         <description><![CDATA[<p> </p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3944584699/ac039a32d4627dc533b29c340cf2bad9/image.png" />
         <pubDate>2025-06-05 05:18:18 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3479909752</guid>
      </item>
      <item>
         <title>30126 조남기</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3479909880</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3944500821/af1cfd6db560508e88ac379f3b59f2f3/_____2025_06_05_141710.png" />
         <pubDate>2025-06-05 05:18:23 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3479909880</guid>
      </item>
      <item>
         <title>30413 성준기</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3479909998</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3944496913/fec2c9407333b91a171b450becb71f76/image.png" />
         <pubDate>2025-06-05 05:18:28 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3479909998</guid>
      </item>
      <item>
         <title>30402 권일철</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3479910240</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3944511167/14b92ab3d5de80d68f2f6c6c9d4dcfcb/image.png" />
         <pubDate>2025-06-05 05:18:38 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3479910240</guid>
      </item>
      <item>
         <title>30226조건우</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3479912397</link>
         <description><![CDATA[<p>안녕해</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3944516505/00f45c102fd3ff1d175be830d85fda82/image.png" />
         <pubDate>2025-06-05 05:19:59 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3479912397</guid>
      </item>
      <item>
         <title>30418 이승환</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3479914400</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3944688858/f8d5952baa68f1d5bb96f5c8f33a0ef1/image.png" />
         <pubDate>2025-06-05 05:21:13 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3479914400</guid>
      </item>
      <item>
         <title>count_까지</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3480935625</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

hands = mp.solutions.hands.Hands()
draw = mp.solutions.drawing_utils
tips = [4, 8, 12, 16, 20]

cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    frame = cv2.flip(frame, 1)
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(rgb)

    if result.multi_hand_landmarks:
        for hand in result.multi_hand_landmarks:
            point = hand.landmark
            w, h = frame.shape[1], frame.shape[0]
            count = 0

            if point[tips[0]].x &lt; point[tips[0]-1].x:
                count += 1
            for i in range(1, 5):
                if point[tips[i]].y &lt; point[tips[i]-2].y:
                    count += 1

            x, y = int(point[0].x * w), int(point[0].y * h)
            cv2.putText(frame, str(count), (x, y - 30), 0, 1, (0, 255, 0), 2)
            #draw.draw_landmarks(frame, hand, mp.solutions.hands.HAND_CONNECTIONS)

    cv2.imshow("Hand", frame)
    if cv2.waitKey(5) &amp; 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-06-06 01:28:24 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3480935625</guid>
      </item>
      <item>
         <title>30801 권세준</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482710756</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958706523/5f8e28eb031bfdcd60c7e7782b6d72fc/image.png" />
         <pubDate>2025-06-09 01:10:53 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482710756</guid>
      </item>
      <item>
         <title>31002 김동하</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482710926</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958615393/138b2d0e9913fafffdd44c7f8557c7a2/image.png" />
         <pubDate>2025-06-09 01:11:00 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482710926</guid>
      </item>
      <item>
         <title></title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482713140</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958615184/54f3605143bad408ebb847332b771f42/_____2025_06_09_101214.png" />
         <pubDate>2025-06-09 01:12:13 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482713140</guid>
      </item>
      <item>
         <title></title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482714359</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958645890/0582b5dd1873e295edaf1ff4d855b7f2/image.png" />
         <pubDate>2025-06-09 01:12:57 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482714359</guid>
      </item>
      <item>
         <title>31113 봉준근</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482715105</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958774130/f86660f1afefc318dce73c7a150648c1/image.png" />
         <pubDate>2025-06-09 01:13:24 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482715105</guid>
      </item>
      <item>
         <title>30808 박성진</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482715652</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958770854/51ede8e578f08d6bd0c37d7dc93f0005/_____2025_06_09_101215.png" />
         <pubDate>2025-06-09 01:13:44 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482715652</guid>
      </item>
      <item>
         <title>31029 하시온</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482716819</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958656276/d34e633396afc0f345e64117f2f1f8b2/_____2025_06_09_101442.png" />
         <pubDate>2025-06-09 01:14:25 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482716819</guid>
      </item>
      <item>
         <title>31011 유민기</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482717283</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958615704/ddeffd42e56845a2ff354baa972d5226/image.png" />
         <pubDate>2025-06-09 01:14:41 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482717283</guid>
      </item>
      <item>
         <title>30723 정준범</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482718173</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958614630/314e3eef3ac15c99cd06165f11a1dee3/_____2025_06_09_101441.png" />
         <pubDate>2025-06-09 01:15:13 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482718173</guid>
      </item>
      <item>
         <title>30826조유찬</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482719630</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958651089/39759accbc14388b4b311254ddbf40bc/image.png" />
         <pubDate>2025-06-09 01:16:07 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482719630</guid>
      </item>
      <item>
         <title>30708 김세윤</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482720100</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958777928/a0d86105e15a200e5fe64ecc8bd8e8bd/image.png" />
         <pubDate>2025-06-09 01:16:23 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482720100</guid>
      </item>
      <item>
         <title>30709 김승주</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482720449</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958791746/ea3061300583c4cee85e70427fd6649b/image.png" />
         <pubDate>2025-06-09 01:16:33 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482720449</guid>
      </item>
      <item>
         <title>30915 박주혁</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482720735</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958763287/102d3c03bc013f20c9c91b957121dd6b/image__1_.png" />
         <pubDate>2025-06-09 01:16:43 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482720735</guid>
      </item>
      <item>
         <title>31027 최영준</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482723499</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958683718/e7f3377989b62dc9fabf0c2095c49ac5/image.png" />
         <pubDate>2025-06-09 01:18:13 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482723499</guid>
      </item>
      <item>
         <title>31104 김대현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482724463</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958613462/38905ac94f85ee1bd653601255682e55/image.png" />
         <pubDate>2025-06-09 01:18:46 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482724463</guid>
      </item>
      <item>
         <title>30701 강건호</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3482724517</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3958804170/29b330d81f4b04eb82173d6e6813121d/image.png" />
         <pubDate>2025-06-09 01:18:47 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3482724517</guid>
      </item>
      <item>
         <title>희성 용천 - 대학설명회 참여</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3483022322</link>
         <description><![CDATA[]]></description>
         <enclosure url="" />
         <pubDate>2025-06-09 04:33:26 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483022322</guid>
      </item>
      <item>
         <title>30617이경원</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483063773</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3959659480/f7b874ea7d1e938a9d2fa5c4d95e69d4/image.png" />
         <pubDate>2025-06-09 05:03:18 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483063773</guid>
      </item>
      <item>
         <title>30420 임현승</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483068073</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3959724881/3a9219040ca8d10e7093bb84d85bdaa6/image.png" />
         <pubDate>2025-06-09 05:06:16 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483068073</guid>
      </item>
      <item>
         <title>30101 강택열</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483068418</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3959643616/a3fcf6b166a82d3faaa04ec74b4dbaf8/_____2025_06_09_140530.png" />
         <pubDate>2025-06-09 05:06:32 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483068418</guid>
      </item>
      <item>
         <title>30130 홍하진</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483068555</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3959659368/643b8b5064261199f47bef8190229efc/______2025_06_09_140443.png" />
         <pubDate>2025-06-09 05:06:38 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483068555</guid>
      </item>
      <item>
         <title>30127 채영주</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483071224</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3959664594/fa3f5c560c3686bad85b0a13d5f3b731/image.png" />
         <pubDate>2025-06-09 05:08:26 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483071224</guid>
      </item>
      <item>
         <title>30420 임현승</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483071535</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3959817553/026171901dd2ad75268f33d31e133d30/image.png" />
         <pubDate>2025-06-09 05:08:41 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483071535</guid>
      </item>
      <item>
         <title>30211 박주환</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483075558</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3959751181/ee57e349230fed07a59e201e871e3163/asdfasdfeeeeeeeeeeeeeeeeeeeeeeeee.png" />
         <pubDate>2025-06-09 05:11:03 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483075558</guid>
      </item>
      <item>
         <title>30522 전주영</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483079280</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3959661292/f300171a852eb127ad1a7245d09449d3/________.png" />
         <pubDate>2025-06-09 05:13:48 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483079280</guid>
      </item>
      <item>
         <title>30120 이동하</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483079779</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3959823787/3565a7a21a076d7f83f926b87f66613d/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee.png" />
         <pubDate>2025-06-09 05:14:11 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483079779</guid>
      </item>
      <item>
         <title>2-2컴퓨터 인식하는 손 (좌표까지)</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3483903430</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

# Mediapipe 초기화
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils
hands = mp_hands.Hands( )

# 웹캠 열기
cap = cv2.VideoCapture(0)

while True:
    success, frame = cap.read()
    if not success:
        break

    frame = cv2.flip(frame, 1)
    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(image_rgb)

    if result.multi_hand_landmarks:
        for hand_landmarks in result.multi_hand_landmarks:
            h, w, _ = frame.shape
            for idx, lm in enumerate(hand_landmarks.landmark):
                cx, cy = int(lm.x * w), int(lm.y * h)

                # 랜드마크 번호와 좌표값 함께 출력
                text = f"{idx}:({cx},{cy})"
                offset_y = 10  # y축 오프셋으로 텍스트 겹침 방지
                cv2.putText(frame, text, (cx, cy + offset_y),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.45, (0, 255, 0), 2)

    cv2.imshow("Hand Landmarks with Coordinates", frame)

    if cv2.waitKey(1) &amp; 0xFF == 27:  # ESC
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-06-09 22:30:41 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483903430</guid>
      </item>
      <item>
         <title>30926 이진후</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3483904195</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

# 초기화
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

hands = mp_hands.Hands(max_num_hands=1, min_detection_confidence=0.7)
cap = cv2.VideoCapture(0)

# 손가락 팁 landmark 번호 (Thumb 제외)
finger_tips = [8, 12, 16, 20]

while cap.isOpened():
    success, image = cap.read()
    if not success:
        break

    # 이미지 전처리
    image = cv2.flip(image, 1)
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    results = hands.process(image_rgb)

    finger_count = 0

    if results.multi_hand_landmarks:
        for hand_landmarks in results.multi_hand_landmarks:
            lm = hand_landmarks.landmark

            # 엄지 처리 (왼손/오른손 판단 생략 - 간단한 방식)
            if lm[4].x &lt; lm[3].x:  # 엄지가 펴진 경우
                finger_count += 1

            # 나머지 손가락 처리
            for tip in finger_tips:
                if lm[tip].y &lt; lm[tip - 2].y:  # 손가락이 접혀있지 않음
                    finger_count += 1

            # 손가락 개수 출력
            cv2.putText(image, f'Fingers: {finger_count}', (10, 50),
                        cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 3)

            # 손 랜드마크 시각화
            mp_drawing.draw_landmarks(
                image, hand_landmarks, mp_hands.HAND_CONNECTIONS)

    # 화면 출력
    cv2.imshow('Finger Counter', image)

    if cv2.waitKey(1) &amp; 0xFF == 27:
        break

# 정리
cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/483229584/6b10386cbb051bc988fa93f68a4fdbce/image.png" />
         <pubDate>2025-06-09 22:32:37 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483904195</guid>
      </item>
      <item>
         <title>2-1 컴퓨터 인식하는 손(랜드마크만)</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3483920760</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

# Mediapipe 초기화
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

# 손 인식 모델 설정
hands = mp_hands.Hands(
    static_image_mode=False,
    max_num_hands=2,
    min_detection_confidence=0.7,
    min_tracking_confidence=0.5
)

# 웹캠 열기
cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 좌우 반전 (사용자 입장에서 보기 좋게)
    frame = cv2.flip(frame, 1)
    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(image_rgb)

    if result.multi_hand_landmarks:
        for hand_landmarks in result.multi_hand_landmarks:
            # 랜드마크 그리기
            '''mp_drawing.draw_landmarks(
                frame,
                hand_landmarks,
                mp_hands.HAND_CONNECTIONS
            )'''

            # 각 랜드마크 번호 표시
            h, w, _ = frame.shape
            for idx, lm in enumerate(hand_landmarks.landmark):
                cx, cy = int(lm.x * w), int(lm.y * h)
                cv2.putText(frame, str(idx), (cx, cy),
                            cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

    cv2.imshow("Hand Landmarks with Index", frame)

    if cv2.waitKey(1) &amp; 0xFF == 27:  # ESC 키
        break

cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-06-09 23:05:57 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483920760</guid>
      </item>
      <item>
         <title>미디어 파이프 3</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3483935229</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1FA7r7oucbBCe8yBMZJzM1Sx_pc2S9bCYg_eLWQEXZ_g/edit?usp=sharing" />
         <pubDate>2025-06-09 23:31:26 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483935229</guid>
      </item>
      <item>
         <title>31011 유민기</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483979350</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/18FP05gLiLVTwd5PN3UekumKvP-7F1RueTsjVqD0CWIY/edit?usp=sharing" />
         <pubDate>2025-06-10 00:15:49 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483979350</guid>
      </item>
      <item>
         <title>30808 박성진</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483983656</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1RWR7O4fsZSvtaBDTW77t79lmngmD6lLTY44fc2KsD3M/edit?usp=sharing" />
         <pubDate>2025-06-10 00:18:56 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483983656</guid>
      </item>
      <item>
         <title>30801 30826</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483985575</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1iSojjU7AmnFhOjSLqEthUKHdWSFrAijWeee2dUO7Zuc/edit?usp=sharing" />
         <pubDate>2025-06-10 00:20:24 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483985575</guid>
      </item>
      <item>
         <title></title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3483986643</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1_jeon9xUMzHEiqX7-1m54NkW-SihYM7J1cXcSkI5-9g/edit?usp=sharing" />
         <pubDate>2025-06-10 00:21:15 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3483986643</guid>
      </item>
      <item>
         <title>30112</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484063839</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1P09tDtUn2SfbsUdM-_R41keEtByhp5A0mjd57ymfs0A/edit?usp=sharing" />
         <pubDate>2025-06-10 01:07:09 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484063839</guid>
      </item>
      <item>
         <title>30115</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484083320</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1dREkN58KcuxNnDlz49OM7r1S-_Bj-RVIj4MDxL7wg3k/edit?usp=sharing" />
         <pubDate>2025-06-10 01:17:49 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484083320</guid>
      </item>
      <item>
         <title>30413</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484084734</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1HGZCNlht6wq1COcUuHzdLgE-Sq_Fdlge4HI44HoRxVE/edit?usp=sharing" />
         <pubDate>2025-06-10 01:18:33 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484084734</guid>
      </item>
      <item>
         <title>30621 이하율</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484086936</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1YOrs3cqaJbou9wBGfOUoIrhK0zc9iH1TdpCEXyPMEbg/edit?usp=sharing" />
         <pubDate>2025-06-10 01:19:41 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484086936</guid>
      </item>
      <item>
         <title>30226조건우</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484087115</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1CQymJ0xQXBEb5wvDfIgKFoeRjH4jrXAi2U8XSYgzZ2A/edit?usp=sharing" />
         <pubDate>2025-06-10 01:19:47 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484087115</guid>
      </item>
      <item>
         <title>30126 조남기</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484087472</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1t6BcFOAzopDThAp1H_7Ol0YMwD4LV7OOJg09OXaYEMA/edit?usp=sharing" />
         <pubDate>2025-06-10 01:19:58 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484087472</guid>
      </item>
      <item>
         <title>30418 이승환</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484088497</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/15tqBIdQ-JdC_ADtcoar5ab78_r54NGllh8afm4YcHrc/edit?usp=sharing" />
         <pubDate>2025-06-10 01:20:25 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484088497</guid>
      </item>
      <item>
         <title>30402 권일철</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484088585</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1XALirTYfYrX9Dfv6rJAw0xx66ufpLwVSTmVwRZNtwbA/edit?usp=sharing" />
         <pubDate>2025-06-10 01:20:28 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484088585</guid>
      </item>
      <item>
         <title>30221 이정현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484093246</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1lbUa9vhQvCBNXuMZlHGHgqxRM0PQDkYbPygkt6whI1c/edit?usp=sharing" />
         <pubDate>2025-06-10 01:22:39 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484093246</guid>
      </item>
      <item>
         <title>30530황인성</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484153047</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3964701118/21c759e21a79bef56212680b2fc96fe3/______2025_06_10_105455.png" />
         <pubDate>2025-06-10 01:55:30 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484153047</guid>
      </item>
      <item>
         <title>30616양재훈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484182080</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3964840188/e27e54b8aa84fef066fe6e584f7a2f70/______2025_06_10_110846.png" />
         <pubDate>2025-06-10 02:10:35 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484182080</guid>
      </item>
      <item>
         <title></title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484182490</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3964699578/2b45cc832bdf01a2d644cc3a9ef6f4f5/______2025_06_10_111002.png" />
         <pubDate>2025-06-10 02:10:44 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484182490</guid>
      </item>
      <item>
         <title>30507김용천</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484192648</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3964718391/04438b25385d6dc0ca284a13d2648628/______2025_06_10_111427.png" />
         <pubDate>2025-06-10 02:14:59 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484192648</guid>
      </item>
      <item>
         <title>30211 박주환</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484199483</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1MysT8d_sRYmRk1Nmpg420_LGZ_zfTQJmuzDWvbaSYVs/edit?usp=sharing" />
         <pubDate>2025-06-10 02:17:47 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484199483</guid>
      </item>
      <item>
         <title>30101 강택열, 30130 홍하진</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484202587</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1I13gsX6IgnVVa3hOgWlbOZqwHGv7aY1R2OgO1H7Mfy4/edit?usp=sharing" />
         <pubDate>2025-06-10 02:18:55 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484202587</guid>
      </item>
      <item>
         <title>30522 전주영</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484202897</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1FA7r7oucbBCe8yBMZJzM1Sx_pc2S9bCYg_eLWQEXZ_g/edit?usp=sharing" />
         <pubDate>2025-06-10 02:19:02 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484202897</guid>
      </item>
      <item>
         <title>30127  채영주, 정세현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484205309</link>
         <description><![CDATA[<p> </p>]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1wGn1mXOTH4UJLjuXNUnMkgLBI0bgCbO37IqS60uhnc0/edit?usp=sharing" />
         <pubDate>2025-06-10 02:20:02 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484205309</guid>
      </item>
      <item>
         <title>30530황인성</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484205314</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1oionPJv9CmQ29wPL5pK6tgnxfilZIX3_EetjY4KkL7E/edit?usp=sharing" />
         <pubDate>2025-06-10 02:20:02 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484205314</guid>
      </item>
      <item>
         <title>30520 이희성</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484209472</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/16NqWgCSXJegC3JFyQPdtoQ1aQjwqiX8_WFir1hFjqtM/edit?usp=sharing" />
         <pubDate>2025-06-10 02:21:55 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484209472</guid>
      </item>
      <item>
         <title>30110백한빈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484863314</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1LSudmedrfqZQ4R8YZkEYRzxrGdTtWrmFhlJi6UAYMo0/edit?usp=sharing" />
         <pubDate>2025-06-10 07:16:10 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484863314</guid>
      </item>
      <item>
         <title>30407 박건</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484863868</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1eYGGQU0SNsL2aL7EysGtrwCe8IW773ymYhv9-8uxzuM/edit?usp=sharing" />
         <pubDate>2025-06-10 07:16:30 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484863868</guid>
      </item>
      <item>
         <title>30603 국빈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484864425</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1ZD_FAUVubdPP-ZZn6ScSeDigvuRpQUWFcjNrGkxiF1E/edit?usp=sharing" />
         <pubDate>2025-06-10 07:16:44 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484864425</guid>
      </item>
      <item>
         <title>30428 최재민, 30217 유동권</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3484877835</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1OdcrTZ8EKBLNvs5P8tHQ5wU2RbFXL1ksOX29oMZ2DeI/edit?usp=sharing" />
         <pubDate>2025-06-10 07:23:47 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3484877835</guid>
      </item>
      <item>
         <title>30421 임현우</title>
         <author>ihu07182108</author>
         <link>https://padlet.com/cs96960328/vision/wish/3485705313</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/13duXPlGnbS-x-4cB5tznzP2zUpmqMI0n-E49rhG8Qbw/edit?usp=sharing" />
         <pubDate>2025-06-10 23:36:10 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3485705313</guid>
      </item>
      <item>
         <title>30106 김현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3485724633</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3970865959/6814a25efc959efb8969d3cb8c0cad8b/__________3____.pptx" />
         <pubDate>2025-06-10 23:57:05 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3485724633</guid>
      </item>
      <item>
         <title>무조건 지는 가위바위보 30421 임현우</title>
         <author>ihu07182108</author>
         <link>https://padlet.com/cs96960328/vision/wish/3485726047</link>
         <description><![CDATA[<p>말도 하는 가위바위보</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3871666535/ce050f67a16f7e32b13134f7466c2ba4/vin2.py" />
         <pubDate>2025-06-10 23:58:31 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3485726047</guid>
      </item>
      <item>
         <title>30602 고건영</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3485732296</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1bZdrhVzG5lWVQ8KBVnPUQBTZcaQkVA09hprgEXbw_NE/edit?usp=sharing" />
         <pubDate>2025-06-11 00:04:11 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3485732296</guid>
      </item>
      <item>
         <title>30225 전영현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3485761464</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1RDt4wR7tYQAcfRciFLJqf8a5FOOowMJ1bqwkou05uzI/edit?usp=sharing" />
         <pubDate>2025-06-11 00:24:58 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3485761464</guid>
      </item>
      <item>
         <title>얼굴 랜드마크</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3485872851</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

# MediaPipe 초기화
mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh(static_image_mode=False,
                                   max_num_faces=1,
                                   min_detection_confidence=0.5,
                                   min_tracking_confidence=0.5)

mp_drawing = mp.solutions.drawing_utils

# 웹캠 열기
cap = cv2.VideoCapture(0)

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    # 이미지 변환 (BGR → RGB)
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = face_mesh.process(rgb_frame)

    # 결과 그리기
    if results.multi_face_landmarks:
        for face_landmarks in results.multi_face_landmarks:
            mp_drawing.draw_landmarks(
                frame,
                face_landmarks,
                mp_face_mesh.FACEMESH_TESSELATION,  # 얼굴 전체 메쉬
                landmark_drawing_spec=None,
                connection_drawing_spec=mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=1)
            )

    cv2.imshow('Face Landmarks', frame)
    if cv2.waitKey(1) &amp; 0xFF == 27:  # ESC 눌러서 종료
        break

cap.release()
cv2.destroyAllWindows()
p

# 초기 설정

mp_face_mesh = mp.solutions.face_mesh

face_mesh = mp_face_mesh.FaceMesh(static_image_mode=False, max_num_faces=1, refine_landmarks=True)

# 웹캠 열기

cap = cv2.VideoCapture(0)

while True:

    ret, frame = cap.read()

    if not ret:

        break

    # RGB 변환

    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    results = face_mesh.process(rgb)

    # 얼굴 랜드마크가 감지되었을 때

    if results.multi_face_landmarks:

        for face_landmarks in results.multi_face_landmarks:

            for lm in face_landmarks.landmark:

                h, w, _ = frame.shape

                x, y = int(lm.x*w), int(lm.y*h)

                cv2.circle(frame, (x, y), 1, (0, 255, 0), -1)

    cv2.imshow('Face Landmarks', frame)

    if cv2.waitKey(1) &amp; 0xFF == 27:  # ESC 키 종료

        break

cap.release()

cv2.destroyAllWindows()

</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-06-11 01:29:50 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3485872851</guid>
      </item>
      <item>
         <title>포즈 랜드마크 표시</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3485884025</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

# MediaPipe 초기화
mp_pose = mp.solutions.pose
mp_drawing = mp.solutions.drawing_utils

# 포즈 모델 초기화
pose = mp_pose.Pose(static_image_mode=False, model_complexity=1,
                    enable_segmentation=False, min_detection_confidence=0.5, min_tracking_confidence=0.5)

# 웹캠 열기
cap = cv2.VideoCapture(0)

while cap.isOpened():
    success, frame = cap.read()
    if not success:
        break

    # 이미지 전처리
    frame = cv2.flip(frame, 1)
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    # 포즈 추정
    results = pose.process(rgb_frame)

    # 결과 시각화
    if results.pose_landmarks:
        mp_drawing.draw_landmarks(
            image=frame,
            landmark_list=results.pose_landmarks,
            connections=mp_pose.POSE_CONNECTIONS,
            landmark_drawing_spec=mp_drawing.DrawingSpec(color=(255, 0, 0), thickness=2, circle_radius=2),
            connection_drawing_spec=mp_drawing.DrawingSpec(color=(0, 255, 0), thickness=2)
        )

    cv2.imshow('Pose Detection', frame)
    if cv2.waitKey(5) &amp; 0xFF == 27:  # ESC 키 종료
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-06-11 01:36:45 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3485884025</guid>
      </item>
      <item>
         <title>30724 정진규</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3487297629</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3977826141/bd8c3402b62b3a8fc1c2e94360f96616/mouse.py" />
         <pubDate>2025-06-12 01:19:27 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487297629</guid>
      </item>
      <item>
         <title>30827 차정훈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3487306848</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import random

# Mediapipe 초기화
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
    static_image_mode=False,
    max_num_hands=2,
    min_detection_confidence=0.7,
    min_tracking_confidence=0.5
)

FINGER_TIPS = [8, 12, 16, 20]  # 손가락 끝 인덱스
FINGER_PIPS = [6, 10, 14, 18]  # 손가락 중간 관절 인덱스

# 아이템 클래스 정의
class Item:
    def __init__(self, width, height, speed):
        self.x = random.randint(50, width - 50)
        self.y = 0
        self.speed = speed
        self.radius = 30
        self.type = "fruit" if random.random() &lt; 0.8 else "bomb"
        self.caught = False

    def fall(self):
        self.y += self.speed

    def draw(self, frame):
        color = (0, 255, 0) if self.type == "fruit" else (0, 0, 255)
        if not self.caught:
            cv2.circle(frame, (int(self.x), int(self.y)), self.radius, color, -1)

    def check_collision(self, hand_x, hand_y):
        dx = self.x - hand_x
        dy = self.y - hand_y
        return (dx**2 + dy**2) ** 0.5 &lt; self.radius + 20

# 주먹 인식 함수
def is_fist(hand_landmarks):
    count_folded = 0
    for tip, pip in zip(FINGER_TIPS, FINGER_PIPS):
        if hand_landmarks.landmark[tip].y &gt; hand_landmarks.landmark[pip].y:
            count_folded += 1
    return count_folded == 4  # 네 손가락이 다 접혔을 때

# 기본 설정
cap = cv2.VideoCapture(0)
score = 0
item = None
base_speed = 5

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    frame = cv2.flip(frame, 1)
    h, w, _ = frame.shape
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(rgb)

    if item is None or item.caught or item.y &gt; h:
        item = Item(w, h, base_speed + score * 0.3)

    item.fall()

    if result.multi_hand_landmarks:
        for hand_landmarks in result.multi_hand_landmarks:
            lm = hand_landmarks.landmark[9]
            hand_x, hand_y = int(lm.x * w), int(lm.y * h)
            cv2.circle(frame, (hand_x, hand_y), 15, (255, 255, 0), -1)

            if is_fist(hand_landmarks):  # 주먹인 경우에만 체크
                if item.check_collision(hand_x, hand_y):
                    item.caught = True
                    if item.type == "fruit":
                        score += 1
                    elif item.type == "bomb":
                        score -= 2
                    break  # 한 번만 판정

    item.draw(frame)

    cv2.putText(frame, f"Score: {score}", (30, 50),
                cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 255), 3)

    cv2.imshow("Fruit &amp; Bomb Catch (Fist Only)", frame)
    if cv2.waitKey(1) &amp; 0xFF == 27:  # ESC
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3977908962/02cb75361ffeeda5d90054380247e624/z.png" />
         <pubDate>2025-06-12 01:23:52 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487306848</guid>
      </item>
      <item>
         <title>코드와 실행화면 캡쳐올려주세요</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3487402275</link>
         <description><![CDATA[]]></description>
         <enclosure url="" />
         <pubDate>2025-06-12 02:16:12 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487402275</guid>
      </item>
      <item>
         <title>코드와 실행화면 캡쳐올려주세요</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3487402823</link>
         <description><![CDATA[]]></description>
         <enclosure url="" />
         <pubDate>2025-06-12 02:16:28 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487402823</guid>
      </item>
      <item>
         <title>코드와 실행화면 캡쳐올려주세요</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3487403079</link>
         <description><![CDATA[]]></description>
         <enclosure url="" />
         <pubDate>2025-06-12 02:16:35 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487403079</guid>
      </item>
      <item>
         <title>코드와 실행화면 캡쳐올려주세요</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3487403276</link>
         <description><![CDATA[]]></description>
         <enclosure url="" />
         <pubDate>2025-06-12 02:16:41 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487403276</guid>
      </item>
      <item>
         <title>코드와 실행화면 캡쳐올려주세요</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3487403444</link>
         <description><![CDATA[]]></description>
         <enclosure url="" />
         <pubDate>2025-06-12 02:16:47 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487403444</guid>
      </item>
      <item>
         <title>코드와 실행화면 캡쳐올려주세요</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3487405267</link>
         <description><![CDATA[]]></description>
         <enclosure url="" />
         <pubDate>2025-06-12 02:17:42 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487405267</guid>
      </item>
      <item>
         <title>활용 프로젝트 참고영상</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3487568670</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://youtu.be/CSLv-dhVKxs?si=cxobZ_fc18Gi2N5x" />
         <pubDate>2025-06-12 04:08:38 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487568670</guid>
      </item>
      <item>
         <title>아잉</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3487672745</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import random
import time

# 초기 설정
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands=1)
mp_draw = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)
w, h = 640, 480
cap.set(3, w)
cap.set(4, h)

# 사과 객체 정의
class Apple:
    def __init__(self):
        self.x = random.randint(50, w - 50)
        self.y = 0
        self.speed = random.randint(3, 6)
        self.size = 30

    def fall(self):
        self.y += self.speed

    def draw(self, img):
        cv2.circle(img, (self.x, self.y), self.size, (0, 0, 255), -1)

    def is_hit(self, bullet_x, bullet_y):
        return abs(self.x - bullet_x) &lt; self.size and abs(self.y - bullet_y) &lt; self.size

# 총알 객체 정의
class Bullet:
    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.speed = 10

    def move(self):
        self.y -= self.speed

    def draw(self, img):
        cv2.circle(img, (self.x, self.y), 5, (255, 255, 0), -1)

apples = []
bullets = []
score = 0
last_apple_time = time.time()
cooldown = 0.4
last_shot_time = 0

while True:
    success, img = cap.read()
    if not success:
        break
    img = cv2.flip(img, 1)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    results = hands.process(img_rgb)
    h, w, _ = img.shape
    index_tip = thumb_tip = None
    shoot_ready = False
    gun_x = gun_y = -100

    # 손 인식 및 사격 조건 체크
    if results.multi_hand_landmarks:
        for handLms in results.multi_hand_landmarks:
            mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)

            # 검지끝 (8), 엄지끝 (4)
            index_tip = handLms.landmark[8]
            thumb_tip = handLms.landmark[4]
            gun_x = int(index_tip.x * w)
            gun_y = int(index_tip.y * h)

            # 사격 조건: 검지가 엄지보다 위
            if index_tip.y &lt; thumb_tip.y and time.time() - last_shot_time &gt; cooldown:
                bullets.append(Bullet(gun_x, gun_y))
                last_shot_time = time.time()

            # 총 그리기
            cv2.circle(img, (gun_x, gun_y), 15, (255, 0, 0), -1)
            cv2.putText(img, "FIRE" if index_tip.y &lt; thumb_tip.y else "AIM",
                        (gun_x - 20, gun_y - 25), cv2.FONT_HERSHEY_SIMPLEX, 0.5,
                        (0, 255, 0) if index_tip.y &lt; thumb_tip.y else (0, 0, 255), 2)

    # 사과 생성
    if time.time() - last_apple_time &gt; 1.0:
        apples.append(Apple())
        last_apple_time = time.time()

    # 사과 그리기 및 충돌 확인
    for apple in apples[:]:
        apple.fall()
        apple.draw(img)
        for bullet in bullets[:]:
            if apple.is_hit(bullet.x, bullet.y):
                apples.remove(apple)
                bullets.remove(bullet)
                score += 1
                break
        if apple.y &gt; h:
            apples.remove(apple)

    # 총알 이동
    for bullet in bullets[:]:
        bullet.move()
        bullet.draw(img)
        if bullet.y &lt; 0:
            bullets.remove(bullet)

    # 점수 표시
    cv2.putText(img, f"Score: {score}", (10, 40),
                cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

    cv2.imshow("Apple Shooter", img)

    if cv2.waitKey(1) &amp; 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-06-12 05:04:21 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487672745</guid>
      </item>
      <item>
         <title>원기옥 </title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3487673126</link>
         <description><![CDATA[<p>import cv2</p><p>import mediapipe as mp</p><p>import time</p><p>import numpy as np</p><p>import random</p><p><br></p><p>mp_hands = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.hands</p><p>mp_drawing = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.drawing_utils</p><p><br></p><p>hands = mp_hands.Hands(</p><p>&nbsp;&nbsp;&nbsp;&nbsp;max_num_hands=2,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;min_detection_confidence=0.7,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;min_tracking_confidence=0.7</p><p>)</p><p><br></p><p>cap = cv2.VideoCapture(0)</p><p><br></p><p># 원 크기와 상태 변수</p><p>circle_radius = 10</p><p>circle_growing = False</p><p>start_time = None</p><p>exploded = False</p><p>shake_offset = (0, 0)</p><p><br></p><p>def is_hands_facing_each_other(hand1, hand2, img_width, threshold=100):</p><p>&nbsp;&nbsp;&nbsp;&nbsp;# 손바닥 중심으로 x좌표 계산 (landmark 0이 손목, 9, 5 등 손바닥 위치 고려 가능)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;def palm_center(hand):</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x_vals = [lm.x for lm in hand.landmark]</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cx = int(np.mean(x_vals) * img_width)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return cx</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;cx1 = palm_center(hand1)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;cx2 = palm_center(hand2)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;# 두 손이 서로 마주보고 있는 조건:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;# 손 위치가 서로 가까이(x축 차이가 threshold 이하), 그리고 x 좌표가 서로 반대쪽(한쪽은 왼쪽, 다른쪽은 오른쪽)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;distance = abs(cx1 - cx2)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;facing = (distance &lt; threshold) and (cx1 &lt; cx2)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;return facing, (cx1 + cx2)//2</p><p><br></p><p>def apply_shake(frame, intensity=10):</p><p>&nbsp;&nbsp;&nbsp;&nbsp;h, w = frame.shape[:2]</p><p>&nbsp;&nbsp;&nbsp;&nbsp;dx = random.randint(-intensity, intensity)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;dy = random.randint(-intensity, intensity)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;M = np.float32([[1, 0, dx], [0, 1, dy]])</p><p>&nbsp;&nbsp;&nbsp;&nbsp;shaken = cv2.warpAffine(frame, M, (w, h))</p><p>&nbsp;&nbsp;&nbsp;&nbsp;return shaken, (dx, dy)</p><p><br></p><p>while True:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;success, frame = <a rel="noopener noreferrer nofollow" href="http://cap.read">cap.read</a>()</p><p>&nbsp;&nbsp;&nbsp;&nbsp;if not success:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;frame = cv2.flip(frame, 1)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;img_h, img_w = frame.shape[:2]</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;result = hands.process(image_rgb)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;if result.multi_hand_landmarks and len(result.multi_hand_landmarks) == 2:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hand1, hand2 = result.multi_hand_landmarks</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;facing, center_x = is_hands_facing_each_other(hand1, hand2, img_w)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 손 랜드마크 그리기</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for hand_landmarks in result.multi_hand_landmarks:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if facing:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not circle_growing:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_time = time.time()</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circle_growing = True</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circle_radius = 10</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exploded = False</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circle_growing = False</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_time = None</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circle_radius = 10</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exploded = False</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;else:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circle_growing = False</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_time = None</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circle_radius = 10</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exploded = False</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;# 원 크기 점진적 증가 처리 (0.5초마다 1.5배씩 증가)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;if circle_growing and start_time:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;elapsed = time.time() - start_time</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if elapsed &gt; 0.5:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;factor = 1.5 ** int((elapsed - 0.5) // 0.5)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circle_radius = int(10 * factor)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;# 원 크기가 너무 커지면 폭발 효과 + 화면 흔들림</p><p>&nbsp;&nbsp;&nbsp;&nbsp;if circle_radius &gt; 150 and not exploded:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exploded = True</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;explosion_start = time.time()</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;# 화면 흔들림과 폭발 이펙트</p><p>&nbsp;&nbsp;&nbsp;&nbsp;if exploded:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frame, shake_offset = apply_shake(frame, intensity=20)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 폭발 이펙트 - 랜덤 위치에 작은 원 그리기</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for _ in range(50):</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;x = random.randint(0, img_w)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y = random.randint(0, img_h)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;r = random.randint(5, 15)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color = (random.randint(150, 255), random.randint(0, 50), random.randint(0, 50))</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="noopener noreferrer nofollow" href="http://cv2.circle">cv2.circle</a>(frame, (x, y), r, color, -1)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 폭발 지속시간 1.5초</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if time.time() - explosion_start &gt; 1.5:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circle_growing = False</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;start_time = None</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;circle_radius = 10</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;exploded = False</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shake_offset = (0, 0)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;else:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 원 그리기 (두 손이 마주보고 있을 때만)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if circle_growing and start_time:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;center_y = img_h // 2</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="noopener noreferrer nofollow" href="http://cv2.circle">cv2.circle</a>(frame, (center_x + shake_offset[0], center_y + shake_offset[1]), circle_radius, (255, 0, 0), -1)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;cv2.imshow("Hand Interaction", frame)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;if cv2.waitKey(1) &amp; 0xFF == 27:&nbsp; # ESC</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break</p><p><br></p><p>cap.release()</p><p>cv2.destroyAllWindows()</p><p><br><br></p>]]></description>
         <enclosure url="" />
         <pubDate>2025-06-12 05:04:36 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487673126</guid>
      </item>
      <item>
         <title>30418 이승환</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3487698128</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import random
import math
import time

mp_pose = mp.solutions.pose
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

pose = mp_pose.Pose()
hands = mp_hands.Hands(max_num_hands=2, min_detection_confidence=0.5)

cap = cv2.VideoCapture(0)
width = int(cap.get(3))
height = int(cap.get(4))

target_radius = 40
target_x = random.randint(100, width - 100)
target_y = random.randint(100, height - 100)

score = 0

def distance(x1, y1, x2, y2):
    return math.hypot(x2 - x1, y2 - y1)

# 5초 대기하는 동안 화면 멈추지 않고 메시지 띄우기
ready_start = time.time()
ready_duration = 5
while True:
    success, frame = cap.read()
    if not success:
        break

    frame = cv2.flip(frame, 1)
    elapsed_ready = time.time() - ready_start
    if elapsed_ready &gt; ready_duration:
        break

    # 준비 메시지 표시
    cv2.putText(frame, f'Ready? Starting in {int(ready_duration - elapsed_ready) + 1} seconds...', 
                (50, height // 2), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 3)

    cv2.imshow('Hand Target Game', frame)
    if cv2.waitKey(5) &amp; 0xFF == 27:
        cap.release()
        cv2.destroyAllWindows()
        exit()

start_time = time.time()
time_over = False

while cap.isOpened():
    success, frame = cap.read()
    if not success:
        break

    frame = cv2.flip(frame, 1)
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    elapsed = time.time() - start_time

    if elapsed &gt; 20:
        time_over = True

    if not time_over:
        hands_results = hands.process(rgb)

        if hands_results.multi_hand_landmarks:
            for hand_landmarks in hands_results.multi_hand_landmarks:
                # 손바닥 중심 좌표 계산 (landmark 0,1,5,9,13,17 평균)
                palm_points = [0, 1, 5, 9, 13, 17]
                cx = int(sum([hand_landmarks.landmark[i].x for i in palm_points]) / len(palm_points) * width)
                cy = int(sum([hand_landmarks.landmark[i].y for i in palm_points]) / len(palm_points) * height)

                # 과녁과 거리 비교
                if distance(cx, cy, target_x, target_y) &lt; target_radius + 30:
                    score += 1
                    target_x = random.randint(100, width - 100)
                    target_y = random.randint(100, height - 100)

                # 손바닥 중심만 표시
                cv2.circle(frame, (cx, cy), 10, (0, 255, 0), -1)

    # 과녁 그리기
    cv2.circle(frame, (target_x, target_y), target_radius, (0, 0, 255), -1)

    # 점수 표시
    cv2.putText(frame, f'Score: {score}', (30, 60), cv2.FONT_HERSHEY_SIMPLEX,
                1.5, (0, 255, 0), 3)

    if not time_over:
        cv2.putText(frame, f'Time: {int(20 - elapsed)}', (width - 250, 60), cv2.FONT_HERSHEY_SIMPLEX,
                    1.5, (0, 255, 255), 3)
    else:
        cv2.putText(frame, 'Time Over!', (width // 2 - 150, height // 2),
                    cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 4)

    cv2.imshow('Hand Target Game', frame)
    if cv2.waitKey(5) &amp; 0xFF == 27:  # ESC 종료
        break

cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3979135858/76243a3c18bac183816f6e12d9b651ae/______2025_06_12_141637.png" />
         <pubDate>2025-06-12 05:18:11 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487698128</guid>
      </item>
      <item>
         <title>30115</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3487698534</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

# 초기화
mp_pose = mp.solutions.pose
mp_drawing = mp.solutions.drawing_utils
pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)

# 웹캠
cap = cv2.VideoCapture(0)

# 상태 변수
count = 0
hands_up = False  # 현재 손이 올라간 상태인지

while cap.isOpened():
    success, frame = cap.read()
    if not success:
        break

    # 이미지 전처리
    frame = cv2.flip(frame, 1)
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = pose.process(rgb_frame)

    if results.pose_landmarks:
        landmarks = results.pose_landmarks.landmark

        # 필요한 키포인트
        left_wrist = landmarks[mp_pose.PoseLandmark.LEFT_WRIST]
        right_wrist = landmarks[mp_pose.PoseLandmark.RIGHT_WRIST]
        left_shoulder = landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER]
        right_shoulder = landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER]

        h, w, _ = frame.shape

        # y좌표 추출 (작을수록 위쪽)
        lw_y = left_wrist.y
        rw_y = right_wrist.y
        ls_y = left_shoulder.y
        rs_y = right_shoulder.y

        # 둘 중 한 손이라도 어깨보다 위로 올라갔는지 확인
        is_hand_up = lw_y &lt; ls_y or rw_y &lt; rs_y

        # 상태 변화 감지 → 손을 내렸다가 다시 들었을 때만 카운트 증가
        if is_hand_up and not hands_up:
            count += 1
            hands_up = True
        elif not is_hand_up and hands_up:
            hands_up = False

        # 포즈 시각화
        mp_drawing.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)

    # 카운트 표시
    cv2.putText(frame, f'Count: {count}', (50, 100), cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 0, 0), 5)

    # 창 표시
    cv2.imshow('Hand Raise Game', frame)
    if cv2.waitKey(5) &amp; 0xFF == 27:  # ESC 키
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-06-12 05:18:27 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487698534</guid>
      </item>
      <item>
         <title>30413 성준기</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3487706735</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import pygame
import random
import time

pygame.init()
screen_width, screen_height = 900, 700
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("청기백기 포즈 인식 게임")
font = pygame.font.SysFont('malgungothic', 28)

start_button = pygame.Rect(350, 200, 200, 50)
desc_button = pygame.Rect(350, 300, 200, 50)
quit_button = pygame.Rect(350, 400, 200, 50)

mp_pose = mp.solutions.pose
pose = mp_pose.Pose(min_detection_confidence=0.5, min_tracking_confidence=0.5)

game_state = "Menu"
level = 1
target_score = 50
score = 0
game_time = 30
target_pose = None
pose_start_time = 0
start_time = 0
pose_list = ["청기 올려", "백기 올려", "내려"]
show_levelup_msg = False
levelup_msg_time = 0

cap = cv2.VideoCapture(0)

blue_flag_img = pygame.image.load('blue_flag.png')
white_flag_img = pygame.image.load('white_flag.png')
blue_flag_img = pygame.transform.scale(blue_flag_img, (80, 80))
white_flag_img = pygame.transform.scale(white_flag_img, (80, 80))

def check_pose(landmarks, target):
    left_wrist = landmarks[mp_pose.PoseLandmark.LEFT_WRIST.value]
    right_wrist = landmarks[mp_pose.PoseLandmark.RIGHT_WRIST.value]
    nose = landmarks[mp_pose.PoseLandmark.NOSE.value]
    left_shoulder = landmarks[mp_pose.PoseLandmark.LEFT_SHOULDER.value]
    right_shoulder = landmarks[mp_pose.PoseLandmark.RIGHT_SHOULDER.value]
    
    if target == "청기 올려":
        if left_wrist.y &lt; nose.y:
            return True
    elif target == "백기 올려":
        if right_wrist.y &lt; nose.y:
            return True
    elif target == "내려":
        if left_wrist.y &gt; left_shoulder.y and right_wrist.y &gt; right_shoulder.y:
            return True
    return False

def draw_buttons():
    pygame.draw.rect(screen, (0, 200, 0), start_button)
    pygame.draw.rect(screen, (0, 0, 200), desc_button)
    pygame.draw.rect(screen, (200, 0, 0), quit_button)
    screen.blit(font.render("게임 시작", True, (255,255,255)), (start_button.x + 50, start_button.y + 10))
    screen.blit(font.render("게임 설명", True, (255,255,255)), (desc_button.x + 50, desc_button.y + 10))
    screen.blit(font.render("게임 종료", True, (255,255,255)), (quit_button.x + 50, quit_button.y + 10))

def draw_description():
    screen.fill((30, 30, 30))
    desc_lines = [
        "■ 게임 방법 ■",
        "1. 30초 안에 50점 이상 획득 시 다음 레벨로 이동합니다.",
        "2. 아래 지시에 따라 포즈를 취하세요:",
        " - 청기 올려: 왼손을 머리 위로 올리기",
        " - 백기 올려: 오른손을 머리 위로 올리기",
        " - 내려: 양손 어깨 아래로 내리기",
        "3. ESC 또는 Q 키로 언제든 종료 가능 (게임 중단 후 메뉴로 복귀)",
        "4. 한 판 종료 후 점수 표시, 점수는 계속 누적됩니다.",
        "ESC 또는 Q 키: 메뉴로 돌아가기"
    ]
    y = 50
    for line in desc_lines:
        rendered_text = font.render(line, True, (255,255,255))
        screen.blit(rendered_text, (50, y))
        y += 40

def show_final_score():
    screen.fill((0, 0, 0))
    msg = f"최종 점수: {score}점"
    txt = font.render(msg, True, (255, 255, 255))
    screen.blit(txt, (screen_width//2 - txt.get_width()//2, screen_height//2 - txt.get_height()//2))
    pygame.display.update()
    pygame.time.delay(3000)

def show_levelup():
    global show_levelup_msg, levelup_msg_time
    screen.fill((0, 0, 0))
    msg = f"레벨 {level} 달성! 축하합니다!"
    txt = font.render(msg, True, (255, 255, 0))
    screen.blit(txt, (screen_width//2 - txt.get_width()//2, screen_height//2 - txt.get_height()//2))
    pygame.display.update()
    levelup_msg_time = time.time()
    show_levelup_msg = True

def reset_game_vars():
    global score, start_time, target_pose, pose_start_time, game_over, show_levelup_msg
    score = 0
    start_time = time.time()
    target_pose = random.choice(pose_list)
    pose_start_time = time.time()
    game_over = False
    show_levelup_msg = False

running = True
while running:
    screen.fill((50, 50, 50))
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False

        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_ESCAPE or event.key == pygame.K_q:
                if game_state == "Description":
                    game_state = "Menu"
                elif game_state == "Game":
                    # 게임 중단 -&gt; 점수 보여주고 메뉴 복귀
                    show_final_score()
                    game_state = "Menu"
                else:
                    running = False

        if event.type == pygame.MOUSEBUTTONDOWN:
            if start_button.collidepoint(event.pos):
                # 게임 시작 (레벨 유지, 점수 누적, 시간 초기화)
                game_state = "Game"
                start_time = time.time()
                target_pose = random.choice(pose_list)
                pose_start_time = time.time()
                show_levelup_msg = False
            elif desc_button.collidepoint(event.pos):
                game_state = "Description"
            elif quit_button.collidepoint(event.pos):
                # 게임 종료 버튼 클릭하면 완전 종료
                running = False

    if game_state == "Menu":
        draw_buttons()

    elif game_state == "Description":
        draw_description()

    elif game_state == "Game":
        ret, frame = cap.read()
        if not ret:
            continue
        frame = cv2.flip(frame, 1)
        rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        results = pose.process(rgb_frame)

        frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        frame_rgb = cv2.resize(frame_rgb, (400, 300))
        frame_surface = pygame.surfarray.make_surface(frame_rgb.swapaxes(0,1))
        screen.blit(frame_surface, (250, 50))

        if results.pose_landmarks:
            if check_pose(results.pose_landmarks.landmark, target_pose):
                score += 1
                target_pose = random.choice(pose_list)
                pose_start_time = time.time()

            left_wrist = results.pose_landmarks.landmark[mp_pose.PoseLandmark.LEFT_WRIST.value]
            right_wrist = results.pose_landmarks.landmark[mp_pose.PoseLandmark.RIGHT_WRIST.value]
            h, w = 300, 400
            left_pos = (int(left_wrist.x * w) + 250, int(left_wrist.y * h) + 50)
            right_pos = (int(right_wrist.x * w) + 250, int(right_wrist.y * h) + 50)
            screen.blit(blue_flag_img, left_pos)
            screen.blit(white_flag_img, right_pos)

        elapsed = int(time.time() - start_time)
        remaining = max(0, game_time - elapsed)

        info_texts = [
            f"레벨: {level}",
            f"점수: {score}점",
            f"남은 시간: {remaining}초",
            f"동작: {target_pose}"
        ]

        box_x, box_y = 50, 380
        box_width, box_height = 200, 180
        pygame.draw.rect(screen, (0, 0, 0), (box_x, box_y, box_width, box_height))
        pygame.draw.rect(screen, (255, 255, 255), (box_x, box_y, box_width, box_height), 2)

        line_height = 40
        for i, text in enumerate(info_texts):
            rendered_text = font.render(text, True, (255, 255, 0))
            text_rect = rendered_text.get_rect(center=(box_x + box_width//2, box_y + line_height//2 + i*line_height))
            screen.blit(rendered_text, text_rect)

        if show_levelup_msg:
            # 레벨업 메시지 2초간 보여주기
            if time.time() - levelup_msg_time &gt; 2:
                show_levelup_msg = False
            else:
                show_levelup()

        else:
            if remaining &lt;= 0:
                if score &gt;= target_score:
                    # 레벨업 (점수 누적 유지, 레벨 증가)
                    level += 1
                    target_score += 50
                    start_time = time.time()
                    show_levelup()
                else:
                    # 점수 부족 -&gt; 게임 종료 (점수 보여주고 메뉴로)
                    show_final_score()
                    game_state = "Menu"

    pygame.display.update()

cap.release()
pygame.quit()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3979118880/ca4e18b728264b51f8606710f006a999/image.png" />
         <pubDate>2025-06-12 05:23:25 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3487706735</guid>
      </item>
      <item>
         <title></title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3488725419</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://youtu.be/25oC5egJ8tk?si=VJvfVcOT9x3mxh0w" />
         <pubDate>2025-06-13 01:00:09 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3488725419</guid>
      </item>
      <item>
         <title>POSE</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3488732811</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://youtu.be/PqaMc2CwJeY?si=vP2IyKNEvreUp1ic&amp;t=14" />
         <pubDate>2025-06-13 01:04:33 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3488732811</guid>
      </item>
      <item>
         <title>미디어 파이프 비전 실습 소감 작성 설문입니다. (최종)</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3488842134</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://forms.gle/pLGjc6EFghVmCqhj7" />
         <pubDate>2025-06-13 02:05:43 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3488842134</guid>
      </item>
      <item>
         <title>30924이원준과 31022임정우의 레전드합작</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3488921222</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3984429771/b225ed58b2164fd780f8d454c7d502bb/IMG_3835.jpeg" />
         <pubDate>2025-06-13 02:47:40 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3488921222</guid>
      </item>
      <item>
         <title>31001 김동연</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3488925170</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import numpy as np

mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

def get_gesture(hand_landmarks):
    fingers = []

    if hand_landmarks.landmark[4].x &gt; hand_landmarks.landmark[3].x:
        fingers.append(1)
    else:
        fingers.append(0)

    for tip_id in [8, 12, 16, 20]:
        tip_y = hand_landmarks.landmark[tip_id].y
        pip_y = hand_landmarks.landmark[tip_id - 2].y
        if tip_y &lt; pip_y:
            fingers.append(1)
        else:
            fingers.append(0)

    if sum(fingers) == 0:
        return "rock"
    elif sum(fingers) == 5:
        return "paper"
    elif fingers[1] == 1 and fingers[2] == 1 and fingers[0] == 0 and fingers[3] == 0 and fingers[4] == 0:
        return "scissors"
    else:
        return "unknown"

def decide_winner(gesture_left, gesture_right):
    if gesture_left == gesture_right:
        return "Draw!"
    if (gesture_left == "rock" and gesture_right == "scissors") or \
       (gesture_left == "scissors" and gesture_right == "paper") or \
       (gesture_left == "paper" and gesture_right == "rock"):
        return "Left"
    elif gesture_right in ["rock", "paper", "scissors"]:
        return "Right"
    else:
        return None

def draw_star(img, center, size=40, color=(0, 255, 255), thickness=2):
    """
    중심점(center)에 별을 그립니다.
    size는 별 크기 조절
    """
    pts = []
    for i in range(5):
        angle = i * 72 * np.pi / 180 - np.pi / 2  # 5각 별 각도
        x_outer = int(center[0] + size * np.cos(angle))
        y_outer = int(center[1] + size * np.sin(angle))
        pts.append((x_outer, y_outer))

        angle_inner = angle + 36 * np.pi / 180
        x_inner = int(center[0] + size / 2 * np.cos(angle_inner))
        y_inner = int(center[1] + size / 2 * np.sin(angle_inner))
        pts.append((x_inner, y_inner))
    
    pts = np.array(pts, np.int32).reshape((-1,1,2))
    cv2.polylines(img, [pts], isClosed=True, color=color, thickness=thickness)

cap = cv2.VideoCapture(0)

with mp_hands.Hands(max_num_hands=2, min_detection_confidence=0.7) as hands:
    while True:
        ret, frame = cap.read()
        if not ret:
            break
        
        frame = cv2.flip(frame, 1)
        img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        results = hands.process(img_rgb)

        gesture_left = None
        gesture_right = None
        left_hand_landmarks = None
        right_hand_landmarks = None

        if results.multi_hand_landmarks and results.multi_handedness:
            for hand_landmarks, handedness in zip(results.multi_hand_landmarks, results.multi_handedness):
                label = handedness.classification[0].label
                gesture = get_gesture(hand_landmarks)

                if label == "Left":
                    gesture_left = gesture
                    left_hand_landmarks = hand_landmarks
                elif label == "Right":
                    gesture_right = gesture
                    right_hand_landmarks = hand_landmarks
                
                mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
                x0 = int(hand_landmarks.landmark[0].x * frame.shape[1])
                y0 = int(hand_landmarks.landmark[0].y * frame.shape[0])
                cv2.putText(frame, f"{label}: {gesture}", (x0, y0 - 20),
                            cv2.FONT_HERSHEY_SIMPLEX, 1, (255,255,0), 2)

            winner = decide_winner(gesture_left, gesture_right)
            if winner == "Left" and left_hand_landmarks is not None:
                x = int(left_hand_landmarks.landmark[0].x * frame.shape[1])
                y = int(left_hand_landmarks.landmark[0].y * frame.shape[0])
                draw_star(frame, (x, y))
                cv2.putText(frame, "Left hand wins!", (30, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 3)
            elif winner == "Right" and right_hand_landmarks is not None:
                x = int(right_hand_landmarks.landmark[0].x * frame.shape[1])
                y = int(right_hand_landmarks.landmark[0].y * frame.shape[0])
                draw_star(frame, (x, y))
                cv2.putText(frame, "Right hand wins!", (30, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 3)
            elif winner is None:
                cv2.putText(frame, "Cannot decide winner", (30, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 2)
            else:
                cv2.putText(frame, "Draw!", (30, 100), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 255, 255), 2)
        else:
            cv2.putText(frame, "No hands detected", (30, 100), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)

        cv2.imshow("Rock-Paper-Scissors with MediaPipe", frame)

        if cv2.waitKey(1) &amp; 0xFF == 27:
            break

cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3984365565/337f60c9f9d49570974989eca52bcc73/image.png" />
         <pubDate>2025-06-13 02:49:28 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3488925170</guid>
      </item>
      <item>
         <title></title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3488955431</link>
         <description><![CDATA[<pre><code class="language-python">import tkinter as tk
from PIL import Image, ImageTk
import cv2
import mediapipe as mp
import time

class MouthBubbleApp:
    def __init__(self, root):
        self.root = root
        self.root.title("입 벌림 감지 비눗방울")

        self.width, self.height = 640, 480

        # 캔버스 생성
        self.canvas = tk.Canvas(root, width=self.width, height=self.height)
        self.canvas.pack()

        # 카메라 초기화
        self.cap = cv2.VideoCapture(0)
        if not self.cap.isOpened():
            raise RuntimeError("웹캠을 열 수 없습니다.")
        self.cap.set(cv2.CAP_PROP_FRAME_WIDTH, self.width)
        self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT, self.height)

        # Mediapipe 얼굴 인식 초기화
        self.mp_face_mesh = mp.solutions.face_mesh
        self.face_mesh = self.mp_face_mesh.FaceMesh(static_image_mode=False,
                                                    max_num_faces=1,
                                                    refine_landmarks=True,
                                                    min_detection_confidence=0.5,
                                                    min_tracking_confidence=0.5)

        self.drawing_spec = mp.solutions.drawing_utils.DrawingSpec(thickness=1, circle_radius=1)

        # 비눗방울 리스트
        self.bubbles = []

        # 입 상태 추적
        self.mouth_open = False

        # 이전 입 벌림 시간 체크 (버튼 누름처럼 입 벌리고 닫힌 순간 체크)
        self.last_mouth_open_time = 0

        # 업데이트 시작
        self.update_frame()

        self.root.protocol("WM_DELETE_WINDOW", self.on_closing)

    def update_frame(self):
        ret, frame = self.cap.read()
        if not ret:
            self.root.after(10, self.update_frame)
            return

        frame = cv2.flip(frame, 1)  # 좌우 반전 (셀카 모드)
        rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

        results = self.face_mesh.process(rgb_frame)

        mouth_open_now = False

        if results.multi_face_landmarks:
            face_landmarks = results.multi_face_landmarks[0]

            # 입 랜드마크 좌표 (mediapipe face_mesh 입 주변 점)
            # 윗입술: 13 (13번), 아랫입술: 14 (14번)
            # mediapipe face mesh 참고 https://github.com/google/mediapipe/blob/master/docs/solutions/face_mesh.md
            # 정확히는 13과 14번은 inner lips vertical middle landmarks

            h, w, _ = frame.shape

            top_lip = face_landmarks.landmark[13]
            bottom_lip = face_landmarks.landmark[14]

            top_lip_y = top_lip.y * h
            bottom_lip_y = bottom_lip.y * h

            mouth_distance = bottom_lip_y - top_lip_y

            # print("mouth_distance:", mouth_distance)  # 참고용

            # 임계값 (입 벌렸다고 판단할 기준, 카메라 환경마다 조절 가능)
            MOUTH_OPEN_THRESHOLD = 15

            if mouth_distance &gt; MOUTH_OPEN_THRESHOLD:
                mouth_open_now = True

        # 입 벌림 상태가 이전과 달라졌을 때 이벤트 발생
        current_time = time.time()
        if mouth_open_now and not self.mouth_open:
            # 입 벌림 시작
            self.mouth_open = True

        elif not mouth_open_now and self.mouth_open:
            # 입 닫힘 감지 → 비눗방울 생성
            self.mouth_open = False
            # 비눗방울을 입 위치 근처에 생성
            if results.multi_face_landmarks:
                # 입 위치 (중앙)
                cx = int((face_landmarks.landmark[13].x + face_landmarks.landmark[14].x) / 2 * w)
                cy = int((face_landmarks.landmark[13].y + face_landmarks.landmark[14].y) / 2 * h)
                self.create_bubble(cx, cy)

        # 이미지 변환 및 Tkinter에 출력
        img = Image.fromarray(rgb_frame)
        self.photo = ImageTk.PhotoImage(image=img)

        if hasattr(self, 'image_on_canvas'):
            self.canvas.itemconfig(self.image_on_canvas, image=self.photo)
        else:
            self.image_on_canvas = self.canvas.create_image(0, 0, image=self.photo, anchor=tk.NW)

        self.update_bubbles()

        self.root.after(15, self.update_frame)

    def create_bubble(self, x, y):
        r = 20
        bubble = self.canvas.create_oval(x - r, y - r, x + r, y + r,
                                         fill='lightblue', outline='white', width=2)
        self.bubbles.append([bubble, 0])

    def update_bubbles(self):
        remove_list = []
        for bubble_info in self.bubbles:
            bubble_id, step = bubble_info
            if step &gt; 20:
                self.canvas.delete(bubble_id)
                remove_list.append(bubble_info)
                continue

            self.canvas.move(bubble_id, 0, -5)
            bubble_info[1] += 1

        for bubble_info in remove_list:
            self.bubbles.remove(bubble_info)

    def on_closing(self):
        if self.cap.isOpened():
            self.cap.release()
        self.root.destroy()

if __name__ == "__main__":
    root = tk.Tk()
    app = MouthBubbleApp(root)
    root.mainloop()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3984346502/4923b0ffb2220bd2d1a6d5957d86c44e/image.png" />
         <pubDate>2025-06-13 03:04:52 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3488955431</guid>
      </item>
      <item>
         <title>30728 한태민</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3488960609</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3984544312/4849442e00caa0f7399ffeba804b792b/_____2025_06_13_122355.png" />
         <pubDate>2025-06-13 03:07:27 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3488960609</guid>
      </item>
      <item>
         <title>30818 이승민</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3488979077</link>
         <description><![CDATA[<p>import cv2</p><p>import mediapipe as mp</p><p>import math</p><p>mp_hands = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.hands</p><p>mp_drawing = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.drawing_utils</p><p>hands = mp_hands.Hands(</p><p>    static_image_mode=False,</p><p>    max_num_hands=2,</p><p>    min_detection_confidence=0.7,</p><p>    min_tracking_confidence=0.5</p><p>)</p><p>def calculate_angle(a, b, c):</p><p>    ba = (a[0]-b[0], a[1]-b[1])</p><p>    bc = (c[0]-b[0], c[1]-b[1])</p><p>    dot_product = ba[0]*bc[0] + ba[1]*bc[1]</p><p>    mag_ba = math.sqrt(ba[0]**2 + ba[1]**2)</p><p>    mag_bc = math.sqrt(bc[0]**2 + bc[1]**2)</p><p>    if mag_ba * mag_bc == 0:</p><p>        return 0</p><p>    cos_angle = dot_product / (mag_ba * mag_bc)</p><p>    cos_angle = max(min(cos_angle, 1), -1)</p><p>    angle = math.acos(cos_angle)</p><p>    return math.degrees(angle)</p><p> is_back_of_hand_facing(hand_landmarks, h):</p><p>    thumb_mcp_y = hand_landmarks.landmark[2].y * h</p><p>    pinky_mcp_y = hand_landmarks.landmark[17].y * h</p><p>    return pinky_mcp_y &lt; thumb_mcp_y </p><p>def is_finger_open_angle(hand_landmarks, tip_id, pip_id, mcp_id, w, h):</p><p>    tip = hand_landmarks.landmark[tip_id]</p><p>    pip = hand_landmarks.landmark[pip_id]</p><p>    mcp = hand_landmarks.landmark[mcp_id]</p><p>    tip_c = (tip.x <em> w, tip.y </em> h)</p><p>    pip_c = (pip.x <em> w, pip.y </em> h)</p><p>    mcp_c = (mcp.x <em> w, mcp.y </em> h)</p><p>    angle = calculate_angle(tip_c, pip_c, mcp_c)</p><p>    return angle &gt; 160 </p><p>def get_finger_states(hand_landmarks, w, h):</p><p>    back_of_hand_facing = is_back_of_hand_facing(hand_landmarks, h)</p><p>    if not back_of_hand_facing:</p><p>        return None  </p><p>    fingers = []</p><p>    </p><p>    fingers.append(is_finger_open_angle(hand_landmarks, 4, 3, 2, w, h))   # 엄지</p><p>    fingers.append(is_finger_open_angle(hand_landmarks, 8, 6, 5, w, h))   # 검지</p><p>    fingers.append(is_finger_open_angle(hand_landmarks, 12, 10, 9, w, h)) # 중지</p><p>    fingers.append(is_finger_open_angle(hand_landmarks, 16, 14, 13, w, h))# 약지</p><p>    fingers.append(is_finger_open_angle(hand_landmarks, 20, 18, 17, w, h))# 새끼</p><p>    return fingers</p><p>def detect_hand_gesture(fingers):</p><p>    if fingers == [False, False, False, False, False]:</p><p>        return "Rock"</p><p>    elif fingers == [False, True, True, False, False]:</p><p>        return "Scissors"</p><p>    elif all(fingers):</p><p>        return "Paper"</p><p>    else:</p><p>        return "Unknown"</p><p>def main():</p><p>    cap = cv2.VideoCapture(0)</p><p>    while True:</p><p>        success, frame = <a rel="noopener noreferrer nofollow" href="http://cap.read">cap.read</a>()</p><p>        if not success:</p><p>            break</p><p>        frame = cv2.flip(frame, 1)</p><p>        h, w, _ = frame.shape</p><p>        image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)</p><p>        result = hands.process(image_rgb)</p><p>        if result.multi_hand_landmarks:</p><p>            for hand_landmarks in result.multi_hand_landmarks:</p><p>                mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)</p><p>                fingers = get_finger_states(hand_landmarks, w, h)</p><p>                if fingers is not None:</p><p>                    gesture = detect_hand_gesture(fingers)</p><p>                    cv2.putText(frame, f"Gesture: {gesture}", (10, 50),</p><p>                                cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 0, 0), 2)</p><p>        cv2.imshow("Rock Paper Scissors Gesture (Back of Hand)", frame)</p><p>        if cv2.waitKey(1) &amp; 0xFF == 27:</p><p>            break</p><p>    cap.release()</p><p>    cv2.destroyAllWindows()</p><p>if <strong>name</strong> == "__main__":</p><p>    main()</p><p><br></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3984388739/b187ed3ead87e6f3eacb07705567164f/______2025_06_13_121509.png" />
         <pubDate>2025-06-13 03:16:57 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3488979077</guid>
      </item>
      <item>
         <title>30922 염준현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3488980381</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3984369015/482d0006a3f3d23e2a0f14933866b824/capture.png" />
         <pubDate>2025-06-13 03:17:46 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3488980381</guid>
      </item>
      <item>
         <title>30729 홍세윤</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3488980470</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import math

# MediaPipe Hands 초기화
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

# 손의 마디 번호를 화면에 표시하는 함수
def draw_landmark_numbers(frame, hand_landmarks):
    h, w, _ = frame.shape
    for idx, landmark in enumerate(hand_landmarks.landmark):
        cx, cy = int(landmark.x * w), int(landmark.y * h)
        cv2.putText(frame, str(idx), (cx - 10, cy + 10),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 0, 0), 2)

# 손가락 간 거리 계산 함수
def distance(point1, point2):
    return math.sqrt((point1.x - point2.x)**2 + (point1.y - point2.y)**2)

# 'OK' 제스처 판별 함수
def is_ok_gesture(hand_landmarks):
    thumb_tip = hand_landmarks.landmark[4]
    index_tip = hand_landmarks.landmark[8]
    dist_thumb_index = distance(thumb_tip, index_tip)

    if dist_thumb_index &gt; 0.05:
        return False

    wrist = hand_landmarks.landmark[0]
    middle_tip = hand_landmarks.landmark[12]
    ring_tip = hand_landmarks.landmark[16]
    pinky_tip = hand_landmarks.landmark[20]

    dist_wrist_middle = distance(wrist, middle_tip)
    dist_wrist_ring = distance(wrist, ring_tip)
    dist_wrist_pinky = distance(wrist, pinky_tip)

    if dist_wrist_middle &lt; 0.3 or dist_wrist_ring &lt; 0.3 or dist_wrist_pinky &lt; 0.3:
        return False

    return True

# 웹캠 열기
cap = cv2.VideoCapture(0)

with mp_hands.Hands(max_num_hands=2, min_detection_confidence=0.7, min_tracking_confidence=0.7) as hands:
    while cap.isOpened():
        ret, frame = cap.read()
        if not ret:
            break

        frame = cv2.flip(frame, 1)
        img_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
        results = hands.process(img_rgb)

        ok_gesture_count = 0

        # 기존의 'OK!!' 문구를 지우기 위해 배경을 덮어씌움
        frame[:] = (0, 0, 0)

        if results.multi_hand_landmarks:
            for hand_landmarks in results.multi_hand_landmarks:
                if is_ok_gesture(hand_landmarks):
                    ok_gesture_count += 1

                # 손의 마디 번호 표시
                draw_landmark_numbers(frame, hand_landmarks)

                # 손 랜드마크 그리기
                mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)

        # 두 손 모두 'OK' 제스처를 하면 'Super OK!!'로 변경
        if ok_gesture_count == 2:
            cv2.putText(frame, 'Super OK!!', (50, 200),
                        cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 255), 5)
        elif ok_gesture_count == 1:
            cv2.putText(frame, 'OK!!', (50, 100),
                        cv2.FONT_HERSHEY_SIMPLEX, 3, (0, 255, 0), 5)

        cv2.imshow('Hand Gesture Recognition', frame)

        if cv2.waitKey(1) &amp; 0xFF == 27:
            break

cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3984446652/c28093e4acc2eaff5f061c35e3951c00/super_ok.png" />
         <pubDate>2025-06-13 03:17:50 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3488980470</guid>
      </item>
      <item>
         <title>공룡 핸드  run -홍길동</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3489144839</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import pyautogui
import math
import time

# Mediapipe 초기화
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands=1)
mp_draw = mp.solutions.drawing_utils

def calculate_distance(pt1, pt2):
    return math.hypot(pt2[0] - pt1[0], pt2[1] - pt1[1])

cap = cv2.VideoCapture(0)
#cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
#cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)

last_jump_time = 0
cooldown = 1.0  # 점프 간 최소 간격 (초)

while True:
    success, img = cap.read()
    if not success:
        break
    img=cv2.flip(img,1)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    result = hands.process(img_rgb)
    current_time = time.time()

    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            lmList = []
            h, w, _ = img.shape
            for lm in handLms.landmark:
                cx, cy = int(lm.x * w), int(lm.y * h)
                lmList.append((cx, cy))

            if len(lmList) &gt;= 9:
                thumb_tip = lmList[4]
                index_tip = lmList[8]

                # 손끝에 작은 연두색 점 표시
                cv2.circle(img, thumb_tip, 5, (0, 255, 0), cv2.FILLED)
                cv2.circle(img, index_tip, 5, (0, 255, 0), cv2.FILLED)

                # 엄지와 검지 사이 연결선 표시 (파란색)
                cv2.line(img, thumb_tip, index_tip, (255, 0, 0), 2)

                # 거리 계산 및 점프 처리
                distance = calculate_distance(thumb_tip, index_tip)
                if distance &lt; 30 :
                    mid_x = (thumb_tip[0] + index_tip[0]) // 2
                    mid_y = (thumb_tip[1] + index_tip[1]) // 2
                    cv2.circle(img, (mid_x, mid_y), 15, (0, 0, 255), cv2.FILLED)

                    pyautogui.press('space')
                    last_jump_time = current_time

    cv2.imshow("Jump with Gesture", img)
    if cv2.waitKey(1) &amp; 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/483229584/c82d2f071cae526c24cb5d2e98be6600/image.png" />
         <pubDate>2025-06-13 05:27:39 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3489144839</guid>
      </item>
      <item>
         <title>30707 김민재</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3489254727</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import random
import time

# Mediapipe 초기화
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

hands = mp_hands.Hands(
    static_image_mode=False,
    max_num_hands=1,
    min_detection_confidence=0.7,
    min_tracking_confidence=0.5
)

cap = cv2.VideoCapture(0)

# 게임 타이머 설정
GAME_TIME = 30  # 30초 제한
start_time = time.time()

# 초기 타겟 설정
target_radius = 40
target_x, target_y = random.randint(100, 500), random.randint(100, 400)
score = 0
last_target_time = time.time()
target_interval = 2  # 초

game_over = False

# 손가락 위치 스무딩 관련 변수
prev_cx, prev_cy = None, None
smooth_factor = 0.7  # 부드럽게 만들기 위한 가중치

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    current_time = time.time()
    elapsed_time = current_time - start_time
    remaining_time = max(0, int(GAME_TIME - elapsed_time))

    if remaining_time == 0:
        game_over = True

    frame = cv2.flip(frame, 1)
    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(image_rgb)

    h, w, _ = frame.shape

    if not game_over:
        # 타겟 위치 갱신
        if time.time() - last_target_time &gt; target_interval:
            target_x, target_y = random.randint(100, w - 100), random.randint(100, h - 100)
            last_target_time = time.time()

        # 타겟 그리기
        cv2.circle(frame, (target_x, target_y), target_radius, (0, 255, 0), -1)
        cv2.putText(frame, "Touch!", (target_x - 20, target_y - 50),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 200, 0), 2)

        if result.multi_hand_landmarks:
            for hand_landmarks in result.multi_hand_landmarks:
                index_finger = hand_landmarks.landmark[8]  # 검지 끝
                raw_cx, raw_cy = int(index_finger.x * w), int(index_finger.y * h)

                # 스무딩 적용
                if prev_cx is not None and prev_cy is not None:
                    cx = int(prev_cx * smooth_factor + raw_cx * (1 - smooth_factor))
                    cy = int(prev_cy * smooth_factor + raw_cy * (1 - smooth_factor))
                else:
                    cx, cy = raw_cx, raw_cy

                prev_cx, prev_cy = cx, cy

                # 검지 위치 시각화
                cv2.circle(frame, (cx, cy), 10, (255, 0, 0), -1)

                # 타겟과 거리 계산
                distance = ((cx - target_x) ** 2 + (cy - target_y) ** 2) ** 0.5
                if distance &lt; target_radius:
                    score += 1
                    target_x, target_y = random.randint(100, w - 100), random.randint(100, h - 100)
                    last_target_time = time.time()
                    prev_cx, prev_cy = None, None  # 타겟 갱신 시 초기화

    # 시간 및 점수 표시
    cv2.putText(frame, f"Time: {remaining_time}", (10, 40),
                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 3)
    cv2.putText(frame, f"Score: {score}", (10, 90),
                cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 3)

    if game_over:
        cv2.putText(frame, "Game Over!", (w // 2 - 150, h // 2),
                    cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 5)

    cv2.imshow("30-Second Touch Game", frame)
    if cv2.waitKey(1) &amp; 0xFF == 27:  # ESC
        break

cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3985481794/9eb09474f9d850bd5d171f13174608a0/_____2025_06_13_155603.png" />
         <pubDate>2025-06-13 06:57:08 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3489254727</guid>
      </item>
      <item>
         <title>30707 김민재</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3489261987</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3985575293/72fb30df7c0dcbfe11f1a0b92994f7da/_____2025_06_13_160256.png" />
         <pubDate>2025-06-13 07:03:24 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3489261987</guid>
      </item>
      <item>
         <title>30110 박진수</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3489272430</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

# MediaPipe 초기화
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils

hands = mp_hands.Hands(
    static_image_mode=False,
    max_num_hands=4,
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5
)

# 손가락 개수 세는 함수 (손등/손바닥 인식 개선)
def count_fingers(lm, handedness):
    fingers = []

    # 손가락 끝과 중간 마디 비교
    tips_ids = [8, 12, 16, 20]
    for tip in tips_ids:
        if lm.landmark[tip].y &lt; lm.landmark[tip - 2].y:
            fingers.append(1)
        else:
            fingers.append(0)

    # 엄지는 x 좌표 기준으로 방향 감안
    if handedness == 'Right':
        fingers.insert(0, int(lm.landmark[4].x &gt; lm.landmark[3].x))
    else:
        fingers.insert(0, int(lm.landmark[4].x &lt; lm.landmark[3].x))

    return sum(fingers)

# 플레이어 상태 초기화
players = {
    'Player1': {'left': 1, 'right': 1},
    'Player2': {'left': 1, 'right': 1}
}
turn = 'Player1'

# 손 좌우로 플레이어 식별
def identify_player(x_norm):
    return 'Player1' if x_norm &lt; 0.5 else 'Player2'

# 공격 감지용 상태
attack_done = False

# 웹캠 시작
cap = cv2.VideoCapture(0)

while cap.isOpened():
    success, frame = cap.read()
    if not success:
        break

    frame = cv2.flip(frame, 1)
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = hands.process(rgb)

    h, w, _ = frame.shape
    hand_data = {
        'Player1': {},
        'Player2': {}
    }

    if results.multi_hand_landmarks and results.multi_handedness:
        for lm, handedness_data in zip(results.multi_hand_landmarks, results.multi_handedness):
            handedness = handedness_data.classification[0].label  # 'Left' or 'Right'
            player = identify_player(lm.landmark[0].x)
            fingers = count_fingers(lm, handedness)

            hand_data[player][handedness] = fingers

            mp_drawing.draw_landmarks(frame, lm, mp_hands.HAND_CONNECTIONS)

            # 디버깅용 손가락 수 표시
            cx, cy = int(lm.landmark[0].x * w), int(lm.landmark[0].y * h)
            cv2.putText(frame, f'{player} {handedness}: {fingers}', (cx - 50, cy - 30),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.7, (255, 255, 0), 2)

    # 공격 로직 (Left가 공격한다고 가정)
    if not attack_done:
        attacker = turn
        defender = 'Player2' if attacker == 'Player1' else 'Player1'

        if 'Left' in hand_data[attacker] and 'Left' in hand_data[defender]:
            attack_val = hand_data[attacker]['Left']
            defend_val = players[defender]['left']

            result_val = (attack_val + defend_val) % 5
            players[defender]['left'] = result_val

            print(f"{attacker} attacks {defender}'s LEFT: {attack_val} + {defend_val} = {result_val}")
            attack_done = True
            turn = defender  # 턴 전환

    # 공격 후 손 내려야 다시 공격 가능
    if not any(hand_data[turn].values()):
        attack_done = False  # 손 다 내리면 초기화

    # 점수 표시
    cv2.putText(frame, f"{turn}'s Turn", (10, 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (100, 255, 255), 2)
    cv2.putText(frame, f"P1 L:{players['Player1']['left']} R:{players['Player1']['right']}", (10, h - 60),
                cv2.FONT_HERSHEY_SIMPLEX, 0.9, (255, 150, 150), 2)
    cv2.putText(frame, f"P2 L:{players['Player2']['left']} R:{players['Player2']['right']}", (10, h - 30),
                cv2.FONT_HERSHEY_SIMPLEX, 0.9, (150, 255, 150), 2)

    cv2.imshow("Chopstick Game", frame)

    if cv2.waitKey(5) &amp; 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3985435344/54148c4160e875926c05fa46e9b70658/___.png" />
         <pubDate>2025-06-13 07:13:32 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3489272430</guid>
      </item>
      <item>
         <title>30911 박규현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3489272957</link>
         <description><![CDATA[<p>import cv2</p><p>import mediapipe as mp</p><p>import random</p><p>import math</p><p># MediaPipe 설정</p><p>mp_face = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.face_mesh</p><p>face_mesh = mp_face.FaceMesh(max_num_faces=1)</p><p># 초기화</p><p>width, height = 640, 480</p><p>score = 0</p><p>target_score = 15</p><p># 아이템 리스트 (사과 + 함정)</p><p>objects = [</p><p>    {"type": "apple", "pos": [random.randint(100, 500), 0], "speed": 5},</p><p>    {"type": "bad", "pos": [random.randint(100, 500), -200], "speed": 5}</p><p>]</p><p>apple_radius = 20</p><p># 충돌 판정</p><p>def is_collision(obj_pos, mouth_pos):</p><p>    ox, oy = obj_pos</p><p>    mx, my = mouth_pos</p><p>    distance = math.hypot(ox - mx, oy - my)</p><p>    return distance &lt; apple_radius + 20</p><p># 웹캠</p><p>cap = cv2.VideoCapture(0)</p><p>while True:</p><p>    ret, frame = <a rel="noopener noreferrer nofollow" href="http://cap.read">cap.read</a>()</p><p>    if not ret:</p><p>        break</p><p>    frame = cv2.flip(frame, 1)</p><p>    h, w, _ = frame.shape</p><p>    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)</p><p>    result = face_mesh.process(rgb)</p><p>    mouth_pos = None</p><p>    if result.multi_face_landmarks:</p><p>        for face_landmarks in result.multi_face_landmarks:</p><p>            lm = face_landmarks.landmark[13]</p><p>            mx, my = int(lm.x <em> w), int(lm.y </em> h)</p><p>            mouth_pos = (mx, my)</p><p>            <a rel="noopener noreferrer nofollow" href="http://cv2.circle">cv2.circle</a>(frame, mouth_pos, 8, (255, 0, 0), -1)</p><p>    # 오브젝트 이동 및 처리</p><p>    for obj in objects:</p><p>        obj["pos"][1] += int(obj["speed"])</p><p>        </p><p>        # 충돌 감지</p><p>        if mouth_pos and is_collision(obj["pos"], mouth_pos):</p><p>            if obj["type"] == "apple":</p><p>                score += 1</p><p>            else:</p><p>                score -= 1</p><p>            # 오브젝트 초기화</p><p>            obj["pos"] = [random.randint(50, w - 50), 0]</p><p>            obj["speed"] += 0.2</p><p>        # 바닥까지 떨어진 경우: 위치만 초기화</p><p>        if obj["pos"][1] &gt; h:</p><p>            obj["pos"] = [random.randint(50, w - 50), 0]</p><p>            obj["speed"] += 0.1</p><p>        # 그리기</p><p>        color = (0, 0, 255) if obj["type"] == "apple" else (0, 255, 255)</p><p>        <a rel="noopener noreferrer nofollow" href="http://cv2.circle">cv2.circle</a>(frame, tuple(obj["pos"]), apple_radius, color, -1)</p><p>    # 점수 표시</p><p>    cv2.putText(frame, f'Score: {score}', (10, 30),</p><p>                cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)</p><p>    # 승리 조건</p><p>    if score &gt;= target_score:</p><p>        cv2.putText(frame, 'You Win! 🎉', (150, 250),</p><p>                    cv2.FONT_HERSHEY_SIMPLEX, 1.5, (0, 255, 0), 4)</p><p>        cv2.imshow("Catch Game", frame)</p><p>        cv2.waitKey(2000)</p><p>        break</p><p>    # 화면 출력</p><p>    cv2.imshow("Catch Game", frame)</p><p>    if cv2.waitKey(1) &amp; 0xFF == 27:</p><p>        break</p><p>cap.release()</p><p>cv2.destroyAllWindows()</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3985477062/bc28dd041ec1342a843c96e3fc6f9ecd/__2.png" />
         <pubDate>2025-06-13 07:14:09 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3489272957</guid>
      </item>
      <item>
         <title>30811 송민재 . 자세교정</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3489276185</link>
         <description><![CDATA[<p>기능 : 이 코드는 웹캠으로 실시간 영상을 받아옴.<br>Mediapipe 포즈 추적 기능을 사용해 사람의 어깨, 엉덩이, 무릎 위치를 인식함.<br>엉덩이 각도를 계산해 허리가 구부정한지 판단함.<br>양쪽 어깨의 수평·수직 위치 차이를 측정해 어깨가 불균형한지 확인함.<br>허리가 구부정하거나 어깨가 비대칭이면 화면에 경고 메시지를 띄움.<br>포즈 랜드마크와 각도, 어깨 위치 차이를 실시간으로 화면에 표시함.<br>ESC 키 입력 시 프로그램을 종료함.</p><p><br></p><p>코드 : </p><pre><code class="language-python">import cv2
import mediapipe as mp
import math

mp_pose = mp.solutions.pose
pose = mp_pose.Pose(min_detection_confidence=0.7, min_tracking_confidence=0.7)
mp_drawing = mp.solutions.drawing_utils

WIDTH, HEIGHT = 640, 480

cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, WIDTH)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, HEIGHT)

def calculate_angle(a, b, c):
    ang = math.degrees(
        math.atan2(c[1] - b[1], c[0] - b[0]) -
        math.atan2(a[1] - b[1], a[0] - b[0])
    )
    ang = abs(ang)
    if ang &gt; 180:
        ang = 360 - ang
    return ang

while True:
    ret, frame = cap.read()
    if not ret:
        break
    frame = cv2.flip(frame, 1)
    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    results = pose.process(image_rgb)

    if results.pose_landmarks:
        mp_drawing.draw_landmarks(frame, results.pose_landmarks, mp_pose.POSE_CONNECTIONS)

        landmarks = results.pose_landmarks.landmark

        def get_coord(idx):
            return int(landmarks[idx].x * WIDTH), int(landmarks[idx].y * HEIGHT)

        left_shoulder = get_coord(mp_pose.PoseLandmark.LEFT_SHOULDER.value)
        right_shoulder = get_coord(mp_pose.PoseLandmark.RIGHT_SHOULDER.value)
        left_hip = get_coord(mp_pose.PoseLandmark.LEFT_HIP.value)
        left_knee = get_coord(mp_pose.PoseLandmark.LEFT_KNEE.value)

        hip_angle = calculate_angle(left_shoulder, left_hip, left_knee)

        messages = []
        if hip_angle &lt; 160:
            messages.append("Your back is slouched!")

        # 어깨 불균형 강화 기준
        shoulder_y_diff = abs(left_shoulder[1] - right_shoulder[1])  # 수직 차이
        shoulder_x_diff = abs(left_shoulder[0] - right_shoulder[0])  # 수평 차이

        vertical_threshold = 15  # 수직 차이 임계값 (픽셀)
        horizontal_threshold = 100  # 수평 차이 임계값 (픽셀)

        if shoulder_y_diff &gt; vertical_threshold or shoulder_x_diff &gt; horizontal_threshold:
            messages.append("Your shoulders are uneven!")

        y0 = 50
        for i, msg in enumerate(messages):
            cv2.putText(frame, msg, (30, y0 + i*40), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,0,255), 3)

        cv2.putText(frame, f"Hip angle: {int(hip_angle)}", (30, HEIGHT - 90), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255,255,255), 2)
        cv2.putText(frame, f"Shoulder Y diff: {int(shoulder_y_diff)} px", (30, HEIGHT - 60), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255,255,255), 2)
        cv2.putText(frame, f"Shoulder X diff: {int(shoulder_x_diff)} px", (30, HEIGHT - 30), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255,255,255), 2)

    cv2.imshow("Posture Correction", frame)
    if cv2.waitKey(1) &amp; 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3985478944/16e3d5a5caae85efe57367f1bcd44f10/Posture_Correction.png" />
         <pubDate>2025-06-13 07:17:54 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3489276185</guid>
      </item>
      <item>
         <title>30803 김대현 플래피버드(입 벌리면 나는 게임)</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3489277806</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import numpy as np
import random

mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh(static_image_mode=False,
                                  max_num_faces=1,
                                  min_detection_confidence=0.5,
                                  min_tracking_confidence=0.5,
                                  refine_landmarks=True)

cap = cv2.VideoCapture(0)

bird_x = 100
bird_y = 300
bird_velocity = 0
gravity = 0.7
jump_strength = -10

obstacles = []
obstacle_width = 60
gap_height = 230
frame_count = 0
score = 0
high_score = 0
game_over = False

prev_mouth_open = False

bird_radius = 18  # 공 크기 (반지름)

def calculate_mouth_opening(landmarks, image_width, image_height):
    top_lip = landmarks[13]
    bottom_lip = landmarks[14]
    top_lip_y = int(top_lip.y * image_height)
    bottom_lip_y = int(bottom_lip.y * image_height)
    return bottom_lip_y - top_lip_y

while True:
    ret, frame = cap.read()
    if not ret:
        break

    frame = cv2.flip(frame, 1)
    h, w, _ = frame.shape
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = face_mesh.process(rgb_frame)

    mouth_open = 0
    if results.multi_face_landmarks:
        for face_landmarks in results.multi_face_landmarks:
            landmarks = face_landmarks.landmark
            mouth_open = calculate_mouth_opening(landmarks, w, h)

    is_mouth_open = mouth_open &gt; 15

    if not game_over:
        if prev_mouth_open and not is_mouth_open:
            bird_velocity = jump_strength

        prev_mouth_open = is_mouth_open

        bird_velocity += gravity
        bird_y += bird_velocity

        # 바닥 닿으면 게임 오버
        if bird_y &gt; h - bird_radius:
            bird_y = h - bird_radius
            bird_velocity = 0
            game_over = True

        # 천장 닿으면 게임 오버
        if bird_y &lt; bird_radius:
            bird_y = bird_radius
            bird_velocity = 0
            game_over = True

        if frame_count % 90 == 0:
            hole_y = random.randint(100, h - 100 - gap_height)
            obstacles.append([w, hole_y, hole_y + gap_height])

        # 점수가 올라갈수록 장애물 속도 증가
        base_speed = 3
        speed_increase = score * 0.1
        obstacle_speed = base_speed + speed_increase

        for obs in obstacles:
            obs[0] -= obstacle_speed

        if obstacles and obstacles[0][0] &lt; -obstacle_width:
            obstacles.pop(0)
            score += 1

        bird_rect = (bird_x - bird_radius, int(bird_y) - bird_radius, bird_radius * 2, bird_radius * 2)

        def rect_collision(r1, r2):
            x1, y1, w1, h1 = r1
            x2, y2, w2, h2 = r2
            return not (x1 + w1 &lt; x2 or x1 &gt; x2 + w2 or y1 + h1 &lt; y2 or y1 &gt; y2 + h2)

        for obs in obstacles:
            x, hole_top, hole_bottom = obs
            top_rect = (x, 0, obstacle_width, hole_top)
            bottom_rect = (x, hole_bottom, obstacle_width, h - hole_bottom)
            if rect_collision(bird_rect, top_rect) or rect_collision(bird_rect, bottom_rect):
                game_over = True

        if game_over and score &gt; high_score:
            high_score = score

    frame[:] = (0, 0, 0)

    cv2.circle(frame, (bird_x, int(bird_y)), bird_radius, (0, 255, 255), -1)

    for obs in obstacles:
        x, hole_top, hole_bottom = obs
        cv2.rectangle(frame, (int(x), 0), (int(x) + obstacle_width, hole_top), (0, 255, 0), -1)
        cv2.rectangle(frame, (int(x), hole_bottom), (int(x) + obstacle_width, h), (0, 255, 0), -1)

    cv2.putText(frame, f'Score: {score}', (10, 50),
                cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 255, 255), 3)
    cv2.putText(frame, f'High Score: {high_score}', (10, 100),
                cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 255, 255), 2)

    if game_over:
        cv2.putText(frame, "Game Over! Press R to Restart", (50, h // 2),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 3)

    cv2.imshow('Flappy Bird Mouth Control', frame)

    key = cv2.waitKey(1) &amp; 0xFF
    if key == 27:
        break
    if game_over and (key == ord('r') or key == ord('R')):
        bird_y = 300
        bird_velocity = 0
        obstacles.clear()
        score = 0
        game_over = False
        frame_count = 0
        prev_mouth_open = False

    frame_count += 1

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3985522368/2837be5db3e8c36d0643a4ec49c753bb/image.png" />
         <pubDate>2025-06-13 07:19:29 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3489277806</guid>
      </item>
      <item>
         <title>30724 정진규</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3489279745</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import pygame
import sys
import math
import numpy as np

mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands=2, min_detection_confidence=0.7)
mp_draw = mp.solutions.drawing_utils

pygame.init()
WIDTH, HEIGHT = 640, 480
screen = pygame.display.set_mode((WIDTH, HEIGHT))
clock = pygame.time.Clock()

board_width, board_height = 300, 20
board_center = np.array([WIDTH//2, HEIGHT//2 + 100], dtype=float)
board_angle = 0
max_angle = 20

ball_radius = 15
ball_pos = np.array([WIDTH/2, HEIGHT/2], dtype=float)
ball_vel = np.array([0.0, 0.0], dtype=float)
gravity = 0.8

def draw_rotated_rect(surface, color, center, width, height, angle):
    rect = pygame.Surface((width, height), pygame.SRCALPHA)
    rect.fill(color)
    rotated = pygame.transform.rotate(rect, angle)
    rect_pos = rotated.get_rect(center=center)
    surface.blit(rotated, rect_pos)

def is_hand_closed(hand_landmarks):
    thumb_tip = hand_landmarks.landmark[4]
    index_tip = hand_landmarks.landmark[8]
    dist = math.sqrt((thumb_tip.x - index_tip.x)**2 + (thumb_tip.y - index_tip.y)**2)
    return dist &lt; 0.05

def get_hand_label(hand_landmark, handedness):
    return handedness.classification[0].label

def point_on_board(point, center, width, height, angle_deg):
    angle_rad = math.radians(-angle_deg)
    s = math.sin(angle_rad)
    c = math.cos(angle_rad)
    p = point - center
    x_new = p[0]*c - p[1]*s
    y_new = p[0]*s + p[1]*c
    return (-width/2 &lt;= x_new &lt;= width/2) and (-height/2 &lt;= y_new &lt;= height/2)

cap = cv2.VideoCapture(0)
if not cap.isOpened():
    print("카메라가 열리지 않습니다.")
    sys.exit()

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            cap.release()
            pygame.quit()
            sys.exit()

    ret, frame = cap.read()
    if not ret:
        print("프레임을 가져오지 못했습니다.")
        break

    frame = cv2.flip(frame, 1)
    rgb_frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = hands.process(rgb_frame)

    left_closed = False
    right_closed = False

    if results.multi_hand_landmarks and results.multi_handedness:
        for hand_landmarks, handedness in zip(results.multi_hand_landmarks, results.multi_handedness):
            label = get_hand_label(hand_landmarks, handedness)
            closed = is_hand_closed(hand_landmarks)
            if label == 'Left' and closed:
                left_closed = True
            if label == 'Right' and closed:
                right_closed = True
            mp_draw.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)

    # 판 각도 업데이트
    if left_closed and not right_closed:
        board_angle = max(board_angle - 1, -max_angle)
    elif right_closed and not left_closed:
        board_angle = min(board_angle + 1, max_angle)
    # else:
    #     if board_angle &gt; 0:
    #         board_angle -= 1
    #     elif board_angle &lt; 0:
    #         board_angle += 1

    # 공 물리 업데이트
    ball_vel[1] += gravity
    ball_pos += ball_vel

    if point_on_board(ball_pos, board_center, board_width, board_height, board_angle):
        angle_rad = math.radians(board_angle)
        dx = ball_pos[0] - board_center[0]
        board_y_at_ball_x = board_center[1] - dx * math.tan(angle_rad)

        ball_pos[1] = min(ball_pos[1], board_y_at_ball_x - ball_radius)

        if ball_vel[1] &gt; 0:
            ball_vel[1] = -ball_vel[1] * 0.3

        ball_vel[0] += gravity * math.sin(angle_rad)
        ball_vel[0] *= 1
    else:
        if ball_pos[1] &gt; HEIGHT:
            ball_pos = np.array([WIDTH / 2, HEIGHT / 2], dtype=float)
            ball_vel = np.array([0.0, 0.0], dtype=float)
            board_angle = 0

    screen.fill((30, 30, 30))
    draw_rotated_rect(screen, (200, 200, 200), board_center, board_width, board_height, board_angle)
    pygame.draw.circle(screen, (255, 50, 50), ball_pos.astype(int), ball_radius)

    pygame.display.flip()
    clock.tick(60)

    cv2.imshow("Hand Tracking", frame)
    if cv2.waitKey(1) &amp; 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
pygame.quit()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3985439508/d43a4b99a4c0d0574e761ad62e98c23b/image.png" />
         <pubDate>2025-06-13 07:21:26 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3489279745</guid>
      </item>
      <item>
         <title>30811 송민재 상처감지</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3489281458</link>
         <description><![CDATA[<p>기능 : 붉은색 및 검은색 기준을 통해 상처감지</p><p><br/></p><p>코드 : </p><pre><code class="language-python">import cv2
import numpy as np

# 웹캠 열기
cap = cv2.VideoCapture(0)

# 해상도 설정 (1920x1080)
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1920)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1080)

cv2.namedWindow("Wound Detection", cv2.WINDOW_NORMAL)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # HSV 변환
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)

    # 붉은색 범위 조정 (더 진한 색만 탐지)
    lower_red1 = np.array([0, 100, 100])
    upper_red1 = np.array([5, 255, 255])
    lower_red2 = np.array([170, 100, 100])
    upper_red2 = np.array([180, 255, 255])

    mask1 = cv2.inRange(hsv, lower_red1, upper_red1)
    mask2 = cv2.inRange(hsv, lower_red2, upper_red2)
    mask = mask1 + mask2

    # 노이즈 제거
    kernel = np.ones((5, 5), np.uint8)
    mask_clean = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel)
    mask_clean = cv2.morphologyEx(mask_clean, cv2.MORPH_CLOSE, kernel)

    # 윤곽선 검출
    contours, _ = cv2.findContours(mask_clean, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

    for cnt in contours:
        area = cv2.contourArea(cnt)
        if area &gt; 800:  # 작은 노이즈 제거
            x, y, w, h = cv2.boundingRect(cnt)
            cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 0, 255), 2)
            cv2.putText(frame, "Possible Wound", (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2)

    # 화면 출력
    cv2.imshow("Wound Detection", frame)
    cv2.imshow("Red Area Mask", mask_clean)

    # ESC 키로 종료
    if cv2.waitKey(1) &amp; 0xFF == 27:
        break

# 종료 처리
cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3985478944/a7d3b4531761a6d457ff76b9d464318e/______2025_06_13_162145.png" />
         <pubDate>2025-06-13 07:22:28 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3489281458</guid>
      </item>
      <item>
         <title>31003 김준호 울트라 볼(유도 미사일 피하기 얼굴 상호작용)</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3489281951</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import time
import random
import math
import numpy as np

# MediaPipe 초기화
mp_face_mesh = mp.solutions.face_mesh
face_mesh = mp_face_mesh.FaceMesh(refine_landmarks=True)
cap = cv2.VideoCapture(0)

# 캐릭터 설정
player_radius = 20
player_color = (255, 255, 255)
player_pos = [320, 240]

# 스킬 관련 설정
invincible_duration = 3.0   # 무적 지속 시간 (초)
skill_cooldown = 10.0       # 쿨타임 (초)
is_invincible = False
invincible_start_time = 0
last_skill_time = -skill_cooldown  # 초기엔 바로 쓸 수 있음

# 미사일 클래스
class Missile:
    def __init__(self, x, y, vx, vy, color, homing=False):
        self.x = x
        self.y = y
        self.color = color
        self.homing = homing
        base_speed = 5
        self.speed = base_speed * (0.5 if homing else 1.0)
        self.vx = vx
        self.vy = vy

    def update(self, target_x=None, target_y=None):
        if self.homing and target_x is not None:
            dx = target_x - self.x
            dy = target_y - self.y
            dist = math.sqrt(dx ** 2 + dy ** 2) + 1e-6
            self.vx = self.speed * dx / dist
            self.vy = self.speed * dy / dist
        self.x += self.vx
        self.y += self.vy

    def draw(self, frame):
        cv2.circle(frame, (int(self.x), int(self.y)), 8, self.color, -1)

# 미사일 생성 함수
def add_missile(w, h, homing=False):
    edge = random.choice(['top', 'bottom', 'left', 'right'])
    speed = 5
    color = (0, 0, 255) if not homing else (0, 255, 255)
    if edge == 'top':
        x, y = random.randint(0, w), 0
        vx, vy = 0, speed
    elif edge == 'bottom':
        x, y = random.randint(0, w), h
        vx, vy = 0, -speed
    elif edge == 'left':
        x, y = 0, random.randint(0, h)
        vx, vy = speed, 0
    else:
        x, y = w, random.randint(0, h)
        vx, vy = -speed, 0
    missiles.append(Missile(x, y, vx, vy, color, homing))

# 게임 상태
STATE_START = 0
STATE_PLAYING = 1
STATE_GAME_OVER = 2
state = STATE_START

missiles = []
score = 0
start_time = 0
last_missile_time = 0

def reset_game():
    global missiles, score, start_time, last_missile_time, is_invincible, last_skill_time
    missiles.clear()
    score = 0
    start_time = time.time()
    last_missile_time = 0
    is_invincible = False
    last_skill_time = -skill_cooldown

while True:
    ret, frame = cap.read()
    if not ret:
        break

    h, w, _ = frame.shape

    # 검은 배경 생성
    black_bg = np.zeros((h, w, 3), dtype=np.uint8)

    # Mediapipe 얼굴 추적
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    results = face_mesh.process(rgb)

    current_time = time.time()

    if state == STATE_START:
        cv2.putText(black_bg, "Face Missile Dodge Game", (80, 200), cv2.FONT_HERSHEY_SIMPLEX, 1.5, (255, 255, 255), 3)
        cv2.putText(black_bg, "Press SPACE to Start", (130, 280), cv2.FONT_HERSHEY_SIMPLEX, 1, (200, 200, 200), 2)
        key = cv2.waitKey(1)
        if key == 32:
            state = STATE_PLAYING
            reset_game()

    elif state == STATE_PLAYING:
        # 얼굴 위치 업데이트
        if results.multi_face_landmarks:
            landmarks = results.multi_face_landmarks[0].landmark
            nose = landmarks[1]
            top_lip = landmarks[13]   # 윗입술 중앙
            bottom_lip = landmarks[14] # 아랫입술 중앙

            x, y = int(nose.x * w), int(nose.y * h)
            player_pos = [x, y]

            # 입 벌림 감지
            mouth_open = abs(top_lip.y - bottom_lip.y) &gt; 0.05

            if mouth_open and not is_invincible and (current_time - last_skill_time) &gt;= skill_cooldown:
                is_invincible = True
                invincible_start_time = current_time
                last_skill_time = current_time

        # 무적 상태 관리
        if is_invincible and (current_time - invincible_start_time &gt; invincible_duration):
            is_invincible = False

        # 미사일 생성
        if current_time - last_missile_time &gt; 1:
            add_missile(w, h, homing=random.random() &lt; 0.3)
            last_missile_time = current_time

        # 미사일 처리
        for m in missiles[:]:
            m.update(player_pos[0], player_pos[1])
            m.draw(black_bg)

            dist = math.hypot(m.x - player_pos[0], m.y - player_pos[1])
            if dist &lt; player_radius + 8 and not is_invincible:
                state = STATE_GAME_OVER
                break

        # 캐릭터 그리기
        if is_invincible:
            # 오라 그리기 (무적 상태)
            cv2.circle(black_bg, tuple(player_pos), player_radius + 15, (255, 255, 0), 3)
        cv2.circle(black_bg, tuple(player_pos), player_radius, player_color, -1)

        # 스코어 및 쿨타임 표시
        score = int(current_time - start_time)
        cv2.putText(black_bg, f"Score: {score}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)

        time_since_last = current_time - last_skill_time
        cooldown_remaining = max(0, int(skill_cooldown - time_since_last))
        cv2.putText(black_bg, f"Skill Cooldown: {cooldown_remaining}s", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2)

    elif state == STATE_GAME_OVER:
        cv2.putText(black_bg, "GAME OVER", (200, 200), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 4)
        cv2.putText(black_bg, f"Score: {score}", (220, 260), cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 255, 255), 2)
        cv2.putText(black_bg, "Press R to Restart or ESC to Exit", (80, 320), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (180, 180, 180), 2)
        key = cv2.waitKey(1)
        if key == ord('r') or key == ord('R'):
            state = STATE_START
        elif key == 27:
            break

    cv2.imshow('Game', black_bg)

    if state != STATE_GAME_OVER:
        if cv2.waitKey(1) &amp; 0xFF == 27:
            break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/3985471628/184f2625e09c16559dba4e51e059f014/_____2025_06_13_162138.png" />
         <pubDate>2025-06-13 07:22:50 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3489281951</guid>
      </item>
      <item>
         <title>구글 글래스(스마트 안경)</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3492262451</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://www.donga.com/news/It/article/all/20250521/131651633/1" />
         <pubDate>2025-06-16 23:53:06 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492262451</guid>
      </item>
      <item>
         <title>30915 박주혁</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492269182</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import math
import os
from pynput.mouse import Controller, Button

# Mediapipe 초기화
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils
hands = mp_hands.Hands(
    max_num_hands=1,
    min_detection_confidence=0.7,
    min_tracking_confidence=0.5
)

# 마우스 컨트롤 초기화
mouse = Controller()
paper_holding = False
scissors_clicked = False
screen_off = False  # 화면 꺼짐 상태 추적

# 화면 끄기 함수 (Windows)
def turn_off_screen():
    os.system(
        "powershell (Add-Type '[DllImport(\"user32.dll\")]public static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);' -Name a -Pas)::SendMessage(-1,0x0112,0xF170,2)"
    )

# 화면 켜기 함수 (마우스 살짝 움직이기)
def wake_screen():
    mouse.move(1, 0)
    mouse.move(-1, 0)

# 각도 계산 함수
def calculate_angle(a, b, c):
    ab = [a[0] - b[0], a[1] - b[1]]
    bc = [c[0] - b[0], c[1] - b[1]]
    dot = ab[0] * bc[0] + ab[1] * bc[1]
    det = ab[0] * bc[1] - ab[1] * bc[0]
    angle = math.atan2(det, dot) * 180.0 / math.pi
    return abs(angle)

# 손가락이 펴졌는지 감지
def detect_finger_open(landmarks, width, height):
    finger_tips = [4, 8, 12, 16, 20]
    finger_ips = [3, 7, 11, 15, 19]
    finger_names = ["Thumb", "Index", "Middle", "Ring", "Pinky"]

    open_fingers = []
    open_threshold = 160

    wrist = (landmarks[0].x * width, landmarks[0].y * height)

    for tip_idx, ip_idx, name in zip(finger_tips, finger_ips, finger_names):
        tip = (landmarks[tip_idx].x * width, landmarks[tip_idx].y * height)
        ip = (landmarks[ip_idx].x * width, landmarks[ip_idx].y * height)
        angle = calculate_angle(tip, ip, wrist)
        if angle &gt; open_threshold:
            open_fingers.append(name)

    return open_fingers

# 제스처 인식
def recognize_gesture(open_fingers):
    if len(open_fingers) == 5:
        return "Paper"
    elif len(open_fingers) == 2 and "Index" in open_fingers and "Middle" in open_fingers:
        return "Scissors"
    elif len(open_fingers) == 0:
        return "Rock"
    return "just hand"

# 제스처에 따른 동작 수행
def perform_action(gesture):
    global paper_holding, scissors_clicked, screen_off

    if gesture == "Rock":
        if not screen_off:
            print("Rock 감지 → 화면 끄기")
            turn_off_screen()
            screen_off = True
        return
    else:
        if screen_off:
            print("다른 제스처 감지 → 화면 켜기")
            wake_screen()
            screen_off = False

    if gesture == "Paper":
        if not paper_holding:
            print("Paper 감지 → 더블클릭 + 눌림 유지")
            mouse.click(Button.left, 2)
            mouse.press(Button.left)
            paper_holding = True
        scissors_clicked = False
    else:
        if paper_holding:
            print("Paper 해제 → 버튼 놓기")
            mouse.release(Button.left)
            paper_holding = False

        if gesture == "Scissors":
            if not scissors_clicked:
                print("Scissors 감지 → 클릭")
                mouse.click(Button.left)
                scissors_clicked = True
        else:
            scissors_clicked = False

# 웹캠 실행
cap = cv2.VideoCapture(0)

while True:
    success, frame = cap.read()
    if not success:
        break

    frame = cv2.flip(frame, 1)
    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(image_rgb)

    if result.multi_hand_landmarks:
        for hand_landmarks, handedness in zip(result.multi_hand_landmarks, result.multi_handedness):
            h, w, _ = frame.shape

            hand_label = handedness.classification[0].label
            open_fingers = detect_finger_open(hand_landmarks.landmark, w, h)
            gesture = recognize_gesture(open_fingers)
            perform_action(gesture)

            color = (0, 255, 0) if hand_label == "Left" else (0, 0, 255)
            position = (50, 50) if hand_label == "Left" else (50, 100)

            # 손가락 수 표시
            finger_count = len(open_fingers)
            cv2.putText(frame, f"{hand_label} Hand: {gesture}", position,
                        cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2)
            cv2.putText(frame, f"Fingers: {finger_count}", (position[0], position[1] + 40),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2)

    cv2.imshow("Rock Paper Scissors Gesture Recognition", frame)

    if cv2.waitKey(1) &amp; 0xFF == 27:  # ESC 종료
        break

cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4003006788/ed939fe67056ed8be7a221dd9018c1e6/image.png" />
         <pubDate>2025-06-16 23:59:15 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492269182</guid>
      </item>
      <item>
         <title>30708 김세윤</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492275314</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4002961991/9621aa9794efd6d4de8e9d4901ac8d71/30708____.pdf" />
         <pubDate>2025-06-17 00:06:14 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492275314</guid>
      </item>
      <item>
         <title>31113 봉준근</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492276553</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1bqUzY3Wb61weejIZ6k3L2_FcqwuR2_SSuCezGxYZWhk/edit?usp=sharing" />
         <pubDate>2025-06-17 00:07:32 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492276553</guid>
      </item>
      <item>
         <title>30812</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492276831</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1ii7O_OJ3pAvM4bHzRs52LxJCgG5pDUFUYv40PqGivd8/edit?usp=sharing" />
         <pubDate>2025-06-17 00:07:47 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492276831</guid>
      </item>
      <item>
         <title>30908 김준서</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492277031</link>
         <description><![CDATA[<p>이 기능은 재난 상황이나 긴급한 도움이 필요한 사람들에게 매우 유용합니다. 인터넷 방송이나 화상 회의가 활발한 지금, 화면을 통한 비언어적 신호로 위급 상황을 신속하게 알릴 수 있어 더욱 중요하다고 생각하여 만들어봤습니다.</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4003009092/103abe856b653624dfab604090dae553/_____2025_06_17_090339.png" />
         <pubDate>2025-06-17 00:07:57 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492277031</guid>
      </item>
      <item>
         <title>30908 김준서</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492277248</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4003009092/e332154789dbbabea3841b0797d7d6eb/_____2025_06_17_090319.png" />
         <pubDate>2025-06-17 00:08:11 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492277248</guid>
      </item>
      <item>
         <title>30708 김세윤</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492288895</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4002961991/ef9e411998a0daf2fae2dc8ee721a08b/________2025_06_17_090045.mp4" />
         <pubDate>2025-06-17 00:17:41 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492288895</guid>
      </item>
      <item>
         <title>31104 김대현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492291031</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands=1)
mp_draw = mp.solutions.drawing_utils

tip_ids = [4, 8, 12, 16, 20]  # 손가락 끝 인덱스

colors = {
    1: (0, 0, 255),    # 빨강
    2: (0, 255, 0),    # 초록
    3: (255, 0, 0),    # 파랑
    4: (255, 0, 255),  # 보라
}
eraser_color = (0, 0, 0)
brush_thickness = 5
eraser_thickness = 50

cap = cv2.VideoCapture(0)
canvas = None
prev_x, prev_y = 0, 0

def count_fingers(hand_landmarks):
    fingers = []

    # 엄지: x좌표 비교
    if hand_landmarks.landmark[tip_ids[0]].x &lt; hand_landmarks.landmark[tip_ids[0] - 1].x:
        fingers.append(1)
    else:
        fingers.append(0)

    # 나머지: y좌표 비교
    for i in range(1, 5):
        if hand_landmarks.landmark[tip_ids[i]].y &lt; hand_landmarks.landmark[tip_ids[i] - 2].y:
            fingers.append(1)
        else:
            fingers.append(0)

    return sum(fingers)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    frame = cv2.flip(frame, 1)
    h, w, _ = frame.shape

    if canvas is None:
        canvas = frame.copy() * 0

    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(rgb)

    draw = False
    color = colors.get(1)

    if result.multi_hand_landmarks:
        for hand_landmarks in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)

            fingers_up = count_fingers(hand_landmarks)

            # 손가락 5개 → 지우개 모드
            if fingers_up == 5:
                color = eraser_color
                thickness = eraser_thickness
            else:
                color = colors.get(fingers_up, (0, 0, 255))
                thickness = brush_thickness

            # ✊ 주먹일 때는 그리기 금지
            if fingers_up == 0:
                prev_x, prev_y = 0, 0  # 그리기 시작점도 초기화
                continue  # 아래 코드 실행 안 함

            # 검지 위치
            index_finger = hand_landmarks.landmark[mp_hands.HandLandmark.INDEX_FINGER_TIP]
            x, y = int(index_finger.x * w), int(index_finger.y * h)

            if 0 &lt;= x &lt; w and 0 &lt;= y &lt; h:
                draw = True
                if prev_x == 0 and prev_y == 0:
                    prev_x, prev_y = x, y

                if draw:
                    cv2.line(canvas, (prev_x, prev_y), (x, y), color, thickness)
                    prev_x, prev_y = x, y
            else:
                prev_x, prev_y = 0, 0
    else:
        prev_x, prev_y = 0, 0

    combined = cv2.addWeighted(frame, 0.7, canvas, 0.3, 0)
    cv2.imshow("Air Drawing with Fist Block", combined)

    key = cv2.waitKey(1) &amp; 0xFF
    if key == 27:
        break
    elif key == ord('c'):
        canvas = frame.copy() * 0

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4003011909/7565346a294bae8622d118cfcd69eac8/______2025_06_17_091820.png" />
         <pubDate>2025-06-17 00:19:14 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492291031</guid>
      </item>
      <item>
         <title>31011 유민기</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492294344</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4003171382/1651b36deb6bc825328577eee791db1a/image.png" />
         <pubDate>2025-06-17 00:21:34 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492294344</guid>
      </item>
      <item>
         <title>셀프 수업 과제 체크</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3492424406</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/spreadsheets/d/1fRn16HV9UnSrJoIgdOghZ5HUv8AhIGZZB-TJtdfx3yQ/edit?usp=sharing" />
         <pubDate>2025-06-17 01:35:58 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492424406</guid>
      </item>
      <item>
         <title>30507김용천</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492437122</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1RTLATrPPPDHPSyNmtsavtwSfkVnIVQNMwodVZkKbkAU/edit?usp=sharing" />
         <pubDate>2025-06-17 01:42:29 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492437122</guid>
      </item>
      <item>
         <title>30507김용천</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492472256</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import random
import time

mp_hands = mp.solutions.hands
hands = mp_hands.Hands(static_image_mode=False, max_num_hands=1, min_detection_confidence=0.7)
mp_drawing = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)

# 결과 출력 타이머
last_time = 0
delay = 2  # 초
result = ""
computer_choice = ""

def get_finger_status(hand_landmarks):
    finger_tips = [8, 12, 16, 20]  # 검지, 중지, 약지, 새끼
    finger_mcp = [5, 9, 13, 17]
    status = []

    for tip, mcp in zip(finger_tips, finger_mcp):
        status.append(hand_landmarks.landmark[tip].y &lt; hand_landmarks.landmark[mcp].y)

    # 엄지는 x축 기준
    status.insert(0, hand_landmarks.landmark[4].x &gt; hand_landmarks.landmark[3].x)

    return status

def recognize_gesture(finger_status):
    if all(not finger for finger in finger_status):  # 모두 접힘
        return "Rock"
    elif finger_status[1] and finger_status[2] and not finger_status[3] and not finger_status[4]:  # 검지, 중지만 펴짐
        return "Scissors"
    elif all(finger for finger in finger_status):  # 모두 펴짐
        return "Paper"
    else:
        return "Unknown"

def get_winner(user, computer):
    if user == computer:
        return "Draw"
    elif (user == "Rock" and computer == "Scissors") or \
         (user == "Scissors" and computer == "Paper") or \
         (user == "Paper" and computer == "Rock"):
        return "You Win!"
    else:
        return "You Lose!"

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break

    frame = cv2.flip(frame, 1)
    h, w, _ = frame.shape
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result_hands = hands.process(rgb)

    if result_hands.multi_hand_landmarks:
        hand_landmarks = result_hands.multi_hand_landmarks[0]
        finger_status = get_finger_status(hand_landmarks)
        user_gesture = recognize_gesture(finger_status)

        current_time = time.time()
        if current_time - last_time &gt; delay and user_gesture in ["Rock", "Paper", "Scissors"]:
            computer_choice = random.choice(["Rock", "Paper", "Scissors"])
            result = get_winner(user_gesture, computer_choice)
            last_time = current_time

        mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)

        cv2.putText(frame, f'Your move: {user_gesture}', (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.8, (255, 255, 255), 2)
        cv2.putText(frame, f'Computer: {computer_choice}', (10, 70),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 255, 255), 2)
        cv2.putText(frame, f'Result: {result}', (10, 110),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 200, 0), 2)
    else:
        cv2.putText(frame, 'Show your hand!', (10, 30),
                    cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0, 0, 255), 2)

    cv2.imshow('Rock Paper Scissors Game', frame)
    if cv2.waitKey(1) &amp; 0xFF == 27:  # ESC
        break

cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4003539172/68cacd2d6ac4153861027aa3f0b4adff/______2025_06_17_105111.png" />
         <pubDate>2025-06-17 01:58:14 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492472256</guid>
      </item>
      <item>
         <title>30530황인성</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492497042</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1FGCcTePz0mwrmtBVvW8eoY5E3gQa_xbr0m_dyQW3NCs/edit?usp=sharing" />
         <pubDate>2025-06-17 02:11:05 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492497042</guid>
      </item>
      <item>
         <title>30211 박주환</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492517373</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4003543420/18912695f97e781fc992550e303c9fde/efeffffffffffffff.png" />
         <pubDate>2025-06-17 02:20:36 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492517373</guid>
      </item>
      <item>
         <title>30317 안은호</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492933306</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1JGBQupgs6LeVwQ9lSvuRPspJayuFqn3zefaUIvFFuWo/edit?usp=sharing" />
         <pubDate>2025-06-17 07:02:39 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492933306</guid>
      </item>
      <item>
         <title>30407 박건(가위바위보)</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492939890</link>
         <description><![CDATA[<p>import cv2</p><p>import mediapipe as mp</p><p>import time</p><p>import random</p><p>mp_hands = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.hands</p><p>mp_drawing = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.drawing_utils</p><p>hands = mp_hands.Hands(max_num_hands=1, min_detection_confidence=0.7)</p><p>def is_finger_open(lm, tip, pip):</p><p>    return lm[tip].y &lt; lm[pip].y</p><p>def is_back_of_hand(lm):</p><p>    # 손바닥/손등 판별: 엄지와 검지 중간 마디 z 좌표 평균</p><p>    thumb_mcp_z = lm[2].z</p><p>    index_mcp_z = lm[5].z</p><p>    avg_z = (thumb_mcp_z + index_mcp_z) / 2</p><p>    return avg_z &gt; 0  # 양수면 손등, 음수면 손바닥</p><p>def is_thumb_open(lm, handedness):</p><p>    back_of_hand = is_back_of_hand(lm)</p><p>    if back_of_hand:</p><p>        # 손등 방향일 때 엄지 인식 반전</p><p>        if handedness == "Right":</p><p>            return lm[4].x &gt; lm[3].x</p><p>        else:</p><p>            return lm[4].x &lt; lm[3].x</p><p>    else:</p><p>        # 손바닥 방향일 때 기존 로직</p><p>        if handedness == "Right":</p><p>            return lm[4].x &lt; lm[3].x</p><p>        else:</p><p>            return lm[4].x &gt; lm[3].x</p><p>def detect_gesture(hand_landmarks, handedness):</p><p>    lm = hand_landmarks.landmark</p><p>    thumb = is_thumb_open(lm, handedness)</p><p>    index = is_finger_open(lm, 8, 6)</p><p>    middle = is_finger_open(lm, 12, 10)</p><p>    ring = is_finger_open(lm, 16, 14)</p><p>    pinky = is_finger_open(lm, 20, 18)</p><p>    # 바위: 모두 접음</p><p>    if not thumb and not index and not middle and not ring and not pinky:</p><p>        return "Rock"</p><p>    # 보: 모두 핌</p><p>    elif thumb and index and middle and ring and pinky:</p><p>        return "Paper"</p><p>    # 가위: 검지+중지 또는 엄지+검지 핌 (가위손)</p><p>    elif (index and middle and not ring and not pinky) or (thumb and index and not middle and not ring and not pinky):</p><p>        return "Scissors"</p><p>    else:</p><p>        return "Unknown"</p><p>def decide_winner(player, computer):</p><p>    if player == computer:</p><p>        return "Draw"</p><p>    elif (player <mark> "Rock" and computer </mark> "Scissors") or \</p><p>         (player <mark> "Scissors" and computer </mark> "Paper") or \</p><p>         (player <mark> "Paper" and computer </mark> "Rock"):</p><p>        return "You Win!"</p><p>    else:</p><p>        return "You Lose!"</p><p>cap = cv2.VideoCapture(0)</p><p>game_state = "ready"</p><p>count_start_time = 0</p><p>player_choice = ""</p><p>computer_choice = ""</p><p>result_text = ""</p><p>while True:</p><p>    ret, frame = <a rel="noopener noreferrer nofollow" href="http://cap.read">cap.read</a>()</p><p>    if not ret:</p><p>        break</p><p>    frame = cv2.flip(frame, 1)  # 좌우 반전</p><p>    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)</p><p>    result = hands.process(image_rgb)</p><p>    h, w, _ = frame.shape</p><p>    if game_state == "ready":</p><p>        cv2.putText(frame, "Press 'Space' to Start", (50, 50),</p><p>                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 200, 200), 2)</p><p>    elif game_state == "countdown":</p><p>        elapsed = time.time() - count_start_time</p><p>        remaining = max(0, 3 - int(elapsed))</p><p>        if remaining &gt; 0:</p><p>            cv2.putText(frame, f"{remaining}", (w // 2 - 20, h // 2),</p><p>                        cv2.FONT_HERSHEY_DUPLEX, 3, (255, 0, 0), 5)</p><p>        else:</p><p>            game_state = "result"</p><p>            if result.multi_hand_landmarks and result.multi_handedness:</p><p>                hand = result.multi_hand_landmarks[0]</p><p>                handedness_label = result.multi_handedness[0].classification[0].label</p><p>                player_choice = detect_gesture(hand, handedness_label)</p><p>            else:</p><p>                player_choice = "Unknown"</p><p>            computer_choice = random.choice(["Rock", "Paper", "Scissors"])</p><p>            result_text = decide_winner(player_choice, computer_choice)</p><p>            result_time = time.time()</p><p>    elif game_state == "result":</p><p>        cv2.putText(frame, f"You: {player_choice}", (50, 80),</p><p>                    cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 255, 255), 2)</p><p>        cv2.putText(frame, f"Computer: {computer_choice}", (50, 130),</p><p>                    cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 255, 255), 2)</p><p>        cv2.putText(frame, result_text, (50, 200),</p><p>                    cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 128, 255), 4)</p><p>        if time.time() - result_time &gt; 3:</p><p>            game_state = "ready"</p><p>    if result.multi_hand_landmarks:</p><p>        for hand_landmarks in result.multi_hand_landmarks:</p><p>            mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)</p><p>    cv2.imshow("Rock Paper Scissors", frame)</p><p>    key = cv2.waitKey(1) &amp; 0xFF</p><p>    if key == 27:  # ESC</p><p>        break</p><p>    elif key <mark> 32 and game_state </mark> "ready":  # Space</p><p>        count_start_time = time.time()</p><p>        game_state = "countdown"</p><p>        player_choice = ""</p><p>        computer_choice = ""</p><p>        result_text = ""</p><p>cap.release()</p><p>cv2.destroyAllWindows()</p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4005005743/d84efe01e577bf7ab87bbb1a6ea803ef/test.png" />
         <pubDate>2025-06-17 07:07:51 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492939890</guid>
      </item>
      <item>
         <title>30225 전영현 (장애물 피하기)</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3492956408</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import random
import math
import time

mp_hands = mp.solutions.hands
hands = mp_hands.Hands()

cap = cv2.VideoCapture(0)

finger_radius = 15
obstacle_radius = 12

directions = [
    (1, 0), (-1, 0), (0, 1), (0, -1),
    (1, 1), (1, -1), (-1, 1), (-1, -1)
]

font = cv2.FONT_HERSHEY_SIMPLEX

frame_count = 0
spawn_interval = 15
start_time = time.time()

game_over = False
survived_time = 0

obstacles = []

def normalize_vector(x, y):
    length = math.hypot(x, y)
    if length == 0:
        return 0, 0
    return x / length, y / length

def reset_game():
    global obstacles, frame_count, start_time, game_over, survived_time
    obstacles = []
    frame_count = 0
    start_time = time.time()
    game_over = False
    survived_time = 0

while True:
    success, frame = cap.read()
    if not success:
        break

    frame = cv2.flip(frame, 1)
    h, w, _ = frame.shape

    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

    current_time = time.time()
    elapsed_time = current_time - start_time

    if not game_over:
        result = hands.process(image_rgb)
    else:
        result = None

    cx8, cy8 = None, None

    if result and result.multi_hand_landmarks:
        for hand_landmarks in result.multi_hand_landmarks:
            lm8 = hand_landmarks.landmark[8]
            cx8, cy8 = int(lm8.x * w), int(lm8.y * h)
            cv2.circle(frame, (cx8, cy8), finger_radius, (0, 255, 0), 3)

    max_spawn_per_frame = 1 + int(elapsed_time * 0.1)

    min_speed = 10
    max_speed = 16

    if not game_over:
        # 10초마다 일렬 패턴 출현, 간격 84픽셀
        if int(elapsed_time) % 10 == 0 and frame_count % spawn_interval == 0:
            pattern_count = 5
            spacing = int(obstacle_radius * 7)  # 84px
            base_x = -obstacle_radius * 2
            base_y = h // 2 - (pattern_count // 2) * spacing
            speed_x, speed_y = 12, 0

            for i in range(pattern_count):
                y_pos = base_y + i * spacing
                obstacles.append([base_x, y_pos, speed_x, speed_y])

        for _ in range(max_spawn_per_frame):
            if frame_count % spawn_interval == 0:
                dir_x, dir_y = random.choice(directions)
                speed = random.uniform(min_speed, max_speed)
                norm_x, norm_y = normalize_vector(dir_x, dir_y)
                speed_x = norm_x * speed
                speed_y = norm_y * speed

                if dir_x &gt; 0:
                    x = -obstacle_radius * 2
                elif dir_x &lt; 0:
                    x = w + obstacle_radius * 2
                else:
                    x = random.randint(0, w)

                if dir_y &gt; 0:
                    y = -obstacle_radius * 2
                elif dir_y &lt; 0:
                    y = h + obstacle_radius * 2
                else:
                    y = random.randint(0, h)

                obstacles.append([x, y, speed_x, speed_y])

        frame_count += 1

        obstacles_to_remove = []
        for i, (x, y, speed_x, speed_y) in enumerate(obstacles):
            x += speed_x
            y += speed_y

            if x &lt; -obstacle_radius*2 or x &gt; w + obstacle_radius*2 or y &lt; -obstacle_radius*2 or y &gt; h + obstacle_radius*2:
                obstacles_to_remove.append(i)
            else:
                obstacles[i] = [x, y, speed_x, speed_y]
                cv2.circle(frame, (int(x), int(y)), obstacle_radius, (0, 0, 255), -1)

        for idx in reversed(obstacles_to_remove):
            obstacles.pop(idx)

        if cx8 is not None and cy8 is not None:
            for x, y, _, _ in obstacles:
                dist = math.hypot(cx8 - x, cy8 - y)
                if dist &lt; finger_radius + obstacle_radius:
                    game_over = True
                    survived_time = elapsed_time
                    break

    if game_over:
        frame[:] = (0, 0, 0)
        cv2.putText(frame, "LOSE", (w // 4, h // 3),
                    cv2.FONT_HERSHEY_SIMPLEX, 5, (0, 0, 255), 10)
        cv2.putText(frame, f"TIME SURVIVED: {survived_time:.2f} s", (50, h // 2),
                    cv2.FONT_HERSHEY_SIMPLEX, 2, (255, 255, 255), 4)
        cv2.putText(frame, "Press SPACE to Restart", (50, int(h * 0.7)),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
    else:
        cv2.putText(frame, f"TIME: {elapsed_time:.2f} s", (10, 40),
                    font, 1, (255, 255, 255), 2)

    cv2.imshow("장애물 게임", frame)

    key = cv2.waitKey(1) &amp; 0xFF
    if key == 27:  # ESC 누르면 종료
        break
    elif key == 32 and game_over:  # 스페이스바 누르면 다시 시작
        reset_game()

cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="" />
         <pubDate>2025-06-17 07:20:24 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3492956408</guid>
      </item>
      <item>
         <title>30703 곽성빈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3493873930</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1z4eUemlAI4x-QddXPqe_BTOxRMpKmLlHAQkScHgGlbo/edit?usp=sharing" />
         <pubDate>2025-06-18 01:44:08 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3493873930</guid>
      </item>
      <item>
         <title>30910 문승현</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3493885348</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp

# MediaPipe 초기화
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
    static_image_mode=False,
    max_num_hands=1,  # 한 손만 인식
    min_detection_confidence=0.5,
    min_tracking_confidence=0.5
)
mp_drawing = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)

def count_fingers(hand_landmarks, handedness):
    lm = hand_landmarks.landmark
    count = 0

    # 엄지
    if handedness == 'Right':
        if lm[4].x &lt; lm[3].x:
            count += 1
    else:
        if lm[4].x &gt; lm[3].x:
            count += 1

    # 나머지 손가락
    finger_tips = [8, 12, 16, 20]
    finger_pips = [6, 10, 14, 18]

    for tip, pip in zip(finger_tips, finger_pips):
        if lm[tip].y &lt; lm[pip].y:
            count += 1

    return count

def get_gesture(finger_count):
    if finger_count == 2:
        return "Scissors"
    elif finger_count &gt;= 4:
        return "Paper"
    else:
        return "Rock"

while cap.isOpened():
    success, image = cap.read()
    if not success:
        print("카메라를 찾을 수 없습니다.")
        break

    # 좌우반전
    image = cv2.flip(image, 1)

    # RGB 변환 및 손 인식
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image_rgb.flags.writeable = False
    results = hands.process(image_rgb)
    image_rgb.flags.writeable = True

    # 손 인식된 경우
    if results.multi_hand_landmarks and results.multi_handedness:
        for hand_landmarks, handedness_info in zip(results.multi_hand_landmarks, results.multi_handedness):
            label = handedness_info.classification[0].label  # 'Left' or 'Right'
            fingers = count_fingers(hand_landmarks, label)
            gesture = get_gesture(fingers)

            # 손목 위치 가져오기
            h, w, _ = image.shape
            wrist = hand_landmarks.landmark[0]
            cx, cy = int(wrist.x * w), int(wrist.y * h)
            text_x = max(cx - 50, 10)
            text_y = max(cy - 30, 30)

            # 결과 표시
            mp_drawing.draw_landmarks(image, hand_landmarks, mp_hands.HAND_CONNECTIONS)
            cv2.putText(image, f"{gesture} ({fingers})", (text_x, text_y),
                        cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 255), 2, cv2.LINE_AA)

    cv2.imshow('Rock Scissors Paper Detection', image)

    if cv2.waitKey(5) &amp; 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4009425996/d268a4ad71f62099b1ae12f38964e89c/______2025_06_18_105030.jpg" />
         <pubDate>2025-06-18 01:51:43 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3493885348</guid>
      </item>
      <item>
         <title>30728 한태민</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3493889125</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4009383513/20ba2affab79e70abbf18547fc6536b1/Hand_Counter.png" />
         <pubDate>2025-06-18 01:54:19 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3493889125</guid>
      </item>
      <item>
         <title>30703 곽성빈</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3493892640</link>
         <description><![CDATA[<p>import cv2</p><p>import mediapipe as mp</p><p>import math</p><p>from pynput.mouse import Controller, Button</p><p><br></p><p># Mediapipe 초기화</p><p>mp_hands = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.hands</p><p>mp_drawing = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.drawing_utils</p><p>hands = mp_hands.Hands()</p><p><br></p><p># 마우스 컨트롤 초기화</p><p>mouse = Controller()</p><p>paper_holding = False&nbsp; # Paper 유지 상태 변수</p><p>scissors_clicked = False</p><p><br></p><p># 웹캠 열기</p><p>cap = cv2.VideoCapture(0)</p><p><br></p><p>def calculate_angle(a, b, c):</p><p>&nbsp;&nbsp;&nbsp;&nbsp;"""세 점을 이용해 각도를 계산하는 함수"""</p><p>&nbsp;&nbsp;&nbsp;&nbsp;ab = [a[0] - b[0], a[1] - b[1]]</p><p>&nbsp;&nbsp;&nbsp;&nbsp;bc = [c[0] - b[0], c[1] - b[1]]</p><p>&nbsp;&nbsp;&nbsp;&nbsp;dot = ab[0] <em> bc[0] + ab[1] </em> bc[1]</p><p>&nbsp;&nbsp;&nbsp;&nbsp;det = ab[0] <em> bc[1] - ab[1] </em> bc[0]</p><p>&nbsp;&nbsp;&nbsp;&nbsp;angle = math.atan2(det, dot) * 180.0 / math.pi</p><p>&nbsp;&nbsp;&nbsp;&nbsp;return abs(angle)</p><p><br></p><p>def detect_finger_open(landmarks, width, height):</p><p>&nbsp;&nbsp;&nbsp;&nbsp;"""손가락을 핀 상태로 인식하는 함수"""</p><p>&nbsp;&nbsp;&nbsp;&nbsp;finger_tips = [4, 8, 12, 16, 20]</p><p>&nbsp;&nbsp;&nbsp;&nbsp;finger_ips = [3, 7, 11, 15, 19]</p><p>&nbsp;&nbsp;&nbsp;&nbsp;finger_names = ["Thumb", "Index", "Middle", "Ring", "Pinky"]</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;open_fingers = []</p><p>&nbsp;&nbsp;&nbsp;&nbsp;open_threshold = 160&nbsp; # 각도가 160도 이상이면 핀 상태로 인식</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;wrist = (landmarks[0].x <em> width, landmarks[0].y </em> height)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;for tip_idx, ip_idx, name in zip(finger_tips, finger_ips, finger_names):</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;tip = (landmarks[tip_idx].x <em> width, landmarks[tip_idx].y </em> height)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ip = (landmarks[ip_idx].x <em> width, landmarks[ip_idx].y </em> height)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;angle = calculate_angle(tip, ip, wrist)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if angle &gt; open_threshold:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open_fingers.append(name)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;return open_fingers</p><p><br></p><p>def recognize_gesture(open_fingers):</p><p>&nbsp;&nbsp;&nbsp;&nbsp;"""가위, 바위, 보 제스처를 인식하는 함수"""</p><p>&nbsp;&nbsp;&nbsp;&nbsp;if len(open_fingers) == 5:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "Paper"</p><p>&nbsp;&nbsp;&nbsp;&nbsp;elif len(open_fingers) == 2 and "Index" in open_fingers and "Middle" in open_fingers:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "Scissors"</p><p>&nbsp;&nbsp;&nbsp;&nbsp;elif len(open_fingers) == 0:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return "Rock"</p><p>&nbsp;&nbsp;&nbsp;&nbsp;return "just hand"</p><p><br></p><p>def perform_action(gesture):</p><p>&nbsp;&nbsp;&nbsp;&nbsp;"""제스처에 따른 마우스 동작 수행"""</p><p>&nbsp;&nbsp;&nbsp;&nbsp;global paper_holding, scissors_clicked</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;if gesture == "Paper":</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not paper_holding:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Paper 감지 → 더블클릭 + 눌림 유지")</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="noopener noreferrer nofollow" href="http://mouse.click">mouse.click</a>(Button.left, 2)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="noopener noreferrer nofollow" href="http://mouse.press">mouse.press</a>(Button.left)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paper_holding = True</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scissors_clicked = False</p><p>&nbsp;&nbsp;&nbsp;&nbsp;else:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if paper_holding:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print("Paper 해제 → 버튼 놓기")</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;mouse.release(Button.left)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;paper_holding = False</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if gesture == "Scissors":</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if not scissors_clicked:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<a rel="noopener noreferrer nofollow" href="http://mouse.click">mouse.click</a>(Button.left)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scissors_clicked = True</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;scissors_clicked = False</p><p>while True:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;success, frame = <a rel="noopener noreferrer nofollow" href="http://cap.read">cap.read</a>()</p><p>&nbsp;&nbsp;&nbsp;&nbsp;if not success:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;frame = cv2.flip(frame, 1)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;result = hands.process(image_rgb)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;if result.multi_hand_landmarks:</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for hand_landmarks, handedness in zip(result.multi_hand_landmarks, result.multi_handedness):</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;h, w, _ = frame.shape</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hand_label = handedness.classification[0].label</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;open_fingers = detect_finger_open(hand_landmarks.landmark, w, h)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;gesture = recognize_gesture(open_fingers)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;perform_action(gesture)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;# 디버깅 텍스트만 표시 (랜드마크 표시 제거됨)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;color = (0, 255, 0) if hand_label == "Left" else (0, 0, 255)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;position = (50, 50) if hand_label == "Left" else (50, 100)</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cv2.putText(frame, f"{hand_label} Hand: {gesture}", position,</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cv2.FONT_HERSHEY_SIMPLEX, 1, color, 2)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;cv2.imshow("Rock Paper Scissors Gesture Recognition", frame)</p><p><br></p><p>&nbsp;&nbsp;&nbsp;&nbsp;if cv2.waitKey(1) &amp; 0xFF == 27:&nbsp; # ESC 키로 종료</p><p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break</p><p><br></p><p>cap.release()</p><p>cv2.destroyAllWindows()</p><p><br></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4009396462/3259d6b71c98ee11712a872c704d6a5a/image.png" />
         <pubDate>2025-06-18 01:56:28 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3493892640</guid>
      </item>
      <item>
         <title>30719 이현우</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3493893804</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/171QFY1Bv-Ebag10_QHQcE8U2CbGVQvbL2pb9cJcNWds/edit?usp=sharing" />
         <pubDate>2025-06-18 01:57:12 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3493893804</guid>
      </item>
      <item>
         <title>31122 이지호</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3493903521</link>
         <description><![CDATA[<p>import cv2</p><p>import mediapipe as mp</p><p>import numpy as np</p><p>mp_hands = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.hands</p><p>mp_face_mesh = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.face_mesh</p><p>hands = mp_hands.Hands()</p><p>face_mesh = mp_face_mesh.FaceMesh()</p><p>cap = cv2.VideoCapture(0)</p><p>def is_only_thumb_index_pinky_open(hand_landmarks):</p><p>    lm = hand_landmarks.landmark</p><p>    def y_open(tip, pip):</p><p>        return lm[tip].y &lt; lm[pip].y</p><p>    def y_closed(tip, pip):</p><p>        return lm[tip].y &gt; lm[pip].y</p><p>    thumb_open = lm[mp_hands.HandLandmark.THUMB_TIP].x &lt; lm[mp_hands.HandLandmark.THUMB_IP].x</p><p>    index_open = y_open(mp_hands.HandLandmark.INDEX_FINGER_TIP, mp_hands.HandLandmark.INDEX_FINGER_PIP)</p><p>    pinky_open = y_open(mp_hands.HandLandmark.PINKY_TIP, mp_hands.HandLandmark.PINKY_PIP)</p><p>    middle_closed = y_closed(mp_hands.HandLandmark.MIDDLE_FINGER_TIP, mp_hands.HandLandmark.MIDDLE_FINGER_PIP)</p><p>    ring_closed = y_closed(mp_hands.HandLandmark.RING_FINGER_TIP, mp_hands.HandLandmark.RING_FINGER_PIP)</p><p>    return thumb_open and index_open and pinky_open and middle_closed and ring_closed</p><p>def get_eye_coordinates(face_landmarks, image_width, image_height):</p><p>    left_eye_idx = [33, 133]</p><p>    right_eye_idx = [362, 263]</p><p>    left_eye = []</p><p>    right_eye = []</p><p>    for idx in left_eye_idx:</p><p>        x = int(face_landmarks[idx].x * image_width)</p><p>        y = int(face_landmarks[idx].y * image_height)</p><p>        left_eye.append((x, y))</p><p>    for idx in right_eye_idx:</p><p>        x = int(face_landmarks[idx].x * image_width)</p><p>        y = int(face_landmarks[idx].y * image_height)</p><p>        right_eye.append((x, y))</p><p>    return left_eye, right_eye</p><p>def draw_sunglasses(frame, left_eye, right_eye):</p><p>    left_center = np.mean(left_eye, axis=0).astype(int)</p><p>    right_center = np.mean(right_eye, axis=0).astype(int)</p><p>    eye_distance = int(np.linalg.norm(left_center - right_center))</p><p>    glass_width = eye_distance * 2</p><p>    glass_height = eye_distance // 2</p><p>    mid_x = (left_center[0] + right_center[0]) // 2</p><p>    mid_y = (left_center[1] + right_center[1]) // 2</p><p>    left_top = (mid_x - glass_width // 2, mid_y - glass_height // 2)</p><p>    right_top = (mid_x, mid_y - glass_height // 2)</p><p>    # 렌즈</p><p>    cv2.rectangle(frame, left_top, (left_top[0] + glass_width // 2, left_top[1] + glass_height), (0, 0, 0), -1)</p><p>    cv2.rectangle(frame, right_top, (right_top[0] + glass_width // 2, right_top[1] + glass_height), (0, 0, 0), -1)</p><p>    # 브릿지</p><p>    cv2.line(frame, (left_top[0] + glass_width // 2, mid_y), (right_top[0], mid_y), (0, 0, 0), 5)</p><p>while cap.isOpened():</p><p>    ret, frame = <a rel="noopener noreferrer nofollow" href="http://cap.read">cap.read</a>()</p><p>    if not ret:</p><p>        break</p><p>    frame = cv2.flip(frame, 1)</p><p>    # MediaPipe 처리</p><p>    frame_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)</p><p>    results_hands = hands.process(frame_rgb)</p><p>    results_face = face_mesh.process(frame_rgb)</p><p>    if results_hands.multi_hand_landmarks:</p><p>        for hand_landmarks in results_hands.multi_hand_landmarks:</p><p>            if is_only_thumb_index_pinky_open(hand_landmarks):</p><p>                if results_face.multi_face_landmarks:</p><p>                    for face_landmarks in results_face.multi_face_landmarks:</p><p>                        left_eye, right_eye = get_eye_coordinates(face_landmarks.landmark, frame.shape[1], frame.shape[0])</p><p>                        draw_sunglasses(frame, left_eye, right_eye)</p><p>    cv2.imshow('Frame', frame)</p><p>    if cv2.waitKey(1) &amp; 0xFF == ord('q'):</p><p>        break</p><p>cap.release()</p><p>cv2.destroyAllWindows()</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4009398851/56ab4cbe03fec36feebbaaf5a5a5ee78/_______.png" />
         <pubDate>2025-06-18 02:02:01 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3493903521</guid>
      </item>
      <item>
         <title>30719 이현우</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3493907500</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import pyautogui
import time
import math

# — 설치 필요 —
# pip install opencv-python mediapipe pyautogui

# MediaPipe Hands 초기화
mp_hands = mp.solutions.hands
mp_drawing = mp.solutions.drawing_utils
hands = mp_hands.Hands(
    max_num_hands=1,
    min_detection_confidence=0.7,
    min_tracking_confidence=0.7
)

# 디바운스 및 매핑 설정
CLICK_THRESHOLD = 0.04      # 핀치 임계값
COOLDOWN = 0.3              # 클릭 디바운스 (초)
last_click = 0
screen_w, screen_h = pyautogui.size()
SMOOTHING = 5               # 마우스 움직임 부드럽게: 이전 위치와 새 위치 평균화 비율

prev_x, prev_y = 0, 0

# 웹캠 열기
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 1) 영상 전처리
    img = cv2.flip(frame, 1)
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    res = hands.process(img_rgb)

    if res.multi_hand_landmarks:
        lm = res.multi_hand_landmarks[0].landmark

        # 2) 화면 좌표로 매핑할 검지 끝 (index finger tip: 8)
        x_norm, y_norm = lm[8].x, lm[8].y
        # MediaPipe 좌표계: (0,0) 왼쪽 위, (1,1) 오른쪽 아래
        x_screen = int(screen_w  * x_norm)
        y_screen = int(screen_h * y_norm)

        # 3) 부드러운 이동
        cur_x = prev_x + (x_screen - prev_x) / SMOOTHING
        cur_y = prev_y + (y_screen - prev_y) / SMOOTHING
        pyautogui.moveTo(cur_x, cur_y)
        prev_x, prev_y = cur_x, cur_y

        # 4) 핀치 감지 (엄지(4) ↔ 검지(8))
        x_thumb, y_thumb = lm[4].x, lm[4].y
        pinch_dist = math.hypot(x_thumb - x_norm, y_thumb - y_norm)
        now = time.time()
        if pinch_dist &lt; CLICK_THRESHOLD and now - last_click &gt; COOLDOWN:
            pyautogui.click()
            last_click = now

        # 5) 디버깅용 화면 표시
        mp_drawing.draw_landmarks(img, res.multi_hand_landmarks[0], mp_hands.HAND_CONNECTIONS)
        cv2.circle(img, 
                   (int(lm[8].x * img.shape[1]), int(lm[8].y * img.shape[0])),
                   10, (0,255,0), cv2.FILLED)
        cv2.putText(img, f"PinchDist:{pinch_dist:.3f}", (10,30),
                    cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)

    cv2.imshow("Hand Mouse Control", img)
    if cv2.waitKey(1) &amp; 0xFF == 27:  # ESC
        break

cap.release()
cv2.destroyAllWindows() </code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4009421073/15cd4f3797bbb362649e520fec7caed0/__.png" />
         <pubDate>2025-06-18 02:04:03 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3493907500</guid>
      </item>
      <item>
         <title>30729 홍세윤</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3493919592</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4009392027/fb4199f2736d9798371b0414d557f5ac/image.png" />
         <pubDate>2025-06-18 02:10:00 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3493919592</guid>
      </item>
      <item>
         <title>30729 홍세윤</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3493926907</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4009392027/417f2414d309ad84c5a4074433a37a39/image.png" />
         <pubDate>2025-06-18 02:13:39 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3493926907</guid>
      </item>
      <item>
         <title>30402 권일철</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3495514144</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import numpy as np
import random

# MediaPipe 설정
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands=1)
mp_draw = mp.solutions.drawing_utils

# 화면 설정
WIDTH, HEIGHT = 800, 600
brick_rows, brick_cols = 5, 8
brick_width = WIDTH // brick_cols
brick_height = 30
bar_width = 120
bar_height = 15
bar_y = HEIGHT - 50

# 게임 상태
game_started = False
game_over = False

# 기본 초기화 함수
def reset_game():
    global bar_x, balls, bricks, score, level, speed_multiplier
    bar_x = WIDTH // 2 - bar_width // 2
    balls = [{'x': WIDTH // 2, 'y': HEIGHT // 2, 'dx': 5, 'dy': -5}]
    score = 0
    level = 1
    speed_multiplier = 1.0
    bricks = []
    for row in range(brick_rows):
        for col in range(brick_cols):
            x = col * brick_width
            y = row * brick_height + 50
            brick_type = "normal"
            rand = random.random()
            if rand &lt; 0.1:
                brick_type = "green"
            elif rand &lt; 0.2:
                brick_type = "red"
            bricks.append({'x': x, 'y': y, 'w': brick_width - 2, 'h': brick_height - 2, 'type': brick_type})

reset_game()

# 카메라 시작
cap = cv2.VideoCapture(0)

while True:
    ret, frame = cap.read()
    if not ret:
        print("❗ 카메라를 불러올 수 없습니다.")
        break

    frame = cv2.flip(frame, 1)
    rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    result = hands.process(rgb)

    if result.multi_hand_landmarks:
        for hand_landmarks in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)
            x = int(hand_landmarks.landmark[8].x * WIDTH)
            bar_x = max(0, min(WIDTH - bar_width, x - bar_width // 2))

    game_frame = np.zeros((HEIGHT, WIDTH, 3), np.uint8)

    if not game_started:
        # 시작 대기 화면
        cv2.putText(game_frame, "Brick Breaker", (WIDTH//2 - 200, HEIGHT//2 - 50), cv2.FONT_HERSHEY_SIMPLEX, 2, (255,255,255), 3)
        cv2.putText(game_frame, "Press SPACE to Start", (WIDTH//2 - 220, HEIGHT//2 + 20), cv2.FONT_HERSHEY_SIMPLEX, 1, (0,255,0), 2)
    elif game_over:
        # 게임 오버 화면
        cv2.putText(game_frame, "Game Over", (WIDTH//2 - 160, HEIGHT//2 - 20), cv2.FONT_HERSHEY_SIMPLEX, 2, (0, 0, 255), 3)
        cv2.putText(game_frame, "Press R to Restart or ESC to Exit", (WIDTH//2 - 270, HEIGHT//2 + 40), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
    else:
        # 게임 진행 중
        for ball in balls:
            ball['x'] += int(ball['dx'] * speed_multiplier)
            ball['y'] += int(ball['dy'] * speed_multiplier)

            if ball['x'] &lt;= 0 or ball['x'] &gt;= WIDTH:
                ball['dx'] *= -1
            if ball['y'] &lt;= 0:
                ball['dy'] *= -1
            if bar_y &lt; ball['y'] + 10 &lt; bar_y + bar_height and bar_x &lt; ball['x'] &lt; bar_x + bar_width:
                ball['dy'] *= -1

        for ball in balls[:]:
            for b in bricks[:]:
                if b['x'] &lt; ball['x'] &lt; b['x'] + b['w'] and b['y'] &lt; ball['y'] &lt; b['y'] + b['h']:
                    bricks.remove(b)
                    ball['dy'] *= -1
                    score += 10
                    if b['type'] == "green" and len(balls) &lt; 5:
                        balls.append({'x': ball['x'], 'y': ball['y'], 'dx': random.choice([-5, 5]), 'dy': -5})
                    elif b['type'] == "red" and len(balls) &gt; 1:
                        balls.remove(ball)
                    break

        level = 1 + score // 100
        speed_multiplier = 1.0 + (level - 1) * 0.2

        balls = [b for b in balls if b['y'] &lt;= HEIGHT]
        if not balls:
            game_over = True

        # 벽돌, 바, 공 그리기
        for b in bricks:
            color = (255, 0, 0)
            if b['type'] == "green":
                color = (0, 255, 0)
            elif b['type'] == "red":
                color = (0, 0, 255)
            cv2.rectangle(game_frame, (b['x'], b['y']), (b['x'] + b['w'], b['y'] + b['h']), color, -1)

        cv2.rectangle(game_frame, (bar_x, bar_y), (bar_x + bar_width, bar_y + bar_height), (0, 255, 255), -1)

        for ball in balls:
            cv2.circle(game_frame, (int(ball['x']), int(ball['y'])), 10, (255, 255, 255), -1)

        # 점수/레벨 출력
        cv2.putText(game_frame, f"Score: {score}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
        cv2.putText(game_frame, f"Level: {level}", (10, 65), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 0), 2)

    # 카메라 화면 삽입
    cam_small = cv2.resize(frame, (200, 150))
    game_frame[0:150, 0:200] = cam_small

    cv2.imshow("Game", game_frame)

    key = cv2.waitKey(10) &amp; 0xFF
    if key == 27:  # ESC
        break
    if key == ord(' '):  # SPACE
        if not game_started:
            game_started = True
            game_over = False
            reset_game()
    if key == ord('r'):  # Restart
        if game_over:
            reset_game()
            game_over = False
            game_started = True

cap.release()
cv2.destroyAllWindows()</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4015948715/e6eede41cb1fac4d5687561e8f2486f9/image.png" />
         <pubDate>2025-06-19 04:32:22 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3495514144</guid>
      </item>
      <item>
         <title>30304 김민준</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3500256301</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4038795011/393b76bbe6e3e03ea63a4abbcc1a987c/image.png" />
         <pubDate>2025-06-24 07:06:39 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3500256301</guid>
      </item>
      <item>
         <title>김민준- 마우스 대신 손가락 클릭!</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3501191353</link>
         <description><![CDATA[<pre><code class="language-python">import cv2
import mediapipe as mp
import pyautogui

# 초기 설정
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands=1, min_detection_confidence=0.7)
mp_draw = mp.solutions.drawing_utils

# 화면 크기 (모니터 해상도)
screen_w, screen_h = pyautogui.size()

# 손가락 끝 인덱스
finger_tips = [4, 8, 12, 16, 20]

cap = cv2.VideoCapture(0)

while True:
    success, img = cap.read()
    img = cv2.flip(img, 1)
    h, w, _ = img.shape
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    result = hands.process(img_rgb)

    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            # 손 landmark 그리기
            mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)

            # 랜드마크 위치 가져오기
            landmarks = handLms.landmark

            # 손목 위치로 마우스 이동
            wrist = landmarks[0]
            x = int(wrist.x * w)
            y = int(wrist.y * h)

            screen_x = int(wrist.x * screen_w)
            screen_y = int(wrist.y * screen_h)
            pyautogui.moveTo(screen_x, screen_y)

            # 손가락 접힘 여부 판단
            fingers = []
            # 엄지
            fingers.append(landmarks[4].x &lt; landmarks[3].x)
            # 나머지 손가락
            for tip_id in [8, 12, 16, 20]:
                fingers.append(landmarks[tip_id].y &gt; landmarks[tip_id - 2].y)

            # 모든 손가락이 접혔으면 클릭
            if fingers.count(True) == 5:
                pyautogui.click()
                cv2.putText(img, "Click!", (x, y - 20),
                            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 3)

    cv2.imshow("Virtual Mouse", img)
    if cv2.waitKey(5) &amp; 0xFF == 27:  # ESC
        break

cap.release()
cv2.destroyAllWindows()

import cv2
import mediapipe as mp
import pyautogui

# 화면 해상도
screen_w, screen_h = pyautogui.size()

# MediaPipe 세팅
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(max_num_hands=1, min_detection_confidence=0.7)
mp_draw = mp.solutions.drawing_utils

cap = cv2.VideoCapture(0)
cap.set(3, 640)  # 너비
cap.set(4, 480)  # 높이

# 손가락 끝 인덱스
finger_tips = [4, 8, 12, 16, 20]

while True:
    success, img = cap.read()
    img = cv2.flip(img, 1)
    h, w, _ = img.shape
    img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    result = hands.process(img_rgb)

    if result.multi_hand_landmarks:
        for handLms in result.multi_hand_landmarks:
            mp_draw.draw_landmarks(img, handLms, mp_hands.HAND_CONNECTIONS)

            landmarks = handLms.landmark

            # 손가락 접힘 확인
            fingers = []
            fingers.append(landmarks[4].x &lt; landmarks[3].x)  # 엄지
            for tip in [8, 12, 16, 20]:
                fingers.append(landmarks[tip].y &gt; landmarks[tip - 2].y)

            # 손목 위치 → 마우스 커서 이동
            wrist = landmarks[0]
            cam_x = wrist.x
            cam_y = wrist.y

            # 🔧 손의 움직임이 좁은 범위에만 있는 걸 보정
            # (중앙 기준으로 좌우 50%, 상하 50%로 확대)
            # 즉, 손이 화면 중앙 근처에서만 움직여도 화면 전체 커버하게
            screen_x = int(screen_w * cam_x * 1.8)  # 확대 배율
            screen_y = int(screen_h * cam_y * 1.8)

            # 화면 밖으로 나가는 거 방지
            screen_x = min(screen_w - 1, max(0, screen_x))
            screen_y = min(screen_h - 1, max(0, screen_y))

            pyautogui.moveTo(screen_x, screen_y)

            # 손가락 5개 모두 접으면 클릭
            if fingers.count(True) == 5:
                pyautogui.click()
                cv2.putText(img, "Click!", (int(wrist.x * w), int(wrist.y * h) - 20),
                            cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 3)

    cv2.imshow("Virtual Mouse", img)
    if cv2.waitKey(5) &amp; 0xFF == 27:
        break

cap.release()
cv2.destroyAllWindows()
</code></pre>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4042233099/bb645bf18f50e6d6fa75e1f0403d3fc2/_9F6924FD_A37E_4785_8B4A_B3B52688C27A_.png" />
         <pubDate>2025-06-25 02:26:19 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3501191353</guid>
      </item>
      <item>
         <title>30214 엄승혁</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3502275601</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4047692548/14c3badf6e5d85f16c5227d3b1378d35/image.png" />
         <pubDate>2025-06-26 00:54:04 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3502275601</guid>
      </item>
      <item>
         <title>30214 엄승혁</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3502300898</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/1ErXUFmqz5IsBd6F_wFQLZj_OOnctX55EZJCtST-nAIs/edit?usp=sharing" />
         <pubDate>2025-06-26 01:11:18 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3502300898</guid>
      </item>
      <item>
         <title>30915 박주혁</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3502594944</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://docs.google.com/presentation/d/10ccvkQXkr7s6YSF1PAgPsSaQIoCYL0ZxNYVqfn8yXfk/edit?slide=id.g361c2bde0f3_0_0#slide=id.g361c2bde0f3_0_0" />
         <pubDate>2025-06-26 04:14:14 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3502594944</guid>
      </item>
      <item>
         <title>30915 박주혁</title>
         <author></author>
         <link>https://padlet.com/cs96960328/vision/wish/3502602807</link>
         <description><![CDATA[<p>import cv2</p><p>import mediapipe as mp</p><p>import math</p><p># Mediapipe 초기화</p><p>mp_hands = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.hands</p><p>mp_drawing = <a rel="noopener noreferrer nofollow" href="http://mp.solutions">mp.solutions</a>.drawing_utils</p><p>hands = mp_hands.Hands(</p><p>    max_num_hands=1,</p><p>    min_detection_confidence=0.7,</p><p>    min_tracking_confidence=0.5</p><p>)</p><p># 실험 상태 변수</p><p>experiment_started = False</p><p>selected_variable = None</p><p>adjusting = False</p><p>current_gesture = "None"</p><p># 각도 계산 함수 (사용 안 하지만 참고용)</p><p>def calculate_angle(a, b, c):</p><p>    ab = [a[0] - b[0], a[1] - b[1]]</p><p>    bc = [c[0] - b[0], c[1] - b[1]]</p><p>    dot = ab[0] <em> bc[0] + ab[1] </em> bc[1]</p><p>    det = ab[0] <em> bc[1] - ab[1] </em> bc[0]</p><p>    angle = math.atan2(det, dot) * 180.0 / math.pi</p><p>    return abs(angle)</p><p># 손가락 열림 감지</p><p>def detect_finger_open(landmarks, width, height):</p><p>    finger_tips = [4, 8, 12, 16, 20]</p><p>    finger_ips = [3, 7, 11, 15, 19]</p><p>    finger_names = ["Thumb", "Index", "Middle", "Ring", "Pinky"]</p><p>    open_fingers = []</p><p>    open_threshold = 160  # 각도 기준 (180에 가까울수록 더 곧게 펴짐)</p><p>    wrist = (landmarks[0].x <em> width, landmarks[0].y </em> height)</p><p>    for tip_idx, ip_idx, name in zip(finger_tips, finger_ips, finger_names):</p><p>        tip = (landmarks[tip_idx].x <em> width, landmarks[tip_idx].y </em> height)</p><p>        ip = (landmarks[ip_idx].x <em> width, landmarks[ip_idx].y </em> height)</p><p>        angle = calculate_angle(tip, ip, wrist)</p><p>        if angle &gt; open_threshold:</p><p>            open_fingers.append(name)</p><p>    return open_fingers</p><p># 제스처 인식</p><p>def recognize_gesture(open_fingers, landmarks, width, height):</p><p>    if len(open_fingers) == 5:</p><p>        return "Start_Experiment"</p><p>    elif len(open_fingers) == 0:</p><p>        return "Stop_Experiment"</p><p>    elif len(open_fingers) == 1 and "Index" in open_fingers:</p><p>        return "Select"</p><p>    # 엄지와 검지의 거리로 Pinch 감지</p><p>    thumb_tip = landmarks[4]</p><p>    index_tip = landmarks[8]</p><p>    distance = math.hypot((thumb_tip.x - index_tip.x) * width,</p><p>                          (thumb_tip.y - index_tip.y) * height)</p><p>    if distance &lt; 40:</p><p>        return "Pinch"</p><p>    return "None"</p><p># 제스처에 따른 동작 수행</p><p>def perform_action(gesture):</p><p>    global experiment_started, selected_variable, adjusting</p><p>    if gesture == "Start_Experiment":</p><p>        if not experiment_started:</p><p>            print("🧪 실험 시작!")</p><p>            experiment_started = True</p><p>            selected_variable = None</p><p>            adjusting = False</p><p>    elif gesture == "Stop_Experiment":</p><p>        if experiment_started:</p><p>            print("🛑 실험 종료! 데이터 저장 완료.")</p><p>            experiment_started = False</p><p>            selected_variable = None</p><p>            adjusting = False</p><p>    elif gesture == "Select" and experiment_started:</p><p>        print("👉 변수 선택: 온도")</p><p>        selected_variable = "온도"</p><p>        adjusting = False</p><p>    elif gesture == "Pinch" and selected_variable:</p><p>        if not adjusting:</p><p>            print(f"🤏 {selected_variable} 조절 시작")</p><p>            adjusting = True</p><p>        else:</p><p>            print(f"⚙️ {selected_variable} 값 조정 중...")</p><p>    elif gesture == "None":</p><p>        if adjusting:</p><p>            print("🔓 조절 종료")</p><p>        adjusting = False</p><p># 웹캠 실행</p><p>cap = cv2.VideoCapture(0)</p><p>while True:</p><p>    success, frame = <a rel="noopener noreferrer nofollow" href="http://cap.read">cap.read</a>()</p><p>    if not success:</p><p>        break</p><p>    frame = cv2.flip(frame, 1)</p><p>    h, w, _ = frame.shape</p><p>    image_rgb = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)</p><p>    result = hands.process(image_rgb)</p><p>    if result.multi_hand_landmarks:</p><p>        for hand_landmarks, handedness in zip(result.multi_hand_landmarks, result.multi_handedness):</p><p>            mp_drawing.draw_landmarks(frame, hand_landmarks, mp_hands.HAND_CONNECTIONS)</p><p>            open_fingers = detect_finger_open(hand_landmarks.landmark, w, h)</p><p>            gesture = recognize_gesture(open_fingers, hand_landmarks.landmark, w, h)</p><p>            if gesture != current_gesture:</p><p>                current_gesture = gesture</p><p>                perform_action(gesture)</p><p>            # 화면에 현재 상태 시각화</p><p>            cv2.putText(frame, f"Gesture: {gesture}", (10, 40),</p><p>                        cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 255, 0), 3)</p><p>            cv2.putText(frame, f"Experiment: {'ON' if experiment_started else 'OFF'}", (10, 80),</p><p>                        cv2.FONT_HERSHEY_SIMPLEX, 1.2, (255, 100, 0), 3)</p><p>            if selected_variable:</p><p>                cv2.putText(frame, f"Variable: {selected_variable}", (10, 120),</p><p>                            cv2.FONT_HERSHEY_SIMPLEX, 1.2, (100, 255, 255), 3)</p><p>            if adjusting:</p><p>                cv2.putText(frame, f"Adjusting: YES", (10, 160),</p><p>                            cv2.FONT_HERSHEY_SIMPLEX, 1.2, (0, 100, 255), 3)</p><p>    else:</p><p>        current_gesture = "None"</p><p>    cv2.imshow("Smart Lab Assistant - Gesture Control", frame)</p><p>    if cv2.waitKey(1) &amp; 0xFF == 27:  # ESC 키</p><p>        break</p><p>cap.release()</p><p>cv2.destroyAllWindows()</p><p><br/></p>]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/4048452634/054e0575c603de0581b41f99fd03cd6f/_____2025_06_26_132041.png" />
         <pubDate>2025-06-26 04:21:24 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3502602807</guid>
      </item>
      <item>
         <title>비전 1 수업게시판</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3674622017</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet.com/cs9636/1-opencv-gradio-vgvcl2m3lpbzsmh8" />
         <pubDate>2025-11-10 04:50:48 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3674622017</guid>
      </item>
      <item>
         <title>미디어 파이프 솔루션 사이트</title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3903571353</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://ai.google.dev/edge/mediapipe/solutions/guide?hl=ko" />
         <pubDate>2026-05-08 06:01:45 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3903571353</guid>
      </item>
      <item>
         <title></title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3903594749</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/483229584/fd9a88a878c592cd1b3719f25b20591f/image.png" />
         <pubDate>2026-05-08 06:17:24 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3903594749</guid>
      </item>
      <item>
         <title></title>
         <author>cs96960328</author>
         <link>https://padlet.com/cs96960328/vision/wish/3903595466</link>
         <description><![CDATA[]]></description>
         <enclosure url="https://padlet-uploads-usc1.storage.googleapis.com/483229584/3d5a7fc2557143b9caf586ad31853264/image.png" />
         <pubDate>2026-05-08 06:17:57 UTC</pubDate>
         <guid>https://padlet.com/cs96960328/vision/wish/3903595466</guid>
      </item>
   </channel>
</rss>
