Code für Computer Vision

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
pscottie101@aol.com
User
Beiträge: 2
Registriert: Donnerstag 15. Februar 2024, 19:36

Hallo zusammen,

ich habe grad folgende Aufgabe:
1. Code für das Abspielen einer Videosequenz
2. In der Videosequenz ist ein Fahrradfahrer zu sehen, welches auf die Camera zufährt
3. Das Fahrrad soll grün umrandet sein, mit der Angabe der Geschwindikeit und des Abstands über der Umrandung.

Das ist sowei programmiert. Das Problem ist, dass die KI das Fahrrad nur sehr schlecht erkennt. Ich habe es mit Hintergrundsubraktion MOG2 und Schwellenwerten versehen, aber die identifizierung hat sich kaum verbessert. Statt dessen erkennt die KI Objekte, welche sich nicht bewegen. Unten der Code. Kann mir jemand weiterhelfen? Ich kann auch gern das Video teilen. Langsam hau ich den Kopf gegen den Tisch...Danke bereits im Voraus!

# Location/Framing/Distance/Speed - correct

import matplotlib.image as mpimg
import matplotlib.pyplot as plt
import numpy as np
import cv2
%matplotlib inline
import torch

import cv2
import numpy as np
import time

def calculate_distance(p1, p2, scale):
# Calculates the distance in kilometers using a scaling from pixels to kilometers
pixel_distance = np.linalg.norm(np.array(p1) - np.array(p2))
return pixel_distance * scale

def calculate_speed(distance, time_diff):
# Calculates the speed in km/h.
if time_diff == 0:
return 0
return (distance / time_diff) * 3600

# Scaling from pixels to kilometers
PIXEL_TO_KM = 0.00000025

# Reading the video
cap = cv2.VideoCapture('C:/Users/Markus/anaconda3/bicycle2.mp4')

# Separate foreground (moving objects) from background
fgbg = cv2.createBackgroundSubtractorMOG2()

# Position of the static object
x_stat, y_stat, w_stat, h_stat = 500, 650, 50, 50

previous_time = time.time()
previous_center = None

# Schwellenwert für Bewegungsdistanz (in Pixeln)/Threshold for motion distance (in pixels)
movement_threshold = 10000

while cap.isOpened():
ret, frame = cap.read()
if not ret:
break

fgmask = fgbg.apply(frame)
contours, _ = cv2.findContours(fgmask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

for contour in contours:
if cv2.contourArea(contour) > 50000 < 100000 :
x, y, w, h = cv2.boundingRect(contour)
center_moving = (x + w // 2, y + h // 2)

# Prüfen, ob das Objekt sich genug bewegt hat
if prev_centers:
for prev_center in prev_centers:
dist = cv2.norm(prev_center, center)
if dist > movement_threshold:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.circle(frame, center, 5, (0, 0, 255), -1)
break

cv2.rectangle(frame, (x, y), (x + w, y + h), (0, 255, 0), 2)

center_static = (x_stat + w_stat // 2, y_stat + h_stat // 2)
cv2.line(frame, center_moving, center_static, (0, 0, 255), 2)

distance_km = calculate_distance(center_moving, center_static, PIXEL_TO_KM)
cv2.putText(frame, f'{distance_km:.5f} km', (x, y - 20), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

current_time = time.time()
if previous_center is not None:
time_diff = current_time - previous_time
speed_km_h = calculate_speed(calculate_distance(center_moving, previous_center, PIXEL_TO_KM), time_diff)
cv2.putText(frame, f'{speed_km_h:.2f} km/h', (x, y - 40), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)

previous_center = center_moving
previous_time = current_time

cv2.rectangle(frame, (x_stat, y_stat), (x_stat + w_stat, y_stat + h_stat), (255, 0, 0), 2)
cv2.imshow('Frame', frame)

if cv2.waitKey(1) & 0xFF == ord('q'):
break

cap.release()
cv2.destroyAllWindows()
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Was soll ``if cv2.contourArea(contour) > 50000 < 100000`` bewirken? Das ``< 100000`` ist sinnfrei, weil das nichts am Ergebnis des Tests ändert, denn 50000 < 100000`` gilt natürlich immer.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich sehe auch keine KI? Sowas hier https://journals.sagepub.com/doi/10.117 ... 1419829651 ist vielleicht ergiebig.
pscottie101@aol.com
User
Beiträge: 2
Registriert: Donnerstag 15. Februar 2024, 19:36

Hallo blackjack,

danke erstmal für die schnelle ANtwort.

Anfangs galt nur > 50000. Als ich dann merkte, dass die Umrandung sehr viele Objekte traf, die sich nicht/minimal bewegten, dachte ich, ich könnte den Range damit eingrenzen. Ok, war mir nicht bewusst.

Nun, da hier Python Bibliotheken im EInsatz sind mit cv2, dachte ich, es gehört hier herin. Aber danke für den Hinweis.

Gruß
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@pscottie101@aol.com: Das gehört schon hierher, aber es ist halt nix mit KI wie im Beitragstext steht. Auch wenn es ja gerade hip ist überall KI drauf zu schreiben was gar keine KI ist. 😉

``a op1 b op2 c`` ist äquivalent zu ``a op1 b and b op2 c``, das heisst konkret ``cv2.contourArea(contour) > 50000 and 50000 < 100000``, und der zweite Teil ist offensichtlich immer wahr. Das muss man also anders schreiben. So wie man das in der Mathematik auch machen würde. Da schreibt man ja auch nicht ``x > 10 < 100`` sondern ``10 < x < 100``.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Antworten