import cv2 import numpy as np cap = cv2.VideoCapture(0) cap.set(3, 320) cap.set(4, 240) cap.set(cv2.CAP_PROP_BUFFERSIZE, 1) ret, prev_frame = cap.read() prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY) prev_gray = cv2.GaussianBlur(prev_gray, (5,5), 0) while True: ret, frame = cap.read() if not ret: break gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray = cv2.GaussianBlur(gray, (5,5), 0) # 帧差 diff = cv2.absdiff(prev_gray, gray) diff = cv2.convertScaleAbs(diff, alpha=2.5) _, thresh = cv2.threshold(diff, 20, 255, cv2.THRESH_BINARY) contours, _ = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # ===== 核心:选最大目标 ===== target = None max_area = 0 for cnt in contours: area = cv2.contourArea(cnt) if area < 300: # 过滤噪声 continue if area > max_area: max_area = area target = cnt # ===== 只处理一个目标 ===== if target is not None: x, y, w, h = cv2.boundingRect(target) cx = x + w // 2 cy = y + h // 2 cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.circle(frame, (cx, cy), 5, (0, 0, 255), -1) print("唯一目标:", cx, cy, "area:", max_area) cv2.imshow("tracking", frame) prev_gray = gray.copy() if cv2.waitKey(1) & 0xFF == 27: break cap.release() cv2.destroyAllWindows()