Opencv Obyekt İzləmə: 3 addım
Opencv Obyekt İzləmə: 3 addım
Anonim
Opencv Obyekt İzləmə
Opencv Obyekt İzləmə

Hərəkətli obyekt aşkarlama kompüterin görmə və görüntü işlənməsində istifadə olunan bir texnikadır. Videodan bir neçə ardıcıl kadr, hər hansı bir hərəkətli obyektin aşkarlanıb aşkarlanmadığını müəyyən etmək üçün müxtəlif üsullarla müqayisə olunur.

Hərəkətli cisimlərin aşkarlanması video nəzarət, fəaliyyətin tanınması, yol vəziyyətinin monitorinqi, hava limanının təhlükəsizliyi, dəniz sərhədində mühafizənin monitorinqi və s.

Hərəkətli obyekt aşkarlanması, müəyyən bir yerdə və ya bölgədə bir cismin fiziki hərəkətini tanımaqdır. [2] Hərəkətli cisimlər və hərəkətsiz bir sahə və ya bölgə arasında seqmentləşdirmə edərək hərəkət edən cisimlərin hərəkəti izlənilə bilər və beləliklə daha sonra təhlil edilə bilər. Buna nail olmaq üçün, bir videonun tək çərçivələr üzərində qurulmuş bir quruluş olduğunu düşünün, hərəkətli obyekt aşkarlanması, hər video çərçivədə və ya yalnız hərəkətli hədəf videoda ilk görünüşünü göstərdikdə, ön planda hərəkət edən hədəfləri tapmaqdır.

Rəngə görə obyektləri aşkar etmək və izləmək üçün Opnecv və Python kombinasiyasından istifadə edəcəyəm

Addım 1: Tanınmış Obyekt üzərində Dikdörtgen çəkin

Kompüterinizdə python və ya opencv yoxdursa, zəhmət olmasa aşağıdakıları izləyin

python kodu budur:

nv kimi cv2import numpy idxal edin

cap = cv2. VideoCapture (0)

Doğru halda:

_, frame = cap.read () hsv = cv2.cvtColor (çərçivə, cv2. COLOR_BGR2HSV)

alt_sarı = np.array ([20, 110, 110])

üst_sarı = np.array ([40, 255, 255])

yellow_mask = cv2.inRange (hsv, alt_sarı, üst_sarı)

(_, konturlar, _) = cv2.findContours (sarı_maska, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

kontur kontur üçün:

sahə = cv2.contourArea (kontur)

əgər (sahə> 800):

x, y, w, h = cv2.boundingRect (kontur) çərçivə = cv2. dikdörtgen (çərçivə, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("izləmə", çərçivə)

k = cv2.waitKey (5) & 0XFF

əgər k == 27: break

cv2.destroyAllWindows ()

cap.release ()

Addım 2: Obyektin hərəkət etdiyi yolu izləyin

yolu izləmək üçün:

i üçün aralıqda (1, len (center_points)): b = təsadüfi.randint (230, 255) g = təsadüfi.randint (100, 255) r = təsadüfi.randint (100, 255) əgər math.sqrt (((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (çərçivə, mərkəz nöqtələri [i - 1], mərkəz nöqtələri , (b, g, r), 4)

Addım 3: Hər iki Kodun İnteqrasiyası

hər iki kodu birləşdirəcəyəm

cv2import numpy kimi np təsadüfi yığımlardan idxal deque

cap = cv2. VideoCapture (1)

# Obyektin ziyarət edildiyi bütün nöqtələri izləmək üçün center_points = deque ()

Doğru halda:

# Çərçivəni oxuyun və çevirin _, frame = cap.read () frame = cv2.flip (frame, 1)

# Çərçivəni bir az bulandır

blur_frame = cv2. GaussBlur (çərçivə, (7, 7), 0)

# BGR -dən HSV rəng formatına çevirin

hsv = cv2.cvtColor (blur_frame, cv2. COLOR_BGR2HSV)

# Aşkar etmək üçün hsv rənginin aşağı və yuxarı aralığını təyin edin. Mavi burada

alt_mavi = np.array ([100, 50, 50]) yuxarı_mavi = np.array ([140, 255, 255]) maska = cv2.in Aralığı (hsv, alt_mavi, üst_mavi)

# Eliptik ləpə düzəldin

kernel = cv2.getStructuringElement (cv2. MORPH_ELLIPSE, (15, 15))

# Açılış morfu (eroziya və genişlənmə)

maska = cv2.morphologyEx (maska, cv2. MORPH_OPEN, kernel)

# Bütün konturları tap

konturlar, hiyerarşi = cv2.findContours (maska.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [-2:]

əgər len (konturlar)> 0:

# Ən böyük konturu tap ən böyük_kontur = maksimum (konturlar, açar = cv2.contourArea)

# Konturun mərkəzini tapın və dolu bir dairə çəkin

momentler = cv2.moments (ən böyük_contour) centre_of_contour = (int (anlar ['m10'] / anlar ['m00'])), int (anlar ['m01'] / anlar ['m00'])) cv2.dairə (çərçivə), centre_of_contour, 5, (0, 0, 255), -1)

# Konturu dairə ilə bağlayın

ellips = cv2.fitElips (ən böyük_contour) cv2.ellipse (çərçivə, ellips, (0, 255, 255), 2)

# Konturun mərkəzini qeyd edin ki, onu izləyərək xətt çəkək

center_points.appendleft (centre_of_contour)

# Konturun mərkəz nöqtələrindən xətt çəkin

i üçündür (1, len (center_points)): b = təsadüfi.randint (230, 255) g = təsadüfi.randint (100, 255) r = təsadüfi.randint (100, 255) əgər math.sqrt (((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (çərçivə, mərkəz nöqtələri [i - 1], mərkəz nöqtələri , (b, g, r), 4)

cv2.imshow ('orijinal', çərçivə)

cv2.imshow ('maska', maska)

k = cv2.waitKey (5) & 0xFF

əgər k == 27: break

cv2.destroyAllWindows ()

cap.release ()

Tövsiyə: