반응형
- 본 내용은 python 3.10 버전을 이용하여 진행하였습니다.
- 시작 전 설정 필수
detector.findDistance 함수를 우클릭하여 정의로 이동을 눌러준 뒤
각 행에 z1, z2 값을 추가시켜 줍니다.
다시 코드를 작성해봅시다.
먼저 손 랜드마크 감지를 위하여 cvzone의 HandDetector 라이브러리 가져옵니다.
import cv2
from cvzone.HandTrackingModule import HandDetector
이후 스피커 음량을 조절하기 위하여 오디오 관련 라이브러리를 불러와 해당 정보를 포인터에 대입시킵니다.
from ctypes import cast,POINTER
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities ,IAudioEndpointVolume
devices=AudioUtilities.GetSpeakers() # 오디오 장치 정보를 가져옴
interface=devices.Activate(IAudioEndpointVolume._iid_,CLSCTX_ALL,None) # 오디오 장치 정보를 활성화
volume=cast(interface,POINTER(IAudioEndpointVolume)) # 오디오 장치 정보를 포인터로 변환
웹캠 기본 기능 및 HandDetector 객체를 불러옵니다.
cap = cv2.VideoCapture(0) # # 열린 웹캠의 정보 값을 cap에 전달
detector = HandDetector(maxHands = 1, detectionCon = 0.75) # 손을 찾는 객체 생성
영상 처리를 위해 영상을 반전시키고, 감지된 손의 엄지 랜드마크와 검지 랜드마크의 물리적인 거리값을 가져옵니다.
손 랜드마크의 자세한 값은 아래의 내용을 참조하시면 됩니다.
while cap.isOpened : # 카메라가 연결되었을 경우
ret, img = cap.read() # 카메라로부터 이미지를 읽어옴
if ret :
img = cv2.flip(img, 1) # 영상 반전시키기
hands, img = detector.findHands(img, flipType = False) # 영상에서 손 감지시키기
if len(hands) >= 1 : # 손이 1개 이상 감지되었을 경우
location=hands[0]['lmList'] # 감지시킨 손의 각 포인트 좌표값 알아오기, GPC 파일에 손가락 위치 정보값 있음
length_1, info_1, img_1 = detector.findDistance(location[4], location[8], img) # 엄지와 검지 값 받아오기
이렇게 엄지와 검지 사이의 거리 값이 일정 값 미만일 경우,
음량이 출력되는 영상의 높이를 기준으로 하여 엄지와 검지의 위치에 따라, 해당 값에 맞게 변경됩니다.
# 손 위치에 따라 볼륨 조절하기
if length_1 < 50 : # 만약 검지와 엄지 사이의 값이 50 미만일 경우
rel_x = location[4][1]/480 # 음량을 조절한다. 0 이하일 경우나, 1 이하일 경우에는 예외 처리하기
if rel_x > 1 :
rel_x = 1
elif rel_x < 0 :
rel_x = 0
volume.SetMasterVolumeLevel(int(28*(1-rel_x)-28), None)#0:max~ -65:0 # 볼륨 조절 명령어
이후 화면 출력 및 웹캠 종료 코드를 넣어줍니다.
cv2.imshow('view', img) # 이미지를 화면에 출력
if cv2.waitKey(1) == ord('q') : # q를 누르면 종료
break
아래는 전체 코드입니다.
더보기
"""
python 3.10.0
pip install opencv-python
pip install mediapipe
pip install cvzone # 해당 라이브러리 3.12에서 사용 불가능, tensorflow 설치 시 오류 발생
"""
import cv2
from cvzone.HandTrackingModule import HandDetector
from ctypes import cast,POINTER
from comtypes import CLSCTX_ALL
from pycaw.pycaw import AudioUtilities ,IAudioEndpointVolume
devices=AudioUtilities.GetSpeakers() # 오디오 장치 정보를 가져옴
interface=devices.Activate(IAudioEndpointVolume._iid_,CLSCTX_ALL,None) # 오디오 장치 정보를 활성화
volume=cast(interface,POINTER(IAudioEndpointVolume)) # 오디오 장치 정보를 포인터로 변환
cap = cv2.VideoCapture(0) # # 열린 웹캠의 정보 값을 cap에 전달
detector = HandDetector(maxHands = 1, detectionCon = 0.75) # 손을 찾는 객체 생성
while cap.isOpened : # 카메라가 연결되었을 경우
ret, img = cap.read() # 카메라로부터 이미지를 읽어옴
if ret :
img = cv2.flip(img, 1) # 영상 반전시키기
hands, img = detector.findHands(img, flipType = False) # 영상에서 손 감지시키기
if len(hands) >= 1 : # 손이 1개 이상 감지되었을 경우
location=hands[0]['lmList'] # 감지시킨 손의 각 포인트 좌표값 알아오기, GPC 파일에 손가락 위치 정보값 있음
length_1, info_1, img_1 = detector.findDistance(location[4], location[8], img) # 엄지와 검지 값 받아오기
# 손 위치에 따라 볼륨 조절하기
if length_1 < 50 : # 만약 검지와 엄지 사이의 값이 50 미만일 경우
rel_x = location[4][1]/480 # 음량을 조절한다. 0 이하일 경우나, 1 이하일 경우에는 예외 처리하기
if rel_x > 1 :
rel_x = 1
elif rel_x < 0 :
rel_x = 0
volume.SetMasterVolumeLevel(int(28*(1-rel_x)-28), None)#0:max~ -65:0 # 볼륨 조절 명령어
cv2.imshow('view', img) # 이미지를 화면에 출력
if cv2.waitKey(1) == ord('q') : # q를 누르면 종료
break
반응형
'공부를 함시다 > Python' 카테고리의 다른 글
[Python] 로컬 이미지를 클립보드에 복사하기 (0) | 2025.01.22 |
---|---|
[Python] 파이썬으로 원격 데스크톱 활성화 (0) | 2024.11.12 |
[Python] PoseDetector을 이용한 운동 횟수 세기 (0) | 2024.11.03 |
[Python] 얼굴 인식 후 배경 흐리게 처리하기 (0) | 2024.10.20 |
[Python] 웹캠 출력하기 (0) | 2024.08.04 |