123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165 |
- import cv2
- import numpy as np
-
- # from Track import nothing
- # # Farbwerte für die Erkennung (Beispiel: Rot, Grün, Blau)
- colors = [(0, 0, 255), (0, 255, 0), (255, 0, 0)]
- color_names = ["Rot", "Gruen", "Blau"]
-
- # video cap
-
-
- # Farbgrenzen für die Erkennung
- lower_red = np.array([80, 160, 150])
- upper_red = np.array([255, 255, 255])
-
- lower_green = np.array([40, 50, 160])
- upper_green = np.array([80, 255, 255])
-
- lower_blue = np.array([95, 180, 90])
- upper_blue = np.array([130, 255, 255])
-
- CURRENT_SCORES= {'score_red': 0,
- 'score_green': 0,
- 'score_blue': 0
- }
-
- # Funktion zur Farberkennung
- def erkennung_farben(img):
- hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
- results = []
-
- count_red = 0
- count_green = 0
- count_blue = 0
-
- for i, color in enumerate(colors):
- if i == 0:
- lower = lower_red
- upper = upper_red
- elif i == 1:
- lower = lower_green
- upper = upper_green
- elif i == 2:
- lower = lower_blue
- upper = upper_blue
-
- mask = cv2.inRange(hsv_img, lower, upper)
-
- # Farbfläche finden
- contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
- center = None
- count = 0
-
- for contour in contours:
- if count < 3:
- if cv2.contourArea(contour) > 100:
- # Schwerpunkt der Kontur berechnen
- M = cv2.moments(contour)
- if M["m00"] > 0:
- cX = int(M["m10"] / M["m00"])
- cY = int(M["m01"] / M["m00"])
- center = (cX, cY)
- count += 1
- # Rechteck zeichnen
- x, y, w, h = cv2.boundingRect(contour)
- cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)
- cv2.putText(img, color_names[i], (x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, color, 2)
-
- # Farbanzahl erhöhen
- if i == 0:
- count_red += 1
- elif i == 1:
- count_green += 1
- elif i == 2:
- count_blue += 1
-
-
-
- results.append(center)
-
- return img, results, count_red, count_green, count_blue
-
- # Funktion zur Positionsermittlung
- def ermittle_position(results, img_width):
- positions = []
-
- # pos_to_num = {"Rechts": 3,
- # "Mitte": 2,
- # "Links": 1,
- # "Nicht gefunden": 0}
-
- for result in results:
- if result is None:
- position = 0
- else:
- x = result[0]
- if x < img_width / 3:
- position = 3
- elif x < 2 * img_width / 3:
- position = 2
- else:
- position = 1
-
- positions.append(position)
- return positions
-
- # def count_colors(my_game: Game, red: int, green: int, blue: int) -> None:
- # currrent_scores = {'score_red': red,
- # 'score_green': green,
- # 'score_blue': blue
- # }
- # my_game.set_scoreboard(currrent_scores)
-
-
- def main():
- # Videoquelle öffnen (kann auch eine Bilddatei sein)
- video = cv2.VideoCapture(0) # Hier "0" für die Kamera verwenden
-
- while True:
-
- ret, frame = video.read(0)
-
- # Fehlerbehandlung, wenn kein Bild gelesen werden kann
- if not ret:
- break
- # Farben erkennen
- farben_img, ergebnisse, count_red, count_green, count_blue = erkennung_farben(frame)
-
- # Add counted colours to the scoreboard in the correct field
-
- # count_colors(count_red, count_green, count_blue)
-
-
- # Anzahl der Farben anzeigen
- # cv2.putText(farben_img, f"Rot: {count_red}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, colors[0], 2)
- # cv2.putText(farben_img, f"Gruen: {count_green}", (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 1, colors[1], 2)
- # cv2.putText(farben_img, f"Blau: {count_blue}", (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 1, colors[2], 2)
-
- # Positionen ermitteln
- img_width = frame.shape[1]
- positionen = ermittle_position(ergebnisse, img_width)
-
- # Positionen anzeigen
- for i, position in enumerate(positionen):
- cv2.putText(farben_img, f"{color_names[i]}: {position}", (10, 150 + 30 * i),
- cv2.FONT_HERSHEY_SIMPLEX, 1, colors[i], 2)
-
- # Linien zeichnen
- cv2.line(farben_img, (img_width // 3, 0), (img_width // 3, frame.shape[0]), (0, 0, 0), 2)
- cv2.line(farben_img, (2 * img_width // 3, 0), (2 * img_width // 3, frame.shape[0]), (0, 0, 0), 2)
-
- # Bild anzeigen
- cv2.imshow("Farberkennung", farben_img)
-
- # Auf "q" drücken, um die Schleife zu beenden
- if cv2.waitKey(1) & 0xFF == ord('q'):
- break
-
- # Videoquelle und Fenster schließen
- video.release()
- cv2.destroyAllWindows()
-
-
- if __name__ == "__main__":
- main()
|