Mục lục:

Theo dõi đối tượng Opencv: 3 bước
Theo dõi đối tượng Opencv: 3 bước

Video: Theo dõi đối tượng Opencv: 3 bước

Video: Theo dõi đối tượng Opencv: 3 bước
Video: Demo Project Đếm Và Xác Định Tọa Độ Đối Tượng OpenCv Python 2024, Tháng mười một
Anonim
Theo dõi đối tượng Opencv
Theo dõi đối tượng Opencv

Phát hiện đối tượng chuyển động là một kỹ thuật được sử dụng trong xử lý hình ảnh và thị giác máy tính. Nhiều khung hình liên tiếp từ một video được so sánh bằng nhiều phương pháp khác nhau để xác định xem có phát hiện thấy bất kỳ đối tượng chuyển động nào hay không.

Tính năng phát hiện đối tượng chuyển động đã được sử dụng cho nhiều ứng dụng như giám sát video, nhận dạng hoạt động, giám sát tình trạng đường xá, an toàn sân bay, giám sát bảo vệ dọc biên giới biển, v.v.

Phát hiện đối tượng chuyển động là nhận biết chuyển động vật lý của một đối tượng tại một địa điểm hoặc khu vực nhất định. [2] Bằng cách thực hiện phân đoạn giữa các đối tượng chuyển động và vùng hoặc vùng đứng yên, chuyển động của các đối tượng chuyển động có thể được theo dõi và do đó có thể được phân tích sau đó. Để đạt được điều này, hãy coi video là một cấu trúc được xây dựng dựa trên các khung hình đơn lẻ, phát hiện đối tượng chuyển động là để tìm (các) mục tiêu chuyển động phía trước, trong mỗi khung hình video hoặc chỉ khi mục tiêu chuyển động xuất hiện lần đầu tiên trong video.

Tôi sẽ sử dụng kết hợp Opnecv và Python để phát hiện và theo dõi các đối tượng dựa trên màu sắc

Bước 1: Vẽ hình chữ nhật trên đối tượng được nhận dạng

nếu máy tính của bạn không có python hoặc opencv, vui lòng làm theo điều này dưới đây insstructables

đây là mã python:

nhập cv2import numpy dưới dạng np

cap = cv2. VideoCapture (0)

trong khi Đúng:

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

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

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

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

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

cho đường viền trong đường viền:

area = cv2.contourArea (contour)

nếu (diện tích> 800):

x, y, w, h = cv2.bidingRect (contour) frame = cv2.rectangle (frame, (x, y), (x + w, y + h), (0, 0, 255), 10)

cv2.imshow ("theo dõi", khung)

k = cv2.waitKey (5) & 0XFF

nếu k == 27: break

cv2.destroyAllWindows ()

cap.release ()

Bước 2: Theo dõi đường dẫn mà đối tượng đã di chuyển

để theo dõi đường dẫn:

đối với tôi trong phạm vi (1, len (center_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt (((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (frame, center_points [i - 1], center_points , (b, g, r), 4)

Bước 3: Tích hợp cả hai mã

tôi sẽ tích hợp cả mã

nhập cv2import numpy dưới dạng np nhập ngẫu nhiên từ các bộ sưu tập import deque

cap = cv2. VideoCapture (1)

# Để theo dõi tất cả các điểm mà đối tượng đã truy cập center_points = deque ()

trong khi Đúng:

# Đọc và lật khung _, frame = cap.read () frame = cv2.flip (frame, 1)

# Làm mờ khung hình một chút

mờ_frame = cv2. GaussianBlur (khung, (7, 7), 0)

# Chuyển đổi từ định dạng màu BGR sang HSV

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

# Xác định dải màu hsv dưới và trên để phát hiện. Màu xanh ở đây

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

# Tạo nhân hình elip

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

# Mở đầu hình thái (xói mòn theo sau là giãn nở)

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

# Tìm tất cả các đường viền

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

nếu len (contours)> 0:

# Tìm đường viền lớn nhất most_contour = max (contours, key = cv2.contourArea)

# Tìm tâm của đường viền và vẽ vòng tròn đầy

khoảnh khắc = cv2.moments (lớn nhất_contour) centre_of_contour = (int (khoảnh khắc ['m10'] / khoảnh khắc ['m00']), int (khoảnh khắc ['m01'] / khoảnh khắc ['m00'])) cv2.circle (khung, centre_of_contour, 5, (0, 0, 255), -1)

# Ràng buộc đường viền bằng hình tròn

ellipse = cv2.fitEllipse (big_contour) cv2.ellipse (frame, ellipse, (0, 255, 255), 2)

# Lưu tâm của đường bao để chúng tôi vẽ đường theo dõi nó

center_points.appendleft (centre_of_contour)

# Vẽ đường từ các điểm trung tâm của đường viền

đối với tôi trong phạm vi (1, len (center_points)): b = random.randint (230, 255) g = random.randint (100, 255) r = random.randint (100, 255) if math.sqrt (((center_points [i - 1] [0] - center_points [0]) ** 2) + ((center_points [i - 1] [1] - center_points [1]) ** 2)) <= 50: cv2.line (frame, center_points [i - 1], center_points , (b, g, r), 4)

cv2.imshow ('original', frame)

cv2.imshow ('mặt nạ', mặt nạ)

k = cv2.waitKey (5) & 0xFF

nếu k == 27: break

cv2.destroyAllWindows ()

cap.release ()

Đề xuất: