สารบัญ:

การติดตามวัตถุ Opencv: 3 ขั้นตอน
การติดตามวัตถุ Opencv: 3 ขั้นตอน

วีดีโอ: การติดตามวัตถุ Opencv: 3 ขั้นตอน

วีดีโอ: การติดตามวัตถุ Opencv: 3 ขั้นตอน
วีดีโอ: Python Detection + OpenCV ตรวจจับวัตถุใน Video, ภาพนิ่ง, Streaming (ฉบับ Copy+Past) 2024, พฤศจิกายน
Anonim
การติดตามวัตถุ Opencv
การติดตามวัตถุ Opencv

การตรวจจับวัตถุเคลื่อนที่เป็นเทคนิคที่ใช้ในการมองเห็นด้วยคอมพิวเตอร์และการประมวลผลภาพ เฟรมที่ต่อเนื่องกันหลายเฟรมจากวิดีโอจะถูกเปรียบเทียบโดยวิธีต่างๆ เพื่อตรวจสอบว่าตรวจพบวัตถุที่เคลื่อนไหวหรือไม่

การตรวจจับวัตถุเคลื่อนที่ถูกนำมาใช้กับแอพพลิเคชั่นที่หลากหลาย เช่น การเฝ้าระวังวิดีโอ การจดจำกิจกรรม การตรวจสอบสภาพถนน ความปลอดภัยของสนามบิน การตรวจสอบการป้องกันตามแนวชายแดนทางทะเล และอื่นๆ

การตรวจจับวัตถุเคลื่อนที่คือการจดจำการเคลื่อนไหวทางกายภาพของวัตถุในสถานที่หรือภูมิภาคที่กำหนด[2] โดยการแบ่งส่วนระหว่างวัตถุที่เคลื่อนที่และพื้นที่หรือบริเวณที่อยู่กับที่ การเคลื่อนที่ของวัตถุเคลื่อนที่สามารถติดตามได้และจึงสามารถวิเคราะห์ได้ในภายหลัง เพื่อให้บรรลุสิ่งนี้ ให้พิจารณาว่าวิดีโอเป็นโครงสร้างที่สร้างขึ้นจากเฟรมเดียว การตรวจจับวัตถุเคลื่อนที่คือการค้นหาเป้าหมายที่เคลื่อนที่ในเบื้องหน้า ไม่ว่าจะอยู่ในเฟรมวิดีโอแต่ละเฟรมหรือเฉพาะเมื่อเป้าหมายที่เคลื่อนที่แสดงการปรากฏตัวครั้งแรกในวิดีโอ

ฉันจะใช้ชุดค่าผสม Opnecv และ Python เพื่อตรวจจับและติดตามวัตถุตามสี

ขั้นตอนที่ 1: วาดรูปสี่เหลี่ยมผืนผ้าบนวัตถุที่รู้จัก

หากพีซีของคุณไม่มี python หรือ opencv โปรดปฏิบัติตามคำแนะนำด้านล่างนี้

นี่คือรหัสหลาม:

นำเข้า cv2import numpy เป็น np

หมวก = cv2. VideoCapture(0)

ในขณะที่จริง:

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

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

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

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

(_, รูปร่าง, _) = cv2.findContours(yellow_mask, cv2. RETR_TREE, cv2. CHAIN_APPROX_SIMPLE)

สำหรับรูปร่างในรูปทรง:

พื้นที่ = cv2.contourArea(รูปร่าง)

ถ้า (พื้นที่ > 800):

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

cv2.imshow("การติดตาม", เฟรม)

k = cv2.waitKey(5) & 0XFF

ถ้า k == 27: แตก

cv2.destroyAllWindows()

หมวกปล่อย ()

ขั้นตอนที่ 2: ติดตามเส้นทางที่วัตถุถูกเคลื่อนย้าย

เพื่อติดตามเส้นทาง:

