|
|
import math |
|
|
import keyinput |
|
|
import cv2 |
|
|
import mediapipe as mp |
|
|
mp_drawing = mp.solutions.drawing_utils |
|
|
mp_drawing_styles = mp.solutions.drawing_styles |
|
|
mp_hands = mp.solutions.hands |
|
|
font = cv2.FONT_HERSHEY_SIMPLEX |
|
|
|
|
|
cap = cv2.VideoCapture(0) |
|
|
|
|
|
with mp_hands.Hands(model_complexity=0,min_detection_confidence=0.5,min_tracking_confidence=0.5) as hands: |
|
|
while cap.isOpened(): |
|
|
success, image = cap.read() |
|
|
if not success: |
|
|
print("Ignoring empty camera frame.") |
|
|
continue |
|
|
|
|
|
image.flags.writeable = False |
|
|
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) |
|
|
results = hands.process(image) |
|
|
imageHeight, imageWidth, _ = image.shape |
|
|
|
|
|
image.flags.writeable = True |
|
|
image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) |
|
|
co=[] |
|
|
if results.multi_hand_landmarks: |
|
|
for hand_landmarks in results.multi_hand_landmarks: |
|
|
mp_drawing.draw_landmarks(image,hand_landmarks,mp_hands.HAND_CONNECTIONS,mp_drawing_styles.get_default_hand_landmarks_style(),mp_drawing_styles.get_default_hand_connections_style()) |
|
|
for point in mp_hands.HandLandmark: |
|
|
if str(point) == "HandLandmark.WRIST": |
|
|
normalizedLandmark = hand_landmarks.landmark[point] |
|
|
pixelCoordinatesLandmark = mp_drawing._normalized_to_pixel_coordinates(normalizedLandmark.x, normalizedLandmark.y, imageWidth, imageHeight) |
|
|
|
|
|
try: |
|
|
co.append(list(pixelCoordinatesLandmark)) |
|
|
except: |
|
|
continue |
|
|
|
|
|
if len(co) == 2: |
|
|
xm, ym = (co[0][0] + co[1][0]) / 2, (co[0][1] + co[1][1]) / 2 |
|
|
radius = 150 |
|
|
try: |
|
|
m=(co[1][1]-co[0][1])/(co[1][0]-co[0][0]) |
|
|
except: |
|
|
continue |
|
|
a = 1 + m ** 2 |
|
|
b = -2 * xm - 2 * co[0][0] * (m ** 2) + 2 * m * co[0][1] - 2 * m * ym |
|
|
c = xm ** 2 + (m ** 2) * (co[0][0] ** 2) + co[0][1] ** 2 + ym ** 2 - 2 * co[0][1] * ym - 2 * co[0][1] * co[0][0] * m + 2 * m * ym * co[0][0] - 22500 |
|
|
xa = (-b + (b ** 2 - 4 * a * c) ** 0.5) / (2 * a) |
|
|
xb = (-b - (b ** 2 - 4 * a * c) ** 0.5) / (2 * a) |
|
|
ya = m * (xa - co[0][0]) + co[0][1] |
|
|
yb = m * (xb - co[0][0]) + co[0][1] |
|
|
if m!=0: |
|
|
ap = 1 + ((-1/m) ** 2) |
|
|
bp = -2 * xm - 2 * xm * ((-1/m) ** 2) + 2 * (-1/m) * ym - 2 * (-1/m) * ym |
|
|
cp = xm ** 2 + ((-1/m) ** 2) * (xm ** 2) + ym ** 2 + ym ** 2 - 2 * ym * ym - 2 * ym * xm * (-1/m) + 2 * (-1/m) * ym * xm - 22500 |
|
|
try: |
|
|
xap = (-bp + (bp ** 2 - 4 * ap * cp) ** 0.5) / (2 * ap) |
|
|
xbp = (-bp - (bp ** 2 - 4 * ap * cp) ** 0.5) / (2 * ap) |
|
|
yap = (-1 / m) * (xap - xm) + ym |
|
|
ybp = (-1 / m) * (xbp - xm) + ym |
|
|
|
|
|
except: |
|
|
continue |
|
|
|
|
|
cv2.circle(img=image, center=(int(xm), int(ym)), radius=radius, color=(195, 255, 62), thickness=15) |
|
|
|
|
|
l = (int(math.sqrt((co[0][0] - co[1][0]) ** 2 * (co[0][1] - co[1][1]) ** 2)) - 150) // 2 |
|
|
cv2.line(image, (int(xa), int(ya)), (int(xb), int(yb)), (195, 255, 62), 20) |
|
|
if co[0][0] > co[1][0] and co[0][1]>co[1][1] and co[0][1] - co[1][1] > 65: |
|
|
print("Left - a") |
|
|
keyinput.release_key('s') |
|
|
keyinput.release_key('d') |
|
|
keyinput.press_key('a') |
|
|
cv2.line(image, (int(xbp), int(ybp)), (int(xm), int(ym)), (195, 255, 62), 20) |
|
|
|
|
|
|
|
|
elif co[1][0] > co[0][0] and co[1][1]> co[0][1] and co[1][1] - co[0][1] > 65: |
|
|
print("Left - a") |
|
|
keyinput.release_key('s') |
|
|
keyinput.release_key('d') |
|
|
keyinput.press_key('a') |
|
|
cv2.line(image, (int(xbp), int(ybp)), (int(xm), int(ym)), (195, 255, 62), 20) |
|
|
|
|
|
|
|
|
elif co[0][0] > co[1][0] and co[1][1]> co[0][1] and co[1][1] - co[0][1] > 65: |
|
|
print("Right - d") |
|
|
keyinput.release_key('s') |
|
|
keyinput.release_key('a') |
|
|
keyinput.press_key('d') |
|
|
cv2.line(image, (int(xap), int(yap)), (int(xm), int(ym)), (195, 255, 62), 20) |
|
|
|
|
|
elif co[1][0] > co[0][0] and co[0][1]> co[1][1] and co[0][1] - co[1][1] > 65: |
|
|
print("Right - d") |
|
|
keyinput.release_key('s') |
|
|
keyinput.release_key('a') |
|
|
keyinput.press_key('d') |
|
|
cv2.line(image, (int(xap), int(yap)), (int(xm), int(ym)), (195, 255, 62), 20) |
|
|
|
|
|
else: |
|
|
print("Straight - w") |
|
|
keyinput.release_key('s') |
|
|
keyinput.release_key('a') |
|
|
keyinput.release_key('d') |
|
|
keyinput.press_key('w') |
|
|
if ybp>yap: |
|
|
cv2.line(image, (int(xbp), int(ybp)), (int(xm), int(ym)), (195, 255, 62), 20) |
|
|
else: |
|
|
cv2.line(image, (int(xap), int(yap)), (int(xm), int(ym)), (195, 255, 62), 20) |
|
|
|
|
|
if len(co)==1: |
|
|
print("Back - s") |
|
|
keyinput.release_key('a') |
|
|
keyinput.release_key('d') |
|
|
keyinput.release_key('w') |
|
|
keyinput.press_key('s') |
|
|
|
|
|
cv2.imshow('MediaPipe Hands', cv2.flip(image, 1)) |
|
|
cv2.waitKey(1) |
|
|
|
|
|
|
|
|
if cv2.waitKey(5) & 0xFF == ord('q'): |
|
|
break |
|
|
cap.release() |