nsai-games / steering.py
nisharg nargund
Upload 3 files
c20cbc8
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
# 0 For webcam input:
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()