สำหรับฉันอยู่ในช่วง (1, len (center_points)): b = random.randint(230, 255) g = random.randint(100, 255) r = random.randint(100, 255) ถ้า math.sqrt(((center_points[i - 1][0] - center_points[0]) ** 2) + ((center_points[i - 1][1] - center_points[1]) ** 2)) <= 50: cv2.line(เฟรม, center_points[i - 1], center_points, (b, g, r), 4)

ขั้นตอนที่ 3: การรวมรหัสทั้งสองเข้าด้วยกัน

ฉันจะรวมรหัสทั้งสองเข้าด้วยกัน

นำเข้า cv2import numpy เป็น np นำเข้าแบบสุ่มจากคอลเลกชันนำเข้า deque

หมวก = cv2. VideoCapture(1)

# เพื่อติดตามทุกจุดที่วัตถุเยี่ยมชม center_points = deque ()

ในขณะที่จริง:

# อ่านและพลิกเฟรม _, เฟรม = cap.read () เฟรม = cv2.flip (เฟรม 1)

#เบลอกรอบหน่อย

blur_frame = cv2. GaussianBlur(เฟรม, (7, 7), 0)

# แปลงจากรูปแบบสี BGR เป็น HSV

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

# กำหนดช่วงสี hsv ล่างและบนเพื่อตรวจจับ สีฟ้าที่นี่

lower_blue = np.array ([100, 50, 50]) upper_blue = np.array ([140, 255, 255)) หน้ากาก = cv2.inRange (hsv, lower_blue, upper_blue)

# ทำเคอร์เนลวงรี

เคอร์เนล = cv2.getStructuringElement(cv2. MORPH_ELLIPSE, (15, 15))

# เปิด morph (การกัดเซาะตามด้วยการขยาย)

หน้ากาก = cv2.morphologyEx (หน้ากาก cv2. MORPH_OPEN เคอร์เนล)

# ค้นหารูปทรงทั้งหมด

รูปร่าง ลำดับชั้น = cv2.findContours(mask.copy(), cv2. RETR_LIST, cv2. CHAIN_APPROX_SIMPLE)[-2:]

ถ้าเลน (รูปร่าง) > 0:

# ค้นหาที่ใหญ่ที่สุดของรูปร่างที่ใหญ่ที่สุด_contour = สูงสุด (รูปร่าง, คีย์=cv2.contourArea)

# ค้นหาจุดศูนย์กลางของรูปร่างแล้ววาดวงกลมที่เติม

ช่วงเวลา = cv2.moments(biggest_contour) centre_of_contour = (int(ช่วงเวลา['m10'] / ช่วงเวลา['m00']), int(ช่วงเวลา['m01'] / ช่วงเวลา['m00'])) cv2.circle(เฟรม, center_of_contour, 5, (0, 0, 255), -1)

# ล้อมรอบรูปร่างด้วยวงกลม

ellipse = cv2.fitEllipse(biggest_contour) cv2.ellipse(เฟรม, วงรี, (0, 255, 255), 2)

# บันทึกจุดกึ่งกลางของรูปร่างเพื่อให้เราวาดเส้นติดตาม

center_points.appendleft(centre_of_contour)

# ลากเส้นจากจุดศูนย์กลางของรูปร่าง

สำหรับฉันอยู่ในช่วง (1, len (center_points)): b = random.randint(230, 255) g = random.randint(100, 255) r = random.randint(100, 255) ถ้า math.sqrt(((center_points[i - 1][0] - center_points[0]) ** 2) + ((center_points[i - 1][1] - center_points[1]) ** 2)) <= 50: cv2.line(เฟรม, center_points[i - 1], center_points, (b, g, r), 4)

cv2.imshow('ต้นฉบับ', เฟรม)

cv2.imshow('หน้ากาก', หน้ากาก)

k = cv2.waitKey(5) & 0xFF

ถ้า k == 27: แตก

cv2.destroyAllWindows()

หมวกปล่อย ()

แนะนำ: