# Camera Erkennung

# Links für Raspberry Pi einrichtung

Benutztes Modell: Yolo 26n

[Installationsanleitung](https://docs.ultralytics.com/quickstart/)

Benötigte Applications:

[Pytorch](https://www.ultralytics.com/glossary/pytorch)

[Ultralytics](https://pypi.org/project/ultralytics/#files)

Python Version 3.8 oder Älter

# Verläufiger Code für die Kameraerkennung mit mqtt übertragung

<div id="bkmrk-import-cv2-import-pa" style="color: #839496; background-color: #002b36; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div style="color: #839496; background-color: #002b36; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div style="color: #839496; background-color: #002b36; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div><span style="color: #859900;">Code erstellt/angepasst mit Perplexity/Claude</span></div><div></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">ssl</span></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">math</span></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">paho</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">mqtt</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">client</span><span style="color: #839496;"> </span><span style="color: #859900;">as</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">mqtt</span></div><div><span style="color: #859900;">from</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">ultralytics</span><span style="color: #839496;"> </span><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">YOLO</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Einstellungen ------------------</span></div>  
<div><span style="color: #268bd2;">MODEL\_PATH</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">r</span><span style="color: #dc322f;">"C:</span><span style="color: #cb4b16;">\\C</span><span style="color: #dc322f;">am</span><span style="color: #cb4b16;">\\y</span><span style="color: #dc322f;">olo26n.pt"</span></div><div><span style="color: #268bd2;">SOURCE</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">1</span></div>  
<div><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #d33682;">300</span><span style="color: #839496;">, </span><span style="color: #d33682;">400</span><span style="color: #839496;">)</span></div><div><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #d33682;">200</span><span style="color: #839496;">, </span><span style="color: #d33682;">100</span><span style="color: #839496;">)</span></div><div><span style="color: #268bd2;">LINE\_BUFFER</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">30</span></div>  
<div><span style="color: #268bd2;">MIN\_MOVE\_PIXELS</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Logik-Variablen ------------------</span></div>  
<div><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span></div><div><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> {}</span></div><div><span style="color: #268bd2;">person\_states</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> {}</span></div><div><span style="color: #268bd2;">crossed\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">set</span><span style="color: #839496;">()</span></div>  
  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Hilfsfunktionen ------------------</span></div>  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">point\_side\_of\_line</span><span style="color: #839496;">(px, py, x1, y1, x2, y2):</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">return</span><span style="color: #839496;"> (x2 </span><span style="color: #859900;">-</span><span style="color: #839496;"> x1) </span><span style="color: #859900;">\*</span><span style="color: #839496;"> (py </span><span style="color: #859900;">-</span><span style="color: #839496;"> y1) </span><span style="color: #859900;">-</span><span style="color: #839496;"> (y2 </span><span style="color: #859900;">-</span><span style="color: #839496;"> y1) </span><span style="color: #859900;">\*</span><span style="color: #839496;"> (px </span><span style="color: #859900;">-</span><span style="color: #839496;"> x1)</span></div>  
  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">get\_zone</span><span style="color: #839496;">(px, py):</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">val</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">point\_side\_of\_line</span><span style="color: #839496;">(px, py, </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\])</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">length</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">math</span><span style="color: #839496;">.</span><span style="color: #268bd2;">sqrt</span><span style="color: #839496;">((</span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\]</span><span style="color: #859900;">-</span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\])</span><span style="color: #859900;">\*\*</span><span style="color: #d33682;">2</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\]</span><span style="color: #859900;">-</span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\])</span><span style="color: #859900;">\*\*</span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">dist</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">abs</span><span style="color: #839496;">(</span><span style="color: #268bd2;">val</span><span style="color: #839496;">) </span><span style="color: #859900;">/</span><span style="color: #839496;"> </span><span style="color: #268bd2;">length</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">dist</span><span style="color: #839496;"> </span><span style="color: #859900;">&lt;</span><span style="color: #839496;"> </span><span style="color: #268bd2;">LINE\_BUFFER</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">return</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"zone"</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">return</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"right"</span><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">val</span><span style="color: #839496;"> </span><span style="color: #859900;">&gt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;"> </span><span style="color: #859900;">else</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"left"</span></div>  
  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">draw\_info</span><span style="color: #839496;">(frame):</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">line</span><span style="color: #839496;">(frame, </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">, (</span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">), </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">putText</span><span style="color: #839496;">(frame, </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"Raum: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">, (</span><span style="color: #d33682;">10</span><span style="color: #839496;">, </span><span style="color: #d33682;">30</span><span style="color: #839496;">),</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">FONT\_HERSHEY\_SIMPLEX</span><span style="color: #839496;">, </span><span style="color: #d33682;">1</span><span style="color: #839496;">, (</span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">), </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div>  
  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Hauptprogramm ------------------</span></div>  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">main</span><span style="color: #839496;">():</span></div><div><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">global</span><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;">, </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">, </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">, </span><span style="color: #268bd2;">crossed\_ids</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">model</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">YOLO</span><span style="color: #839496;">(</span><span style="color: #268bd2;">MODEL\_PATH</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">mqtt</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">Client</span><span style="color: #839496;">(callback\_api\_version</span><span style="color: #859900;">=</span><span style="color: #cb4b16;">mqtt</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">CallbackAPIVersion</span><span style="color: #839496;">.</span><span style="color: #268bd2;">VERSION2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">username\_pw\_set</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"testuser"</span><span style="color: #839496;">, </span><span style="color: #2aa198;">"O#%~54{Kf{-c-7t"</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">tls\_set</span><span style="color: #839496;">(tls\_version</span><span style="color: #859900;">=</span><span style="color: #cb4b16;">ssl</span><span style="color: #839496;">.</span><span style="color: #268bd2;">PROTOCOL\_TLS\_CLIENT</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">connect</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"5ea1e51a4f614745a394b1edd0259a6d.s1.eu.hivemq.cloud"</span><span style="color: #839496;">, </span><span style="color: #d33682;">8883</span><span style="color: #839496;">, </span><span style="color: #d33682;">60</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">loop\_start</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"Starte Kamera... Drücke 'q' zum Beenden"</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">for</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #268bd2;">model</span><span style="color: #839496;">.</span><span style="color: #268bd2;">track</span><span style="color: #839496;">(</span></div><div><span style="color: #839496;"> source</span><span style="color: #859900;">=</span><span style="color: #268bd2;">SOURCE</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> show</span><span style="color: #859900;">=</span><span style="color: #b58900;">False</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> stream</span><span style="color: #859900;">=</span><span style="color: #b58900;">True</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> persist</span><span style="color: #859900;">=</span><span style="color: #b58900;">True</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> classes</span><span style="color: #859900;">=</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\],</span></div><div><span style="color: #839496;"> conf</span><span style="color: #859900;">=</span><span style="color: #d33682;">0.5</span><span style="color: #839496;">, </span><span style="color: #586e75; font-style: italic;">\# ← reduzierter Schwellwert</span></div><div><span style="color: #839496;"> verbose</span><span style="color: #859900;">=</span><span style="color: #b58900;">False</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> ):</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">frame</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">plot</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">draw\_info</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;"> </span><span style="color: #859900;">is</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #b58900;">None</span><span style="color: #839496;"> </span><span style="color: #859900;">and</span><span style="color: #839496;"> </span><span style="color: #268bd2;">len</span><span style="color: #839496;">(</span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">) </span><span style="color: #859900;">&gt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">boxes</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">.</span><span style="color: #268bd2;">id</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">is</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #b58900;">None</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">active\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">set</span><span style="color: #839496;">()</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">for</span><span style="color: #839496;"> </span><span style="color: #268bd2;">box</span><span style="color: #839496;">, </span><span style="color: #268bd2;">tid</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">zip</span><span style="color: #839496;">(</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">.</span><span style="color: #268bd2;">xyxy</span><span style="color: #839496;">, </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;">):</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">(</span><span style="color: #268bd2;">tid</span><span style="color: #839496;">.</span><span style="color: #268bd2;">item</span><span style="color: #839496;">())</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">active\_ids</span><span style="color: #839496;">.</span><span style="color: #268bd2;">add</span><span style="color: #839496;">(</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">x1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">y1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">x2</span><span style="color: #839496;">, </span><span style="color: #268bd2;">y2</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">box</span><span style="color: #839496;">.</span><span style="color: #268bd2;">tolist</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">((</span><span style="color: #268bd2;">x1</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #268bd2;">x2</span><span style="color: #839496;">) </span><span style="color: #859900;">/</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">cy</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">((</span><span style="color: #268bd2;">y1</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #268bd2;">y2</span><span style="color: #839496;">) </span><span style="color: #859900;">/</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">circle</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">, (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">), </span><span style="color: #d33682;">4</span><span style="color: #839496;">, (</span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">), </span><span style="color: #859900;">-</span><span style="color: #d33682;">1</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">putText</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">, </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">, (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;"> </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span><span style="color: #839496;">),</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">FONT\_HERSHEY\_SIMPLEX</span><span style="color: #839496;">, </span><span style="color: #d33682;">0.5</span><span style="color: #839496;">, (</span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">), </span><span style="color: #d33682;">1</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">get\_zone</span><span style="color: #839496;">(</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">!=</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"zone"</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\] </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">else</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\]</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">prev\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"left"</span><span style="color: #839496;"> </span><span style="color: #859900;">and</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"right"</span><span style="color: #839496;">) </span><span style="color: #859900;">or</span><span style="color: #839496;"> </span><span style="color: #dc322f;">\\</span></div><div><span style="color: #839496;"> (</span><span style="color: #268bd2;">prev\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"right"</span><span style="color: #839496;"> </span><span style="color: #859900;">and</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"left"</span><span style="color: #839496;">):</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #268bd2;">crossed\_ids</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">crossed\_ids</span><span style="color: #839496;">.</span><span style="color: #268bd2;">add</span><span style="color: #839496;">(</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"right"</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">-=</span><span style="color: #839496;"> </span><span style="color: #d33682;">1</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">&lt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;"> EXITED, Raum: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">publish</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"raum/personen"</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">,event=EXIT,raum=</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">else</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">+=</span><span style="color: #839496;"> </span><span style="color: #d33682;">1</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;"> ENTERED, Raum: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">publish</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"raum/personen"</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">,event=ENTER,raum=</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span><span style="color: #839496;"> </span><span style="color: #859900;">!=</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"zone"</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\] </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">current\_zone</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\] </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">gone\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">crossed\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #268bd2;">active\_ids</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">crossed\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">-=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">gone\_ids</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">for</span><span style="color: #839496;"> </span><span style="color: #268bd2;">gid</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> (</span><span style="color: #cb4b16;">set</span><span style="color: #839496;">(</span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">.</span><span style="color: #268bd2;">keys</span><span style="color: #839496;">()) </span><span style="color: #859900;">|</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">set</span><span style="color: #839496;">(</span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">.</span><span style="color: #268bd2;">keys</span><span style="color: #839496;">())) </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #268bd2;">active\_ids</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">person\_states</span><span style="color: #839496;">.</span><span style="color: #268bd2;">pop</span><span style="color: #839496;">(</span><span style="color: #268bd2;">gid</span><span style="color: #839496;">, </span><span style="color: #b58900;">None</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">.</span><span style="color: #268bd2;">pop</span><span style="color: #839496;">(</span><span style="color: #268bd2;">gid</span><span style="color: #839496;">, </span><span style="color: #b58900;">None</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">imshow</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"YOLO Room Counter"</span><span style="color: #839496;">, </span><span style="color: #268bd2;">frame</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">waitKey</span><span style="color: #839496;">(</span><span style="color: #d33682;">1</span><span style="color: #839496;">) </span><span style="color: #859900;">&amp;</span><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">0x</span><span style="color: #d33682;">FF</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #268bd2;">ord</span><span style="color: #839496;">(</span><span style="color: #2aa198;">'q'</span><span style="color: #839496;">):</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">break</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">destroyAllWindows</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">loop\_stop</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">mqtt\_client</span><span style="color: #839496;">.</span><span style="color: #268bd2;">disconnect</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"</span><span style="color: #cb4b16;">\\n</span><span style="color: #2aa198;">Finale Zählerstände: Raum=</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div>  
  
<div><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">\_\_name\_\_</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"\_\_main\_\_"</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">main</span><span style="color: #839496;">()</span></div></div></div></div>

# Stabiler Code vor mqtt ergänzung

<div id="bkmrk-import-cv2-from-ultr" style="color: #839496; background-color: #002b36; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span></div><div><span style="color: #859900;">from</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">ultralytics</span><span style="color: #839496;"> </span><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">YOLO</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Einstellungen ------------------</span></div>  
<div><span style="color: #268bd2;">MODEL\_PATH</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">r</span><span style="color: #dc322f;">"C:</span><span style="color: #cb4b16;">\\C</span><span style="color: #dc322f;">am</span><span style="color: #cb4b16;">\\y</span><span style="color: #dc322f;">olo26n.pt"</span><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Pfad zu deinem .pt</span></div><div><span style="color: #268bd2;">SOURCE</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# 0 = Standard-Webcam</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# Linie (Türschwelle) im Bild anpassen!</span></div><div><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #d33682;">300</span><span style="color: #839496;">, </span><span style="color: #d33682;">400</span><span style="color: #839496;">) </span><span style="color: #586e75; font-style: italic;">\# Punkt 1 (x1, y1)</span></div><div><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #d33682;">200</span><span style="color: #839496;">, </span><span style="color: #d33682;">100</span><span style="color: #839496;">) </span><span style="color: #586e75; font-style: italic;">\# Punkt 2 (x2, y2)</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# Minimale Bewegung, damit ein Seitenwechsel gezählt wird</span></div><div><span style="color: #268bd2;">MIN\_MOVE\_PIXELS</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span></div>  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Logik-Variablen ------------------</span></div>  
<div><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span></div><div><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> {} </span><span style="color: #586e75; font-style: italic;">\# {track\_id: (x, y)}</span></div>  
  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Hilfsfunktionen ------------------</span></div>  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">point\_side\_of\_line</span><span style="color: #839496;">(px, py, x1, y1, x2, y2):</span></div><div><span style="color: #839496;"> </span><span style="color: #2aa198;">"""</span></div><div><span style="color: #2aa198;"> Gibt das Vorzeichen der Punktlage relativ zur Linie zurück.</span></div><div><span style="color: #2aa198;"> &gt;0: eine Seite, &lt;0: andere Seite, 0: genau auf der Linie.</span></div><div><span style="color: #2aa198;"> """</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">return</span><span style="color: #839496;"> (x2 </span><span style="color: #859900;">-</span><span style="color: #839496;"> x1) </span><span style="color: #859900;">\*</span><span style="color: #839496;"> (py </span><span style="color: #859900;">-</span><span style="color: #839496;"> y1) </span><span style="color: #859900;">-</span><span style="color: #839496;"> (y2 </span><span style="color: #859900;">-</span><span style="color: #839496;"> y1) </span><span style="color: #859900;">\*</span><span style="color: #839496;"> (px </span><span style="color: #859900;">-</span><span style="color: #839496;"> x1)</span></div>  
  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">draw\_info</span><span style="color: #839496;">(frame):</span></div><div><span style="color: #839496;"> </span><span style="color: #2aa198;">"""Zähler und Linie ins Bild zeichnen."""</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">line</span><span style="color: #839496;">(frame, </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">, (</span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">), </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">putText</span><span style="color: #839496;">(frame, </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"IN: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">, (</span><span style="color: #d33682;">10</span><span style="color: #839496;">, </span><span style="color: #d33682;">30</span><span style="color: #839496;">),</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">FONT\_HERSHEY\_SIMPLEX</span><span style="color: #839496;">, </span><span style="color: #d33682;">1</span><span style="color: #839496;">, (</span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">), </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div>  
  
<div><span style="color: #586e75; font-style: italic;">\# ------------------ Hauptprogramm ------------------</span></div>  
<div><span style="color: #93a1a1; font-weight: bold;">def</span><span style="color: #839496;"> </span><span style="color: #268bd2;">main</span><span style="color: #839496;">():</span></div><div><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">global</span><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;">, </span><span style="color: #268bd2;">last\_positions</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Modell laden</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">model</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">YOLO</span><span style="color: #839496;">(</span><span style="color: #268bd2;">MODEL\_PATH</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"Starte Kamera... Drücke 'q' zum Beenden"</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Tracking-Loop</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">for</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #268bd2;">model</span><span style="color: #839496;">.</span><span style="color: #268bd2;">track</span><span style="color: #839496;">(</span></div><div><span style="color: #839496;"> source</span><span style="color: #859900;">=</span><span style="color: #268bd2;">SOURCE</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> show</span><span style="color: #859900;">=</span><span style="color: #b58900;">False</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> stream</span><span style="color: #859900;">=</span><span style="color: #b58900;">True</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> persist</span><span style="color: #859900;">=</span><span style="color: #b58900;">True</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> classes</span><span style="color: #859900;">=</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #586e75; font-style: italic;">\# nur "person"</span></div><div><span style="color: #839496;"> verbose</span><span style="color: #859900;">=</span><span style="color: #b58900;">False</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> ):</span></div><div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Bild holen (mit eingezeichneten Boxen)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">frame</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">plot</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">draw\_info</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Boxen / Tracks auswerten</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;"> </span><span style="color: #859900;">is</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #b58900;">None</span><span style="color: #839496;"> </span><span style="color: #859900;">and</span><span style="color: #839496;"> </span><span style="color: #268bd2;">len</span><span style="color: #839496;">(</span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">) </span><span style="color: #859900;">&gt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">boxes</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">result</span><span style="color: #839496;">.</span><span style="color: #268bd2;">boxes</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">.</span><span style="color: #268bd2;">id</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# WICHTIG: track\_ids kann None sein, wenn keine Tracks vorhanden</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;"> </span><span style="color: #859900;">is</span><span style="color: #839496;"> </span><span style="color: #859900;">not</span><span style="color: #839496;"> </span><span style="color: #b58900;">None</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">for</span><span style="color: #839496;"> </span><span style="color: #268bd2;">box</span><span style="color: #839496;">, </span><span style="color: #268bd2;">tid</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">zip</span><span style="color: #839496;">(</span><span style="color: #268bd2;">boxes</span><span style="color: #839496;">.</span><span style="color: #268bd2;">xyxy</span><span style="color: #839496;">, </span><span style="color: #268bd2;">track\_ids</span><span style="color: #839496;">):</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">(</span><span style="color: #268bd2;">tid</span><span style="color: #839496;">.</span><span style="color: #268bd2;">item</span><span style="color: #839496;">())</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">x1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">y1</span><span style="color: #839496;">, </span><span style="color: #268bd2;">x2</span><span style="color: #839496;">, </span><span style="color: #268bd2;">y2</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">box</span><span style="color: #839496;">.</span><span style="color: #268bd2;">tolist</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">((</span><span style="color: #268bd2;">x1</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #268bd2;">x2</span><span style="color: #839496;">) </span><span style="color: #859900;">/</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">cy</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">int</span><span style="color: #839496;">((</span><span style="color: #268bd2;">y1</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #268bd2;">y2</span><span style="color: #839496;">) </span><span style="color: #859900;">/</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Schwerpunkt einzeichnen</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">circle</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">, (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">), </span><span style="color: #d33682;">4</span><span style="color: #839496;">, (</span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">, </span><span style="color: #d33682;">0</span><span style="color: #839496;">), </span><span style="color: #859900;">-</span><span style="color: #d33682;">1</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">putText</span><span style="color: #839496;">(</span><span style="color: #268bd2;">frame</span><span style="color: #839496;">, </span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">, (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;"> </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #d33682;">5</span><span style="color: #839496;">),</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">FONT\_HERSHEY\_SIMPLEX</span><span style="color: #839496;">, </span><span style="color: #d33682;">0.5</span><span style="color: #839496;">, (</span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">, </span><span style="color: #d33682;">255</span><span style="color: #839496;">), </span><span style="color: #d33682;">1</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Vorherige Position holen</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;"> </span><span style="color: #859900;">in</span><span style="color: #839496;"> </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">prev\_cy</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\]</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Nur auswerten, wenn sich die Person genug bewegt hat</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">dist\_sq</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_cx</span><span style="color: #839496;">) </span><span style="color: #859900;">\*\*</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;"> </span><span style="color: #859900;">+</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">cy</span><span style="color: #839496;"> </span><span style="color: #859900;">-</span><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_cy</span><span style="color: #839496;">) </span><span style="color: #859900;">\*\*</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">dist\_sq</span><span style="color: #839496;"> </span><span style="color: #859900;">&gt;=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">MIN\_MOVE\_PIXELS</span><span style="color: #839496;"> </span><span style="color: #859900;">\*\*</span><span style="color: #839496;"> </span><span style="color: #d33682;">2</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Seite relativ zur Linie vorher / nachher</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_side</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">point\_side\_of\_line</span><span style="color: #839496;">(</span><span style="color: #268bd2;">prev\_cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">prev\_cy</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\],</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\])</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">curr\_side</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #268bd2;">point\_side\_of\_line</span><span style="color: #839496;">(</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">,</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P1</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\],</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">0</span><span style="color: #839496;">\], </span><span style="color: #268bd2;">LINE\_P2</span><span style="color: #839496;">\[</span><span style="color: #d33682;">1</span><span style="color: #839496;">\])</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Seitenwechsel -&gt; Linie überquert</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_side</span><span style="color: #839496;"> </span><span style="color: #859900;">\*</span><span style="color: #839496;"> </span><span style="color: #268bd2;">curr\_side</span><span style="color: #839496;"> </span><span style="color: #859900;">&lt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Richtung über y-Bewegung (an Kamera anpassen!)</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">cx</span><span style="color: #839496;"> </span><span style="color: #859900;">&gt;</span><span style="color: #839496;"> </span><span style="color: #268bd2;">prev\_cx</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">-=</span><span style="color: #839496;"> </span><span style="color: #d33682;">1</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">&lt;</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">=</span><span style="color: #839496;"> </span><span style="color: #d33682;">0</span><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Verhindert negativen Zähler</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;"> ENTERED, IN: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">else</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">Room\_count</span><span style="color: #839496;"> </span><span style="color: #859900;">+=</span><span style="color: #839496;"> </span><span style="color: #d33682;">1</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"ID </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">track\_id</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;"> EXITED, IN: </span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# aktuelle Position speichern</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">last\_positions</span><span style="color: #839496;">\[</span><span style="color: #268bd2;">track\_id</span><span style="color: #839496;">\] </span><span style="color: #859900;">=</span><span style="color: #839496;"> (</span><span style="color: #268bd2;">cx</span><span style="color: #839496;">, </span><span style="color: #268bd2;">cy</span><span style="color: #839496;">)</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Bild anzeigen</span></div><div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">imshow</span><span style="color: #839496;">(</span><span style="color: #2aa198;">"YOLO Room Counter"</span><span style="color: #839496;">, </span><span style="color: #268bd2;">frame</span><span style="color: #839496;">)</span></div><div><span style="color: #839496;"> </span></div><div><span style="color: #839496;"> </span><span style="color: #586e75; font-style: italic;">\# Nur mit 'q' beenden</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">waitKey</span><span style="color: #839496;">(</span><span style="color: #d33682;">1</span><span style="color: #839496;">) </span><span style="color: #859900;">&amp;</span><span style="color: #839496;"> </span><span style="color: #93a1a1; font-weight: bold;">0x</span><span style="color: #d33682;">FF</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #268bd2;">ord</span><span style="color: #839496;">(</span><span style="color: #2aa198;">'q'</span><span style="color: #839496;">):</span></div><div><span style="color: #839496;"> </span><span style="color: #859900;">break</span></div>  
<div><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span><span style="color: #839496;">.</span><span style="color: #268bd2;">destroyAllWindows</span><span style="color: #839496;">()</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">print</span><span style="color: #839496;">(</span><span style="color: #93a1a1; font-weight: bold;">f</span><span style="color: #2aa198;">"</span><span style="color: #cb4b16;">\\n</span><span style="color: #2aa198;">Finale Zählerstände: IN=</span><span style="color: #cb4b16;">{</span><span style="color: #268bd2;">Room\_count</span><span style="color: #cb4b16;">}</span><span style="color: #2aa198;">"</span><span style="color: #839496;">)</span></div>  
  
<div><span style="color: #859900;">if</span><span style="color: #839496;"> </span><span style="color: #268bd2;">\_\_name\_\_</span><span style="color: #839496;"> </span><span style="color: #859900;">==</span><span style="color: #839496;"> </span><span style="color: #2aa198;">"\_\_main\_\_"</span><span style="color: #839496;">:</span></div><div><span style="color: #839496;"> </span><span style="color: #268bd2;">main</span><span style="color: #839496;">()</span></div></div>

# Grundlagen + Infos

Wir verwenden für dieses Projekt das bereits trainierte Personenerkennungsmodul von Ultralytics "YOLO"  
Hierbei wird die neuste Version "yolo26n" benutzt.

Ultralytics hat hierfür bereits eine Python Library erstellt mit allen wichtigen Variablen und Funktionen bereits vordefiniert.

Das Personenerkennungsmodul ist als .pt (python torch) abgespeichert.

(

<div id="bkmrk-import-cv2-import-ss" style="color: #839496; background-color: #002b36; font-family: Consolas, 'Courier New', monospace; font-weight: normal; font-size: 14px; line-height: 19px; white-space: pre;"><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">cv2</span></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">ssl</span></div><div><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">paho</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">mqtt</span><span style="color: #839496;">.</span><span style="color: #cb4b16;">client</span><span style="color: #839496;"> </span><span style="color: #859900;">as</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">mqtt</span></div><div><span style="color: #859900;">from</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">ultralytics</span><span style="color: #839496;"> </span><span style="color: #859900;">import</span><span style="color: #839496;"> </span><span style="color: #cb4b16;">YOLO</span></div><div>)</div></div>