Mit dieser Datei vlt vlt vlt vlt vlt vlt
vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt vlt
This commit is contained in:
parent
5992da411d
commit
159aa5e020
120
calibrate_touch_mouse_only.py
Normal file
120
calibrate_touch_mouse_only.py
Normal file
@ -0,0 +1,120 @@
|
||||
import cv2
|
||||
import json
|
||||
import numpy as np
|
||||
|
||||
CAM_INDEX = 0
|
||||
OUTPUT_FILE = "calibration.json"
|
||||
|
||||
# Reihenfolge: P1=oben links, P2=oben rechts, P3=unten rechts, P4=unten links
|
||||
POINT_NAMES = ["P1 (oben links)", "P2 (oben rechts)", "P3 (unten rechts)", "P4 (unten links)"]
|
||||
|
||||
|
||||
def dist(a, b):
|
||||
return np.linalg.norm(np.array(a) - np.array(b))
|
||||
|
||||
|
||||
def main():
|
||||
cap = cv2.VideoCapture(CAM_INDEX)
|
||||
if not cap.isOpened():
|
||||
print("❌ Kamera konnte nicht geöffnet werden!")
|
||||
return
|
||||
|
||||
print("📸 Kalibrierung gestartet (nur Maus)")
|
||||
print("----------------------------------")
|
||||
print("🖱 Linksklick = Punkt setzen")
|
||||
print("🖱 Ziehen = Punkt verschieben")
|
||||
print("🖱 Rechtsklick = Punkt löschen")
|
||||
print("💾 S / Enter = Speichern")
|
||||
print("❌ ESC = Abbrechen")
|
||||
print("----------------------------------")
|
||||
print("Bitte Punkte in dieser Reihenfolge setzen:")
|
||||
for i, name in enumerate(POINT_NAMES):
|
||||
print(f" {i+1}. {name}")
|
||||
|
||||
points = [None, None, None, None]
|
||||
dragging_index = None
|
||||
|
||||
def mouse_callback(event, mx, my, flags, param):
|
||||
nonlocal dragging_index, points
|
||||
|
||||
# Linksklick → Punkt setzen oder ziehen
|
||||
if event == cv2.EVENT_LBUTTONDOWN:
|
||||
# Prüfen ob Klick auf existierenden Punkt
|
||||
for i, p in enumerate(points):
|
||||
if p is not None and dist(p, (mx, my)) < 20:
|
||||
dragging_index = i
|
||||
return
|
||||
|
||||
# Neuen Punkt setzen
|
||||
for i in range(4):
|
||||
if points[i] is None:
|
||||
points[i] = (mx, my)
|
||||
print(f"✔ {POINT_NAMES[i]} gesetzt bei {points[i]}")
|
||||
return
|
||||
|
||||
# Dragging
|
||||
elif event == cv2.EVENT_MOUSEMOVE and dragging_index is not None:
|
||||
points[dragging_index] = (mx, my)
|
||||
|
||||
# Loslassen
|
||||
elif event == cv2.EVENT_LBUTTONUP:
|
||||
dragging_index = None
|
||||
|
||||
# Rechtsklick → Punkt löschen
|
||||
elif event == cv2.EVENT_RBUTTONDOWN:
|
||||
for i, p in enumerate(points):
|
||||
if p is not None and dist(p, (mx, my)) < 20:
|
||||
print(f"🗑 {POINT_NAMES[i]} gelöscht")
|
||||
points[i] = None
|
||||
return
|
||||
|
||||
cv2.namedWindow("Calibration")
|
||||
cv2.setMouseCallback("Calibration", mouse_callback)
|
||||
|
||||
while True:
|
||||
ok, frame = cap.read()
|
||||
if not ok:
|
||||
break
|
||||
frame = cv2.flip(frame, 1)
|
||||
|
||||
h, w, _ = frame.shape
|
||||
|
||||
# Punkte zeichnen
|
||||
for i, p in enumerate(points):
|
||||
if p is not None:
|
||||
cv2.circle(frame, p, 10, (0, 255, 255), -1)
|
||||
cv2.putText(frame, f"P{i+1}", (p[0] + 10, p[1] - 10),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0,255,255), 2)
|
||||
|
||||
# Polygon zeichnen wenn alle Punkte vorhanden
|
||||
if all(points):
|
||||
cv2.polylines(frame, [np.array(points, np.int32)], True, (0, 255, 0), 2)
|
||||
|
||||
# Hinweise
|
||||
cv2.putText(frame, "Setze P1,P2,P3,P4 mit der Maus | S=Speichern | ESC=Abbruch",
|
||||
(10, h - 20),
|
||||
cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,255,255), 1)
|
||||
|
||||
cv2.imshow("Calibration", frame)
|
||||
key = cv2.waitKey(10) & 0xFF
|
||||
|
||||
# Speichern
|
||||
if key in [ord('s'), 13]: # 's' oder Enter
|
||||
if None in points:
|
||||
print("⚠️ Nicht alle 4 Punkte wurden gesetzt!")
|
||||
else:
|
||||
with open(OUTPUT_FILE, "w") as f:
|
||||
json.dump(points, f)
|
||||
print("💾 Kalibrierung gespeichert:", points)
|
||||
break
|
||||
|
||||
if key == 27: # ESC
|
||||
print("❌ Kalibrierung abgebrochen")
|
||||
break
|
||||
|
||||
cap.release()
|
||||
cv2.destroyAllWindows()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
||||
Loading…
x
Reference in New Issue
Block a user