[B]import platform
import time
from collections import deque
import numpy as np
import cv2
from mss import mss
# ----------------------------
# Kullanıcı Ayarları (başlangıç)
# ----------------------------
MONITOR_INDEX = 1 # 1: birincil monitör. Çoklu monitörde değiştir.
ROI_RATIO = 0.7 # Ekranın merkezinde %70 x %70 ROI (performans için)
MIN_CONTOUR_AREA = 80 # Daha küçük alanları görmezden gel
DILATE_ITER = 1 # Morfoloji güçlendirme
ERODE_ITER = 0
ALERT_COOLDOWN = 0.25 # Saniye. Çok sık uyarı gelmesin.
# Varsayılan HSV aralığı (kalibrasyonla anında değiştirilebilir)
DEFAULT_LOWER = (0, 120, 120)
DEFAULT_UPPER = (10, 255, 255)
# ----------------------------
# Platform ses uyarısı
def beep():
system = platform.system()
if system == "Windows":
import winsound
winsound.Beep(880, 50) # 50 ms
else:
# Terminal beep (her yerde çalışmayabilir)
print("\a", end="")
def make_hsv_trackbars(window_name="ColorBot | HSV"):
cv2.namedWindow(window_name, cv2.WINDOW_NORMAL)
cv2.resizeWindow(window_name, 420, 220)
# H: 0-179, S: 0-255, V: 0-255 (OpenCV)
cv2.createTrackbar("H_low", window_name, DEFAULT_LOWER[0], 179, lambda v: None)
cv2.createTrackbar("S_low", window_name, DEFAULT_LOWER[1], 255, lambda v: None)
cv2.createTrackbar("V_low", window_name, DEFAULT_LOWER[2], 255, lambda v: None)
cv2.createTrackbar("H_up", window_name, DEFAULT_UPPER[0], 179, lambda v: None)
cv2.createTrackbar("S_up", window_name, DEFAULT_UPPER[1], 255, lambda v: None)
cv2.createTrackbar("V_up", window_name, DEFAULT_UPPER[2], 255, lambda v: None)
cv2.createTrackbar("Dilate", window_name, DILATE_ITER, 5, lambda v: None)
cv2.createTrackbar("Erode", window_name, ERODE_ITER, 5, lambda v: None)
cv2.createTrackbar("MinArea", window_name, MIN_CONTOUR_AREA, 2000, lambda v: None)
def get_hsv_from_trackbars(window_name="ColorBot | HSV"):
hl = cv2.getTrackbarPos("H_low", window_name)
sl = cv2.getTrackbarPos("S_low", window_name)
vl = cv2.getTrackbarPos("V_low", window_name)
hu = cv2.getTrackbarPos("H_up", window_name)
su = cv2.getTrackbarPos("S_up", window_name)
vu = cv2.getTrackbarPos("V_up", window_name)
dil = cv2.getTrackbarPos("Dilate", window_name)
ero = cv2.getTrackbarPos("Erode", window_name)
minA = cv2.getTrackbarPos("MinArea", window_name)
lower = (min(hl, hu), min(sl, su), min(vl, vu))
upper = (max(hl, hu), max(sl, su), max(vl, vu))
return lower, upper, dil, ero, max(1, minA)
def sample_center_hsv(frame_bgr, roi):
x, y, w, h = roi
cx = x + w // 2
cy = y + h // 2
bgr = frame_bgr[cy, cx:cx+1] # shape (1,3)
hsv = cv2.cvtColor(bgr.reshape(1,1,3), cv2.COLOR_BGR2HSV)
h, s, v = hsv[0,0]
# Merkez piksele göre bir aralık öner (dar bant)
lower = (max(0, h-10), max(0, s-60), max(0, v-60))
upper = (min(179, h+10), min(255, s+60), min(255, v+60))
return (int(lower[0]), int(lower[1]), int(lower[2])), (int(upper[0]), int(upper[1]), int(upper[2])), (cx, cy)
def main():
sct = mss()
monitors = sct.monitors
if MONITOR_INDEX < 1 or MONITOR_INDEX >= len(monitors):
print(f"MONITOR_INDEX={MONITOR_INDEX} geçersiz. 1..{len(monitors)-1} aralığında olmalı.")
return
mon = monitors[MONITOR_INDEX]
W, H = mon["width"], mon["height"]
# Merkez ROI:
rw = int(W * ROI_RATIO)
rh = int(H * ROI_RATIO)
rx = mon["left"] + (W - rw) // 2
ry = mon["top"] + (H - rh) // 2
bbox = {"left": rx, "top": ry, "width": rw, "height": rh}
make_hsv_trackbars()
last_alert = 0.0
alert_on = True
fps_hist = deque(maxlen=30)
font = cv2.FONT_HERSHEY_SIMPLEX
print("[Q] çıkış | [S] ses uyarısı aç/kapat | [C] merkez piksele göre HSV yakala")
while True:
t0 = time.time()
frame = np.array(sct.grab(bbox)) # BGRA
frame_bgr = frame[:, :, :3] # BGR
lower, upper, dil_iter, ero_iter, min_area = get_hsv_from_trackbars()
hsv = cv2.cvtColor(frame_bgr, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, np.array(lower, dtype=np.uint8), np.array(upper, dtype=np.uint8))
if ero_iter > 0:
mask = cv2.erode(mask, None, iterations=ero_iter)
if dil_iter > 0:
mask = cv2.dilate(mask, None, iterations=dil_iter)
# Konturlar
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
hits = 0
for cnt in contours:
area = cv2.contourArea(cnt)
if area < min_area:
continue
x, y, w, h = cv2.boundingRect(cnt)
hits += 1
cv2.rectangle(frame_bgr, (x, y), (x+w, y+h), (0, 255, 255), 2)
# Uyarı
now = time.time()
if hits > 0 and alert_on and (now - last_alert) > ALERT_COOLDOWN:
last_alert = now
try:
beep()
except Exception:
pass
# UI overlay bilgileri
dt = max(1e-6, time.time() - t0)
fps = 1.0 / dt
fps_hist.append(fps)
fps_smooth = sum(fps_hist) / len(fps_hist)
hud = f"HSV {lower}-{upper} | Hits:{hits} | FPS:{fps_smooth:.1f} | Alert:{'ON' if alert_on else 'OFF'}"
cv2.putText(frame_bgr, hud, (10, 22), font, 0.6, (61, 142, 185), 2, cv2.LINE_AA)
cv2.drawMarker(frame_bgr, (frame_bgr.shape[1]//2, frame_bgr.shape[0]//2),
(61, 142, 185), markerType=cv2.MARKER_CROSS, markerSize=14, thickness=2)
cv2.imshow("ColorBot | View (ROI)", frame_bgr)
cv2.imshow("ColorBot | Mask", mask)
key = cv2.waitKey(1) & 0xFF
if key in (ord('q'), ord('Q')):
break
elif key in (ord('s'), ord('S')):
alert_on = not alert_on
elif key in (ord('c'), ord('C')):
# Merkez pikselden otomatik HSV eşik öner
lower_s, upper_s, (cx, cy) = sample_center_hsv(frame_bgr, (0, 0, frame_bgr.shape[1], frame_bgr.shape[0]))
# Trackbar'lara yaz
cv2.setTrackbarPos("H_low", "ColorBot | HSV", lower_s[0])
cv2.setTrackbarPos("S_low", "ColorBot | HSV", lower_s[1])
cv2.setTrackbarPos("V_low", "ColorBot | HSV", lower_s[2])
cv2.setTrackbarPos("H_up", "ColorBot | HSV", upper_s[0])
cv2.setTrackbarPos("S_up", "ColorBot | HSV", upper_s[1])
cv2.setTrackbarPos("V_up", "ColorBot | HSV", upper_s[2])
cv2.destroyAllWindows()
if __name__ == "__main__":
main()[/B]