repository to manage all files for 1_2_oder_3 interaction game for Inf2/2 Interaktionen SoSe23 from Engert, Caliskan and Bachiri
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

CameraDetection.py 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. import cv2
  2. import numpy as np
  3. # from Track import nothing
  4. # Farbwerte für die Erkennung (Beispiel: Rot, Grün, Blau)
  5. colors = [(0, 0, 255), (0, 255, 0), (255, 0, 0)]
  6. color_names = ["Rot", "Gruen", "Blau"]
  7. # Farbgrenzen für die Erkennung
  8. lower_red = np.array([0, 100, 100])
  9. upper_red = np.array([10, 255, 255])
  10. lower_green = np.array([40, 100, 100])
  11. upper_green = np.array([70, 255, 255])
  12. lower_blue = np.array([90, 100, 100])
  13. upper_blue = np.array([130, 255, 255])
  14. # Funktion zur Farberkennung
  15. def erkennung_farben(img):
  16. hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
  17. results = []
  18. count_red = 0
  19. count_green = 0
  20. count_blue = 0
  21. for i, color in enumerate(colors):
  22. if i == 0:
  23. lower = lower_red
  24. upper = upper_red
  25. elif i == 1:
  26. lower = lower_green
  27. upper = upper_green
  28. elif i == 2:
  29. lower = lower_blue
  30. upper = upper_blue
  31. mask = cv2.inRange(hsv_img, lower, upper)
  32. # Farbfläche finden
  33. contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
  34. center = None
  35. count = 0
  36. for contour in contours:
  37. if count < 3:
  38. if cv2.contourArea(contour) > 100:
  39. # Schwerpunkt der Kontur berechnen
  40. M = cv2.moments(contour)
  41. if M["m00"] > 0:
  42. cX = int(M["m10"] / M["m00"])
  43. cY = int(M["m01"] / M["m00"])
  44. center = (cX, cY)
  45. count += 1
  46. # Rechteck zeichnen
  47. x, y, w, h = cv2.boundingRect(contour)
  48. cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)
  49. cv2.putText(img, color_names[i], (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)
  50. # Farbanzahl erhöhen
  51. if i == 0:
  52. count_red += 1
  53. elif i == 1:
  54. count_green += 1
  55. elif i == 2:
  56. count_blue += 1
  57. results.append(center)
  58. return img, results, count_red, count_green, count_blue
  59. # Funktion zur Positionsermittlung
  60. def ermittle_position(results, img_width):
  61. positions = []
  62. for result in results:
  63. if result is None:
  64. position = "Nicht gefunden"
  65. else:
  66. x = result[0]
  67. if x < img_width / 3:
  68. position = "Rechts"
  69. elif x < 2 * img_width / 3:
  70. position = "Mitte"
  71. else:
  72. position = "Links"
  73. positions.append(position)
  74. return positions
  75. # Hauptprogramm
  76. if __name__ == "__main__":
  77. # Videoquelle öffnen (kann auch eine Bilddatei sein)
  78. video = cv2.VideoCapture(1) # Hier "0" für die Kamera verwenden
  79. while True:
  80. # Einzelbild von der Videoquelle lesen
  81. ret, frame = video.read()
  82. # Fehlerbehandlung, wenn kein Bild gelesen werden kann
  83. if not ret:
  84. break
  85. # Farben erkennen
  86. farben_img, ergebnisse, count_red, count_green, count_blue = erkennung_farben(frame)
  87. # Anzahl der Farben anzeigen
  88. cv2.putText(farben_img, f"Rot: {count_red}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, colors[0], 2)
  89. cv2.putText(farben_img, f"Gruen: {count_green}", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, colors[1], 2)
  90. cv2.putText(farben_img, f"Blau: {count_blue}", (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 1, colors[2], 2)
  91. # Positionen ermitteln
  92. img_width = frame.shape[1]
  93. positionen = ermittle_position(ergebnisse, img_width)
  94. # Positionen anzeigen
  95. for i, position in enumerate(positionen):
  96. cv2.putText(farben_img, f"{color_names[i]}: {position}", (10, 150 + 30 * i),
  97. cv2.FONT_HERSHEY_SIMPLEX, 1, colors[i], 2)
  98. # Linien zeichnen
  99. cv2.line(farben_img, (img_width // 3, 0), (img_width // 3, frame.shape[0]), (0, 0, 0), 2)
  100. cv2.line(farben_img, (2 * img_width // 3, 0), (2 * img_width // 3, frame.shape[0]), (0, 0, 0), 2)
  101. # Bild anzeigen
  102. cv2.imshow("Farberkennung", farben_img)
  103. # Auf "q" drücken, um die Schleife zu beenden
  104. if cv2.waitKey(1) & 0xFF == ord('q'):
  105. break
  106. # Videoquelle und Fenster schließen
  107. video.release()
  108. cv2.destroyAllWindows()