Güvenlik · Vücut noktaları (Pose)
🚧 Bölge ihlali ve gece kamerası
Depo, şantiye, raylı alan: yasak bölgeye giren kişiyi işaretle.
Güvenlik kameralarının "sanal çit" özelliği: görüntüye bir çokgen çizilir, bir insan o alana girerse alarm verilir. Burada kişiyi vücut noktalarından buluruz ve ayaklarının nerede olduğuna bakarız: kafası bölgenin üstünde görünen ama ayağı dışarıda olan kişi içeride sayılmaz.
Durum: …
Örnek sahne: gece, bir depo avlusunda yürüyen sentetik bir kişi. Gece modu, sahnenin piksellerine gerçekten uygulanır.
Nasıl çalışıyor?
- Görüntü iyileştirme (gece modu): her piksel gri tona çevrilir (0,299R + 0,587G + 0,114B), kazançla çarpılır ve gama (1/1,6) uygulanır. Karanlık sahnede ayrıntı ortaya çıkar.
- Nokta bulma: MediaPipe Pose ile 33 nokta; görünür noktaların kutusu kişinin çerçevesidir.
- Özellik: ayak noktası = iki bileğin (27, 28) ortası; bilekler görünmüyorsa kutunun alt ortası.
- Kural: ışın atma (ray casting) testi. Noktadan sağa çekilen yatay ışın çokgen kenarlarını tek sayıda keserse nokta içeridedir.
- Kararlılık: 3 kare üst üste içeride → İHLAL; 8 kare üst üste dışarıda → temiz. Bölgede geçen süre ve ihlal sayısı tutulur.
Kendin dene
Bölgeyi kendin çiz: "Bölgeyi çiz" düğmesine bas, görüntüye tıklayarak köşeleri ekle, "Bitti" de. İçbükey (L biçimli) bir bölge dene. Gece modunu kapatıp aç: karanlıkta model ve sen neyi daha iyi görüyorsunuz?
Python karşılığı (OpenCV / MediaPipe)
import cv2, numpy as np, mediapipe as mpzone = np.array([[180, 300], [460, 280], [560, 460], [120, 460]], np.int32) # pikselpose = mp.solutions.pose.Pose(model_complexity=0)cap = cv2.VideoCapture(0)inside_frames, alarm = 0, Falselut = np.array([255 * min(1, i * 3 / 255) ** (1 / 1.6) for i in range(256)], np.uint8)while cap.isOpened():ok, frame = cap.read()if not ok: breakgray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)night = cv2.cvtColor(cv2.LUT(gray, lut), cv2.COLOR_GRAY2BGR) # gece modu: kazanç + gamah, w = gray.shaperes = pose.process(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))inside = Falseif res.pose_landmarks:lm = res.pose_landmarks.landmarkfoot = (int((lm[27].x + lm[28].x) / 2 * w), int((lm[27].y + lm[28].y) / 2 * h)) # bileklerin ortasıinside = cv2.pointPolygonTest(zone, foot, False) >= 0 # ışın atma testiinside_frames = inside_frames + 1 if inside else 0alarm = inside_frames >= 3cv2.polylines(night, [zone], True, (0, 0, 255) if alarm else (0, 255, 255), 2)cv2.imshow("zone", night)if cv2.waitKey(1) == 27: break
🔒 Kamera görüntüsü yalnız bu cihazda işlenir; hiçbir yere gönderilmez ve kaydedilmez. Sekmeden ya da sayfadan çıkınca kamera kapanır.