Mundarija:

Opencv ob'ektlarini kuzatish: 3 qadam
Opencv ob'ektlarini kuzatish: 3 qadam

Video: Opencv ob'ektlarini kuzatish: 3 qadam

Video: Opencv ob'ektlarini kuzatish: 3 qadam
Video: OpenCV Course - Full Tutorial with Python 2024, Noyabr
Anonim
Opencv ob'ektlarini kuzatish
Opencv ob'ektlarini kuzatish

Harakatlanuvchi ob'ektlarni aniqlash - bu kompyuterni ko'rish va tasvirni qayta ishlashda qo'llaniladigan usul. Videodan ketma -ket ketma -ket keladigan kadrlar har xil usullar bilan taqqoslanib, harakatlanuvchi ob'ekt aniqlanadimi yoki yo'qligini aniqlaydi.

Harakatlanuvchi ob'ektlarni aniqlash videokuzatuv, faollikni aniqlash, yo'l holatini kuzatish, aeroportlar xavfsizligi, dengiz chegarasi bo'ylab muhofaza qilish monitoringi va boshqalar kabi keng ko'lamli dasturlar uchun ishlatilgan.

Harakatlanuvchi ob'ektni aniqlash - bu ma'lum bir joyda yoki mintaqada ob'ektning jismoniy harakatini tan olish. [2] Harakatlanuvchi ob'ektlar va harakatsiz maydon yoki mintaqalar o'rtasida bo'linish orqali harakatlanuvchi jismlarning harakatini kuzatish mumkin edi va ularni keyinchalik tahlil qilish mumkin edi. Bunga erishish uchun, video - bu bitta kadrga qurilgan tuzilma, harakatlanuvchi ob'ektni aniqlash - har bir video kadrda yoki harakatlanuvchi maqsad videoning birinchi ko'rinishini ko'rsatganda, oldingi harakatlanuvchi nishonlarni topish.

Rangga qarab ob'ektlarni aniqlash va kuzatish uchun Opnecv va Python kombinatsiyasidan foydalanmoqchiman

1 -qadam: Tanilgan ob'ektga to'rtburchak chizish

Agar sizning kompyuteringizda python yoki opencv bo'lmasa, iltimos, quyida bajarib bo'lmaydigan narsalarga amal qiling

bu erda python kodi:

cv2import numpy ni np sifatida import qiling

cap = cv2. VideoCapture (0)

rost bo'lsa:

_, frame = cap.read () hsv = cv2.cvtColor (ramka, cv2. COLOR_BGR2HSV)

pastki_sar = np.array ([20, 110, 110])

yuqori_sar = np.array ([40, 255, 255])

yellow_mask = cv2.inRange (hsv, pastki_sar, yuqori_sar)

(_, konturlar, _) = cv2.findContours (sariq_maska, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

kontur uchun kontur uchun:

maydon = cv2.contourArea (kontur)

agar (maydoni> 800):

x, y, w, h = cv2.boundingRect (kontur) ramka = cv2. to'rtburchak (ramka, (x, y), (x+w, y+h), (0, 0, 255), 10)

cv2.imshow ("kuzatish", ramka)

k = cv2.waitKey (5) va 0XFF

agar k == 27: tanaffus

cv2.destroyAllWindows ()

cap.release ()

2 -qadam: Ob'ekt harakatlanadigan yo'lni aniqlang

yo'lni kuzatish uchun:

i uchun diapazonda (1, len (center_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt (((markaziy nuqtalar [i - 1] [0] - markaziy nuqtalar [0]) ** 2) + ((markaziy nuqtalar [i - 1] [1] - markaziy nuqtalar [1]) ** 2)) <= 50: cv2.line (ramka, markaziy nuqtalar [i - 1], markaziy nuqtalar , (b, g, r), 4)

3 -qadam: Ikkala kodni ham birlashtirish

Men ikkala kodni ham birlashtirmoqchiman

import cv2import numpy sifatida np import tasodifiy to'plamlardan import deque

cap = cv2. VideoCapture (1)

# Ob'ekt tashrif buyurgan barcha nuqtalarni kuzatib borish uchun center_points = deque ()

rost bo'lsa:

# Kadrni o'qing va aylantiring _, frame = cap.read () frame = cv2.flip (frame, 1)

# Ramkani biroz xiralashtiring

blur_frame = cv2. Gausscha Blur (ramka, (7, 7), 0)

# BGR -dan HSV rang formatiga o'tkazish

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

# Aniqlash uchun hsv rangining pastki va yuqori diapazonini aniqlang. Bu erda ko'k

pastki_korang = np.array ([100, 50, 50]) yuqori_kuv = np.array ([140, 255, 255]) niqob = cv2.inRange (hsv, pastki_kor, yuqori_kor)

# Elliptik yadro yarating

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

# Morfning ochilishi (eroziya, keyin kengayish)

niqob = cv2.morphologyEx (niqob, cv2. MORPH_OPEN, yadro)

# Barcha konturlarni toping

konturlar, ierarxiya = cv2.findContours (mask.copy (), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE) [-2:]

agar len (konturlar)> 0:

# Eng katta konturni toping eng katta_kontur = maksimal

# Kontur markazini toping va to'ldirilgan aylana chizing

moment = cv2.moments (eng katta_kontur) centre_of_contour = (int (lahzalar ['m10'] / lahzalar ['m00'])), int (lahzalar ['m01'] / lahzalar ['m00'])) cv2. aylana (ramka), centre_of_contour, 5, (0, 0, 255), -1)

# Konturni aylana bilan bog'lab qo'ying

ellips = cv2.fitEllipse (eng katta_kontur) cv2.ellipse (ramka, ellips, (0, 255, 255), 2)

# Kontur markazini saqlang, shunda biz uni kuzatuvchi chiziq chizamiz

center_points.appendleft (kontur markazi_kabi)

# Konturning markaziy nuqtalaridan chiziq chizish

i uchun diapazonda (1, len (center_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt (((markaziy nuqtalar [i - 1] [0] - markaziy nuqtalar [0]) ** 2) + ((markaziy nuqtalar [i - 1] [1] - markaziy nuqtalar [1]) ** 2)) <= 50: cv2.line (ramka, markaziy nuqtalar [i - 1], markaziy nuqtalar , (b, g, r), 4)

cv2.imshow ("asl", ramka)

cv2.imshow ("niqob", niqob)

k = cv2.waitKey (5) va 0xFF

agar k == 27: tanaffus

cv2.destroyAllWindows ()

cap.release ()

Tavsiya: