70 lines
2.4 KiB
Python
70 lines
2.4 KiB
Python
import cv2
|
||
from core.ocr import load_model as ocrLoadModel, detect as ocrDetect
|
||
from core.face import load_model as faceLoadModel, detect as faceDetect
|
||
from core.yolo import load_model as yoloLoadModel, detect as yoloDetect
|
||
# 导入保存路径函数(根据实际文件位置调整导入路径)
|
||
from core.establish import get_image_save_path
|
||
# 模型加载状态标记(避免重复加载)
|
||
|
||
|
||
_model_loaded = False
|
||
|
||
|
||
def load_model():
|
||
"""加载所有检测模型(仅首次调用时执行)"""
|
||
global _model_loaded
|
||
if _model_loaded:
|
||
print("模型已加载,无需重复执行")
|
||
return
|
||
|
||
# 依次加载OCR、人脸、YOLO模型
|
||
ocrLoadModel()
|
||
faceLoadModel()
|
||
yoloLoadModel()
|
||
|
||
_model_loaded = True
|
||
print("所有检测模型加载完成")
|
||
|
||
|
||
def detect(frame):
|
||
"""
|
||
执行模型检测,检测到违规时按指定格式保存图片
|
||
参数:
|
||
frame: 待检测的图像帧(OpenCV格式,numpy.ndarray类型)
|
||
返回:
|
||
(检测结果布尔值, 检测详情, 检测模型类型)
|
||
"""
|
||
# 1. YOLO检测(优先级1)
|
||
yolo_flag, yolo_result = yoloDetect(frame)
|
||
print(f"YOLO检测结果:{yolo_result}")
|
||
if yolo_flag:
|
||
# 直接调用路径生成函数,无需传入原始图片名
|
||
save_path = get_image_save_path(model_type="yolo")
|
||
if save_path:
|
||
cv2.imwrite(save_path, frame)
|
||
print(f"✅ YOLO违规图片已保存:{save_path}")
|
||
return (True, yolo_result, "yolo")
|
||
|
||
# 2. 人脸检测(优先级2)
|
||
face_flag, face_result = faceDetect(frame)
|
||
print(f"人脸检测结果:{face_result}")
|
||
if face_flag:
|
||
save_path = get_image_save_path(model_type="face")
|
||
if save_path:
|
||
cv2.imwrite(save_path, frame)
|
||
print(f"✅ 人脸违规图片已保存:{save_path}")
|
||
return (True, face_result, "face")
|
||
|
||
# 3. OCR检测(优先级3)
|
||
ocr_flag, ocr_result = ocrDetect(frame)
|
||
print(f"OCR检测结果:{ocr_result}")
|
||
if ocr_flag:
|
||
save_path = get_image_save_path(model_type="ocr")
|
||
if save_path:
|
||
cv2.imwrite(save_path, frame)
|
||
print(f"✅ OCR违规图片已保存:{save_path}")
|
||
return (True, ocr_result, "ocr")
|
||
|
||
# 4. 无违规内容(不保存图片)
|
||
print(f"❌ 未检测到任何违规内容,不保存图片")
|
||
return (False, "未检测到任何内容", "none") |