Open mifinn85 opened 2 months ago
Hi , i hope you are doing great
The Python code used for detecting and tracking the hand, as well as sending the data via the network, is built on the foundation provided by the YouTuber @murtazahassan, I'd like to give credit to their work for this part of the project , here is the full video : Full Tutorial
Main.py
from cvzone.HandTrackingModule import HandDetector
import cv2
import socket
cap = cv2.VideoCapture(0)
cap.set(3, 1280)
cap.set(4, 720)
success, img = cap.read()
h, w, _ = img.shape
detector = HandDetector(detectionCon=0.8, maxHands=2)
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
serverAddressPort = ("127.0.0.1", 5052)
while True:
# Get image frame
success, img = cap.read()
# Find the hand and its landmarks
hands, img = detector.findHands(img) # with draw
# hands = detector.findHands(img, draw=False) # without draw
data = []
if hands:
# Hand 1
hand = hands[0]
lmList = hand["lmList"] # List of 21 Landmark points
for lm in lmList:
data.extend([lm[0], h - lm[1], lm[2]])
sock.sendto(str.encode(str(data)), serverAddressPort)
# Display
cv2.imshow("Image", img)
cv2.waitKey(1)
HandTracking.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class HandTracking : MonoBehaviour
{
// Start is called before the first frame update
public UDPReceive udpReceive;
public GameObject[] handPoints;
void Start()
{
}
// Update is called once per frame
void Update()
{
string data = udpReceive.data;
data = data.Remove(0, 1);
data = data.Remove(data.Length-1, 1);
print(data);
string[] points = data.Split(',');
print(points[0]);
//0 1*3 2*3
//x1,y1,z1,x2,y2,z2,x3,y3,z3
for ( int i = 0; i<21; i++)
{
float x = 7-float.Parse(points[i * 3])/100;
float y = float.Parse(points[i * 3 + 1]) / 100;
float z = float.Parse(points[i * 3 + 2]) / 100;
handPoints[i].transform.localPosition = new Vector3(x, y, z);
}
}
}
LineCode.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class LineCode : MonoBehaviour
{
LineRenderer lineRenderer;
public Transform origin;
public Transform destination;
// Start is called before the first frame update
void Start()
{
lineRenderer = GetComponent<LineRenderer>();
lineRenderer.startWidth = 0.1f;
lineRenderer.endWidth = 0.1f;
}
// Update is called once per frame
void Update()
{
lineRenderer.SetPosition(0, origin.position);
lineRenderer.SetPosition(1, destination.position);
}
}
Thank you once again for your feedback and patience.
Best regards, Djekoune Imad Eddine .
Hi There,
There is no py script in the repo, was this intentional or would you be able to share that please?