Isi kandungan:

Penjejakan Objek Opencv: 3 Langkah
Penjejakan Objek Opencv: 3 Langkah

Video: Penjejakan Objek Opencv: 3 Langkah

Video: Penjejakan Objek Opencv: 3 Langkah
Video: OpenCV Python on Android 2024, November
Anonim
Penjejakan Objek Opencv
Penjejakan Objek Opencv

Pengesanan objek bergerak adalah teknik yang digunakan dalam penglihatan komputer dan pemprosesan gambar. Beberapa bingkai berturut-turut dari video dibandingkan dengan pelbagai kaedah untuk menentukan sama ada objek bergerak dikesan.

Pengesanan objek bergerak telah digunakan untuk berbagai aplikasi seperti pengawasan video, pengenalan aktiviti, pemantauan keadaan jalan raya, keselamatan lapangan terbang, pemantauan perlindungan di sepanjang perbatasan laut dan lain-lain.

Pengesanan objek bergerak adalah mengenali pergerakan fizikal objek di tempat atau kawasan tertentu. [2] Dengan bertindak segmentasi di antara objek bergerak dan kawasan atau kawasan pegun, pergerakan objek bergerak dapat dikesan dan kemudian dapat dianalisis kemudian. Untuk mencapainya, pertimbangkan video adalah struktur yang dibangun di atas satu bingkai, pengesanan objek bergerak adalah untuk mencari sasaran bergerak latar depan, baik di setiap bingkai video atau hanya ketika sasaran bergerak menunjukkan penampilan pertama dalam video.

Saya akan menggunakan kombinasi Opnecv dan Python untuk mengesan dan mengesan objek berdasarkan warnanya

Langkah 1: Melukis Segi Empat pada Objek Yang Dikenali

jika komputer anda tidak mempunyai python atau opencv sila ikuti ini di bawah yang tidak dapat disekat

berikut adalah kod python:

import cv2import numpy sebagai np

cap = cv2. VideoCapture (0)

Walaupun Betul:

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

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

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

yellow_mask = cv2.inRange (hsv, lower_yellow, upper_yellow)

(_, kontur, _) = cv2.findContours (yellow_mask, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

untuk kontur dalam kontur:

area = cv2.contourArea (kontur)

jika (kawasan> 800):

x, y, w, h = cv2.boundingRect (contour) frame = cv2. segi empat tepat (bingkai, (x, y), (x + w, y + h), (0, 0, 255), 10)

cv2.imshow ("penjejakan", bingkai)

k = cv2.waitKey (5) & 0XFF

jika k == 27: rehat

cv2.destroyAllWindows ()

cap.release ()

Langkah 2: Jejaki Jalan di mana Objek Bergerak

untuk mengesan jalan:

untuk i dalam julat (1, len (titik_ tengah)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) jika math.sqrt ((((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (bingkai, titik_pusat [i - 1], titik_pusat , (b, g, r), 4)

Langkah 3: Menggabungkan Kedua-dua Kod

saya akan menggabungkan kedua-dua kod tersebut

import cv2import numpy sebagai np import rawak dari koleksi import deque

cap = cv2. VideoCapture (1)

# Untuk melacak semua titik di mana objek dikunjungi center_points = deque ()

Walaupun Betul:

# Baca dan balikkan bingkai _, bingkai = cap.read () bingkai = cv2.flip (bingkai, 1)

# Kaburkan bingkai sedikit

blur_frame = cv2. GussianBlur (bingkai, (7, 7), 0)

# Tukar dari BGR ke format warna HSV

hsv = cv2.cvtWarna (bingkai kabur, cv2. COLOR_BGR2HSV)

# Tentukan julat warna hsv yang lebih rendah dan atas untuk dikesan. Biru di sini

lower_blue = np.array ([100, 50, 50]) upper_blue = np.array ([140, 255, 255]) mask = cv2.inRange (hsv, lower_blue, upper_blue)

# Buat kernel elips

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

# Morph pembukaan (hakisan diikuti oleh pelebaran)

mask = cv2.morphologyEx (topeng, cv2. MORPH_OPEN, kernel)

# Cari semua kontur

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

jika len (kontur)> 0:

# Cari kontur terbesar_kontur terbesar = maks (kontur, kunci = cv2.contourArea)

# Cari pusat kontur dan lukis bulatan yang penuh

momen = cv2.moments (terbesar_contour) centre_of_contour = (int (momen ['m10'] / momen ['m00']), int (momen ['m01'] / momen ['m00'])) cv2.circle (bingkai, centre_of_contour, 5, (0, 0, 255), -1)

# Ikatan kontur dengan bulatan

elips = cv2.fitEllipse (terbesar_contour) cv2. elips (bingkai, elips, (0, 255, 255), 2)

# Simpan bahagian tengah kontur sehingga kita melukis garis yang mengesannya

center_points.appendleft (centre_of_contour)

# Lukis garis dari titik tengah kontur

untuk i dalam julat (1, len (titik_ tengah)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) jika math.sqrt ((((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (bingkai, titik tengah [i - 1], titik tengah , (b, g, r), 4)

cv2.imshow ('original', bingkai)

cv2.imshow ('topeng', topeng)

k = cv2.waitKey (5) & 0xFF

jika k == 27: rehat

cv2.destroyAllWindows ()

cap.release ()

Disyorkan: