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 5.0KB

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