# -*- coding: utf-8 -*- import cv2 import numpy as np class GreenLaserDetector: def __init__(self): """初始化绿色激光检测器""" # 针对短曝光激光点优化:降低最小识别面积 self.min_area = 50 self.max_area = 5000 # 默认HSV参数 self.h_low = 35 self.h_high = 85 self.s_low = 80 self.s_high = 255 self.v_low = 80 self.v_high = 255 def set_hsv_range(self, h_low, h_high, s_low, s_high, v_low, v_high): """设置HSV颜色范围""" self.h_low = h_low self.h_high = h_high self.s_low = s_low self.s_high = s_high self.v_low = v_low self.v_high = v_high def detect(self, frame): """ 检测绿色激光点 Args: frame: BGR格式的图像 Returns: results: 检测结果列表,每个元素为(cx, cy, w, h, area, circularity) mask: 二值掩码图像 """ # 转HSV hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV) # 绿色范围(需根据实际激光调整) lower_green = np.array([self.h_low, self.s_low, self.v_low]) upper_green = np.array([self.h_high, self.s_high, self.v_high]) mask = cv2.inRange(hsv, lower_green, upper_green) # 形态学去噪 kernel = np.ones((5,5), np.uint8) mask = cv2.morphologyEx(mask, cv2.MORPH_OPEN, kernel) mask = cv2.morphologyEx(mask, cv2.MORPH_CLOSE, kernel) # 查找轮廓 contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) results = [] for cnt in contours: area = cv2.contourArea(cnt) if self.min_area < area < self.max_area: # 圆形度检测 perimeter = cv2.arcLength(cnt, True) if perimeter > 0: circularity = 4 * np.pi * area / (perimeter ** 2) if circularity > 0.7: # 圆度阈值 x, y, w, h = cv2.boundingRect(cnt) cx, cy = x + w//2, y + h//2 results.append((cx, cy, w, h, area, circularity)) return results, mask