69 lines
2.3 KiB
Python
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
|