OpenCV 全套教程2026最新版Python计算机视觉零基础到实战图像处理视频处理人脸检测车牌识别在实际项目中集成计算机视觉能力时很多开发者会遇到环境配置复杂、API接口不熟悉、实际应用场景不明确等问题。本文基于最新OpenCV 4.x版本从零开始构建完整的Python计算机视觉开发环境通过实战案例深入讲解图像处理、视频分析、人脸检测和车牌识别等核心功能帮助开发者快速掌握工业级应用开发能力。1. OpenCV与计算机视觉基础1.1 什么是OpenCVOpenCVOpen Source Computer Vision Library是一个开源的计算机视觉和机器学习软件库。它由一系列C函数和少量C类构成同时提供了Python、Java、MATLAB等语言的接口实现了图像处理和计算机视觉方面的众多通用算法。OpenCV最初由Intel开发现在由Willow Garage和Itseez支持后来由OpenCV.org社区维护。它具有超过2500种优化算法涵盖了计算机视觉领域的各个方面包括人脸识别、物体检测、图像分割、运动跟踪、三维重建等。1.2 计算机视觉的应用场景计算机视觉技术在现代社会中有着广泛的应用。在安防领域人脸识别和车辆识别系统已经成为标配在医疗领域医学影像分析帮助医生进行疾病诊断在工业领域产品质量检测和自动化生产线依赖视觉系统在自动驾驶领域环境感知和障碍物检测更是核心技术。OpenCV作为计算机视觉的基础库为这些应用提供了强大的技术支持。无论是学术研究还是商业项目OpenCV都是首选的开发工具之一。1.3 OpenCV-Python的优势Python作为当前最流行的编程语言之一与OpenCV结合形成了强大的开发组合。OpenCV-Python具有以下优势语法简洁易懂开发效率高拥有丰富的第三方库生态支持快速原型开发和实验社区活跃资源丰富适合教学和科研使用。对于初学者来说Python版本的OpenCV降低了学习门槛让开发者能够更专注于算法原理和应用实现而不是纠结于复杂的语法和内存管理问题。2. 环境搭建与配置2.1 Python环境安装在进行OpenCV开发之前需要先搭建Python开发环境。推荐使用Python 3.8及以上版本这些版本具有更好的性能和稳定性支持。Windows系统安装步骤访问Python官网下载最新版本的安装包运行安装程序勾选Add Python to PATH选项选择自定义安装确保安装pip包管理工具完成安装后在命令行输入python --version验证安装macOS系统安装# 使用Homebrew安装 brew install python # 或者从官网下载安装包Linux系统安装# Ubuntu/Debian sudo apt update sudo apt install python3 python3-pip # CentOS/RHEL sudo yum install python3 python3-pip2.2 OpenCV安装方法OpenCV可以通过多种方式安装最推荐的是使用pip安装预编译版本。使用pip安装OpenCV# 安装基础版本 pip install opencv-python # 安装包含额外模块的版本推荐 pip install opencv-contrib-python # 安装headless版本无GUI支持适合服务器环境 pip install opencv-python-headless验证安装import cv2 print(cv2.__version__)如果安装成功会显示当前安装的OpenCV版本号。常见的版本有4.5.x、4.6.x等本文基于4.8.0版本进行演示。2.3 开发环境配置选择合适的开发环境能显著提高开发效率。推荐以下几种方案VS Code配置安装Python扩展插件配置Python解释器路径安装OpenCV相关的代码提示插件配置调试环境Jupyter Notebook配置pip install jupyter jupyter notebookJupyter适合进行算法实验和数据分析可以实时查看图像处理效果。PyCharm配置创建新项目时选择Python解释器安装OpenCV库配置运行参数3. 图像处理基础3.1 图像读取与显示图像处理的第一步是学会如何读取和显示图像。OpenCV提供了简单的API来完成这些操作。import cv2 import numpy as np # 读取图像 img cv2.imread(image.jpg) # 显示图像 cv2.imshow(Image Window, img) # 等待按键输入0表示无限等待 cv2.waitKey(0) # 关闭所有窗口 cv2.destroyAllWindows() # 保存图像 cv2.imwrite(output.jpg, img)重要参数说明cv2.imread()的第二个参数可以指定读取模式cv2.IMREAD_COLOR彩色图像默认cv2.IMREAD_GRAYSCALE灰度图像cv2.IMREAD_UNCHANGED包含alpha通道3.2 图像基本属性了解图像的基本属性对于后续处理至关重要。# 获取图像尺寸 height, width, channels img.shape print(f图像尺寸: {width} x {height}) print(f通道数: {channels}) # 获取图像数据类型 print(f数据类型: {img.dtype}) # 获取像素值 pixel_value img[100, 100] # 获取(100,100)位置的像素值 print(f像素值: {pixel_value}) # 修改像素值 img[100:150, 100:150] [255, 0, 0] # 将区域设置为蓝色3.3 图像色彩空间转换不同的色彩空间适用于不同的应用场景。# BGR转灰度图 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # BGR转HSV hsv cv2.cvtColor(img, cv2.COLOR_BGR2HSV) # BGR转RGB rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 显示不同色彩空间的图像 cv2.imshow(Original, img) cv2.imshow(Gray, gray) cv2.imshow(HSV, hsv)HSV色彩空间在颜色识别和跟踪中特别有用因为它将颜色信息Hue、饱和度Saturation和亮度Value分离更容易处理光照变化。4. 图像处理核心技术4.1 图像滤波与平滑图像滤波是去除噪声、平滑图像的重要技术。# 均值滤波 blur cv2.blur(img, (5, 5)) # 高斯滤波 gaussian_blur cv2.GaussianBlur(img, (5, 5), 0) # 中值滤波对椒盐噪声效果好 median_blur cv2.medianBlur(img, 5) # 双边滤波保边去噪 bilateral_blur cv2.bilateralFilter(img, 9, 75, 75) # 显示结果对比 cv2.imshow(Original, img) cv2.imshow(Mean Blur, blur) cv2.imshow(Gaussian Blur, gaussian_blur) cv2.imshow(Median Blur, median_blur) cv2.imshow(Bilateral Blur, bilateral_blur)4.2 图像形态学操作形态学操作主要用于图像预处理和后处理包括膨胀、腐蚀等操作。# 创建结构元素 kernel np.ones((5, 5), np.uint8) # 腐蚀操作消除边界点使边界向内部收缩 erosion cv2.erode(img, kernel, iterations1) # 膨胀操作将边界向外部扩张 dilation cv2.dilate(img, kernel, iterations1) # 开运算先腐蚀后膨胀去除小物体 opening cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel) # 闭运算先膨胀后腐蚀填充小孔洞 closing cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel) # 梯度运算膨胀图减腐蚀图得到物体轮廓 gradient cv2.morphologyEx(img, cv2.MORPH_GRADIENT, kernel)4.3 边缘检测技术边缘检测是计算机视觉中的重要技术用于识别图像中的物体边界。# Canny边缘检测 edges cv2.Canny(img, 100, 200) # Sobel算子 sobelx cv2.Sobel(gray, cv2.CV_64F, 1, 0, ksize5) sobely cv2.Sobel(gray, cv2.CV_64F, 0, 1, ksize5) sobel_combined cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0) # Laplacian算子 laplacian cv2.Laplacian(gray, cv2.CV_64F) # 显示边缘检测结果 cv2.imshow(Original, gray) cv2.imshow(Canny, edges) cv2.imshow(Sobel, sobel_combined) cv2.imshow(Laplacian, laplacian)Canny边缘检测是最常用的方法它包含四个步骤高斯滤波、计算梯度、非极大值抑制、双阈值检测。5. 视频处理实战5.1 视频读取与处理OpenCV可以处理各种视频格式包括实时摄像头流。import cv2 # 打开摄像头 cap cv2.VideoCapture(0) # 或者打开视频文件 # cap cv2.VideoCapture(video.mp4) # 检查是否成功打开 if not cap.isOpened(): print(无法打开摄像头) exit() while True: # 读取帧 ret, frame cap.read() # 如果正确读取帧ret为True if not ret: print(无法读取帧退出...) break # 对帧进行处理例如转换为灰度图 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 显示结果 cv2.imshow(Original, frame) cv2.imshow(Gray, gray) # 按q键退出 if cv2.waitKey(1) ord(q): break # 释放资源 cap.release() cv2.destroyAllWindows()5.2 视频属性设置与保存可以设置视频的各种属性并保存处理后的视频。# 获取视频属性 fps cap.get(cv2.CAP_PROP_FPS) width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) print(f视频属性: {width}x{height}, FPS: {fps}) # 创建VideoWriter对象保存视频 fourcc cv2.VideoWriter_fourcc(*XVID) out cv2.VideoWriter(output.avi, fourcc, fps, (width, height)) while True: ret, frame cap.read() if not ret: break # 处理帧示例边缘检测 edges cv2.Canny(frame, 100, 200) # 将灰度图转换为BGR格式以便保存 edges_bgr cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR) # 写入帧 out.write(edges_bgr) cv2.imshow(Processing, edges_bgr) if cv2.waitKey(1) ord(q): break # 释放资源 cap.release() out.release() cv2.destroyAllWindows()5.3 实时视频特效实现一些有趣的视频特效展示OpenCV的强大功能。def apply_effects(frame): 应用多种视频特效 effects {} # 原始帧 effects[Original] frame # 灰度化 effects[Gray] cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 边缘检测 edges cv2.Canny(frame, 50, 150) effects[Edges] cv2.cvtColor(edges, cv2.COLOR_GRAY2BGR) # 素描效果 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) inverted cv2.bitwise_not(gray) blurred cv2.GaussianBlur(inverted, (21, 21), 0) inverted_blurred cv2.bitwise_not(blurred) sketch cv2.divide(gray, inverted_blurred, scale256.0) effects[Sketch] cv2.cvtColor(sketch, cv2.COLOR_GRAY2BGR) # 热力图效果 heatmap cv2.applyColorMap(gray, cv2.COLORMAP_JET) effects[Heatmap] heatmap return effects # 实时应用特效 cap cv2.VideoCapture(0) current_effect 0 effect_names [Original, Gray, Edges, Sketch, Heatmap] while True: ret, frame cap.read() if not ret: break effects apply_effects(frame) # 显示当前特效 cv2.imshow(Video Effect, effects[effect_names[current_effect]]) key cv2.waitKey(1) if key ord(q): break elif key ord(n): # 按n切换特效 current_effect (current_effect 1) % len(effect_names) print(f切换到特效: {effect_names[current_effect]}) cap.release() cv2.destroyAllWindows()6. 人脸检测实战6.1 Haar级联分类器OpenCV提供了基于Haar特征的人脸检测器这是最经典的人脸检测方法。import cv2 import numpy as np # 加载预训练的分类器 face_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_frontalface_default.xml) eye_cascade cv2.CascadeClassifier(cv2.data.haarcascades haarcascade_eye.xml) def detect_faces(img): 检测人脸和眼睛 gray cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 检测人脸 faces face_cascade.detectMultiScale(gray, 1.3, 5) for (x, y, w, h) in faces: # 绘制人脸矩形 cv2.rectangle(img, (x, y), (xw, yh), (255, 0, 0), 2) # 在人脸区域检测眼睛 roi_gray gray[y:yh, x:xw] roi_color img[y:yh, x:xw] eyes eye_cascade.detectMultiScale(roi_gray) for (ex, ey, ew, eh) in eyes: cv2.rectangle(roi_color, (ex, ey), (exew, eyeh), (0, 255, 0), 2) return img # 实时人脸检测 cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break # 检测人脸 result detect_faces(frame) cv2.imshow(Face Detection, result) if cv2.waitKey(1) ord(q): break cap.release() cv2.destroyAllWindows()6.2 DNN人脸检测使用深度学习方法进行人脸检测准确率更高。# 加载DNN模型 net cv2.dnn.readNetFromTensorflow(opencv_face_detector_uint8.pb, opencv_face_detector.pbtxt) def dnn_face_detection(img): 使用DNN进行人脸检测 h, w img.shape[:2] # 创建blob blob cv2.dnn.blobFromImage(img, 1.0, (300, 300), [104, 117, 123]) # 输入网络 net.setInput(blob) detections net.forward() # 处理检测结果 for i in range(detections.shape[2]): confidence detections[0, 0, i, 2] # 过滤低置信度的检测 if confidence 0.7: box detections[0, 0, i, 3:7] * np.array([w, h, w, h]) (x1, y1, x2, y2) box.astype(int) # 绘制边界框和置信度 cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2) text f{confidence * 100:.2f}% cv2.putText(img, text, (x1, y1-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) return img # 使用DNN进行实时检测 cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break result dnn_face_detection(frame) cv2.imshow(DNN Face Detection, result) if cv2.waitKey(1) ord(q): break cap.release() cv2.destroyAllWindows()6.3 人脸识别系统构建一个简单的人脸识别系统包括人脸注册和识别功能。import os import pickle import face_recognition import cv2 class FaceRecognitionSystem: def __init__(self): self.known_face_encodings [] self.known_face_names [] self.load_known_faces() def load_known_faces(self): 加载已知人脸数据 if os.path.exists(face_data.pkl): with open(face_data.pkl, rb) as f: data pickle.load(f) self.known_face_encodings data[encodings] self.known_face_names data[names] def save_known_faces(self): 保存人脸数据 data { encodings: self.known_face_encodings, names: self.known_face_names } with open(face_data.pkl, wb) as f: pickle.dump(data, f) def register_face(self, image, name): 注册新人脸 # 转换颜色空间 rgb_image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 检测人脸编码 face_encodings face_recognition.face_encodings(rgb_image) if len(face_encodings) 0: self.known_face_encodings.append(face_encodings[0]) self.known_face_names.append(name) self.save_known_faces() return True return False def recognize_face(self, image): 识别人脸 rgb_image cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # 检测所有人脸 face_locations face_recognition.face_locations(rgb_image) face_encodings face_recognition.face_encodings(rgb_image, face_locations) face_names [] for face_encoding in face_encodings: # 比较已知人脸 matches face_recognition.compare_faces(self.known_face_encodings, face_encoding) name Unknown # 计算距离 face_distances face_recognition.face_distance(self.known_face_encodings, face_encoding) best_match_index np.argmin(face_distances) if matches[best_match_index]: name self.known_face_names[best_match_index] face_names.append(name) return face_locations, face_names # 使用人脸识别系统 face_system FaceRecognitionSystem() cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break # 识别人脸 face_locations, face_names face_system.recognize_face(frame) # 绘制结果 for (top, right, bottom, left), name in zip(face_locations, face_names): cv2.rectangle(frame, (left, top), (right, bottom), (0, 255, 0), 2) cv2.putText(frame, name, (left, top-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) cv2.imshow(Face Recognition, frame) key cv2.waitKey(1) if key ord(q): break elif key ord(r): # 按r注册当前人脸 name input(输入姓名: ) if face_system.register_face(frame, name): print(f成功注册: {name}) cap.release() cv2.destroyAllWindows()7. 车牌识别实战7.1 车牌检测车牌识别首先需要准确检测出车牌位置。import cv2 import numpy as np def detect_license_plate(image): 检测车牌位置 # 转换为灰度图 gray cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) # 高斯模糊 blurred cv2.GaussianBlur(gray, (5, 5), 0) # Sobel边缘检测 sobelx cv2.Sobel(blurred, cv2.CV_64F, 1, 0, ksize3) sobely cv2.Sobel(blurred, cv2.CV_64F, 0, 1, ksize3) sobel cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0) # 二值化 _, binary cv2.threshold(sobel, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) # 形态学操作 kernel cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3)) closed cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel) # 查找轮廓 contours, _ cv2.findContours(closed, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 筛选可能的车牌区域 plates [] for contour in contours: # 计算轮廓的边界矩形 x, y, w, h cv2.boundingRect(contour) # 根据长宽比筛选车牌通常有特定的长宽比 aspect_ratio w / h if 2.0 aspect_ratio 5.0 and w 100 and h 30: plates.append((x, y, w, h)) return plates def preprocess_plate(plate_image): 预处理车牌图像用于字符识别 # 调整大小 plate_image cv2.resize(plate_image, (200, 50)) # 转换为灰度图 gray cv2.cvtColor(plate_image, cv2.COLOR_BGR2GRAY) # 二值化 _, binary cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) return binary # 测试车牌检测 image cv2.imread(car.jpg) plates detect_license_plate(image) for (x, y, w, h) in plates: cv2.rectangle(image, (x, y), (xw, yh), (0, 255, 0), 2) # 提取车牌区域 plate_roi image[y:yh, x:xw] processed_plate preprocess_plate(plate_roi) cv2.imshow(Plate, processed_plate) cv2.imshow(License Plate Detection, image) cv2.waitKey(0) cv2.destroyAllWindows()7.2 字符分割与识别将车牌中的字符分割出来并进行识别。def segment_characters(plate_image): 分割车牌字符 # 预处理 gray cv2.cvtColor(plate_image, cv2.COLOR_BGR2GRAY) _, binary cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY cv2.THRESH_OTSU) # 形态学操作去除噪声 kernel cv2.getStructuringElement(cv2.MORPH_RECT, (2, 2)) cleaned cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel) # 查找字符轮廓 contours, _ cv2.findContours(cleaned, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) characters [] for contour in contours: x, y, w, h cv2.boundingRect(contour) # 根据大小筛选字符 if 10 w 100 and 20 h 80: char_image cleaned[y:yh, x:xw] characters.append((x, char_image)) # 按x坐标排序 characters.sort(keylambda x: x[0]) return [char[1] for char in characters] def recognize_characters(char_images): 识别字符简化版实际项目应使用训练好的模型 # 这里使用模板匹配的简化方法 # 实际项目中应该使用OCR引擎如Tesseract或训练深度学习模型 # 定义字符模板简化示例 templates { 0: create_template(0), 1: create_template(1), # ... 其他字符模板 A: create_template(A), B: create_template(B), # ... 其他字母模板 } recognized_text for char_img in char_images: best_match None best_score 0 for char, template in templates.items(): # 调整模板大小匹配字符 resized_template cv2.resize(template, (char_img.shape[1], char_img.shape[0])) # 计算匹配度 score cv2.matchTemplate(char_img, resized_template, cv2.TM_CCOEFF_NORMED)[0][0] if score best_score: best_score score best_match char if best_score 0.6: # 设置匹配阈值 recognized_text best_match return recognized_text def create_template(character): 创建字符模板简化实现 # 实际项目中应该使用真实的字符模板库 # 这里返回一个空白图像作为示例 return np.zeros((50, 30), dtypenp.uint8) # 完整的车牌识别流程 def recognize_license_plate(image): 完整的车牌识别流程 # 1. 检测车牌位置 plates detect_license_plate(image) results [] for (x, y, w, h) in plates: # 提取车牌区域 plate_roi image[y:yh, x:xw] # 2. 分割字符 characters segment_characters(plate_roi) # 3. 识别字符 plate_text recognize_characters(characters) results.append({ position: (x, y, w, h), text: plate_text, characters: characters }) return results # 测试完整识别流程 image cv2.imread(car_with_plate.jpg) results recognize_license_plate(image) for result in results: x, y, w, h result[position] text result[text] # 绘制车牌框和识别结果 cv2.rectangle(image, (x, y), (xw, yh), (0, 255, 0), 2) cv2.putText(image, text, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) cv2.imshow(License Plate Recognition, image) cv2.waitKey(0) cv2.destroyAllWindows()7.3 实时车牌识别系统将车牌识别技术应用到实时视频流中。class RealTimeLicensePlateRecognizer: def __init__(self): self.plate_cascade cv2.CascadeClassifier(haarcascade_russian_plate_number.xml) def process_frame(self, frame): 处理视频帧进行车牌识别 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) # 检测车牌 plates self.plate_cascade.detectMultiScale(gray, 1.1, 5) for (x, y, w, h) in plates: # 绘制车牌区域 cv2.rectangle(frame, (x, y), (xw, yh), (0, 255, 0), 2) # 提取车牌区域进行识别 plate_roi frame[y:yh, x:xw] # 这里可以调用识别函数 # plate_text recognize_license_plate(plate_roi) # 显示识别结果简化版 cv2.putText(frame, Plate Detected, (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 255, 0), 2) return frame # 实时车牌识别 recognizer RealTimeLicensePlateRecognizer() cap cv2.VideoCapture(0) while True: ret, frame cap.read() if not ret: break processed_frame recognizer.process_frame(frame) cv2.imshow(Real-time License Plate Recognition, processed_frame) if cv2.waitKey(1) ord(q): break cap.release() cv2.destroyAllWindows()8. 项目实战智能安防监控系统8.1 系统架构设计构建一个完整的智能安防监控系统集成人脸识别和车牌识别功能。import cv2 import numpy as np import time import threading from datetime import datetime class SmartSecuritySystem: def __init__(self): self.face_detector cv2.CascadeClassifier( cv2.data.haarcascades haarcascade_frontalface_default.xml) self.is_running False self.alert_log [] def start_monitoring(self, camera_index0): 开始监控 self.is_running True self.cap cv2.VideoCapture(camera_index) # 启动监控线程 monitor_thread threading.Thread(targetself._monitor_loop) monitor_thread.daemon True monitor_thread.start() def stop_monitoring(self): 停止监控 self.is_running False if hasattr(self, cap): self.cap.release() def _monitor_loop(self): 监控主循环 motion_detector MotionDetector() face_recognition FaceRecognitionSystem() while self.is_running: ret, frame self.cap.read() if not ret: continue # 运动检测 motion_detected motion_detector.detect_motion(frame) if motion_detected: # 人脸检测 faces self.face_detector.detectMultiScale( cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY), 1.3, 5) # 车牌检测 plates detect_license_plate(frame) # 记录警报 if len(faces) 0 or len(plates) 0: self._log_alert(frame, faces, plates) # 显示监控画面 self._display_frame(frame, motion_detected, faces if faces in locals() else []) time.sleep(0.033) # 约30FPS def _log_alert(self, frame, faces, plates): 记录警报 timestamp datetime.now().strftime(%Y-%m-%d %H:%M:%S) alert_info { timestamp: timestamp, faces_detected: len(faces), plates_detected: len(plates), image: frame.copy() } self.alert_log.append(alert_info) # 保存警报图像 filename falert_{timestamp.replace(:, -).replace( , _)}.jpg cv2.imwrite(filename, frame) print(f警报记录: {timestamp} - 人脸: {len(faces)}, 车牌: {len(plates)}) def _display_frame(self, frame, motion_detected, faces): 显示监控画面 display_frame frame.copy() # 绘制运动检测状态 status_text Motion: DETECTED if motion_detected else Motion: Normal status_color (0, 0, 255) if motion_detected else (0, 255, 0) cv2.putText(display_frame, status_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, status_color, 2) # 绘制人脸框 for (x, y, w, h) in faces: cv2.rectangle(display_frame, (x, y), (xw, yh), (255, 0, 0), 2) cv2.imshow(Smart Security System, display_frame) cv2.waitKey(1) class MotionDetector: def __init__(self): self.previous_frame None def detect_motion(self, frame): 检测运动 gray cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) gray cv2.GaussianBlur(gray, (21, 21), 0)