54 lines
1.8 KiB
Python
54 lines
1.8 KiB
Python
import cv2
|
|
|
|
|
|
class Camera:
|
|
"""摄像头初始化与帧读取(支持颜色参数)"""
|
|
|
|
def __init__(self, cam_id=0, target_color="red"):
|
|
|
|
self.cap = cv2.VideoCapture(cam_id)
|
|
self.is_opened = self.cap.isOpened()
|
|
if not self.is_opened:
|
|
raise RuntimeError("无法打开摄像头!")
|
|
|
|
self.target_color = target_color.lower()
|
|
if self.target_color not in ["red", "blue"]:
|
|
raise ValueError("仅支持 'red' 或 'blue'")
|
|
|
|
self._set_cam_params()
|
|
|
|
def _set_cam_params(self):
|
|
"""根据颜色设置摄像头参数"""
|
|
self.cap.set(cv2.CAP_PROP_AUTOFOCUS, 0) # 关闭自动对焦
|
|
self.cap.set(cv2.CAP_PROP_AUTO_WB, 0) # 关闭自动白平衡
|
|
self.cap.set(cv2.CAP_PROP_ISO_SPEED, 0) # 自动ISO
|
|
|
|
if self.target_color == "red":
|
|
self.cap.set(cv2.CAP_PROP_CONTRAST, 10)
|
|
self.cap.set(cv2.CAP_PROP_EXPOSURE, -10)
|
|
self.cap.set(cv2.CAP_PROP_WB_TEMPERATURE, 5)
|
|
elif self.target_color == "blue":
|
|
self.cap.set(cv2.CAP_PROP_CONTRAST, 10)
|
|
self.cap.set(cv2.CAP_PROP_EXPOSURE, -9)
|
|
self.cap.set(cv2.CAP_PROP_WB_TEMPERATURE, 5)
|
|
|
|
def read_frame(self):
|
|
"""读取一帧"""
|
|
if not self.is_opened:
|
|
return False, None
|
|
return self.cap.read()
|
|
|
|
def release(self):
|
|
"""释放资源"""
|
|
if self.is_opened:
|
|
self.cap.release()
|
|
self.is_opened = False
|
|
|
|
def switch_color(self, target_color):
|
|
"""切换目标颜色并更新参数"""
|
|
target_color = target_color.lower()
|
|
if target_color in ["red", "blue"] and target_color != self.target_color:
|
|
self.target_color = target_color
|
|
self._set_cam_params()
|
|
return True
|
|
return False |