GIT-test/detector.py
2026-02-21 23:42:50 +08:00

69 lines
2.3 KiB
Python

# -*- 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