add Video

Former-commit-id: 2fd1cb10f278ed37633d49afeb065246db2176fa
This commit is contained in:
2025-05-27 00:06:47 +08:00
parent be0ba3a3d6
commit 90170a80e0
3 changed files with 49 additions and 10 deletions

56
main.py
View File

@ -21,7 +21,6 @@ class MAT:
self.ch340 = ch340.CH340()
self.bounce_time = bounce_time
self.total_volume = 0
self.start_time = 0
self.middle_time = 0
atexit.register(self.ch340.stop)
@ -38,7 +37,7 @@ class MAT:
def ch340_init(self):
self.ch340.push(speed=1,t=1)
self.ch340.pull(speed=1.2,vol=3)
self.control_logger.info('已初始化')
self.control_logger.info('电极位置已初始化')
def ch340_push(self, speed=0.1):
self.ch340.push_async(speed=speed, t=1)
@ -58,6 +57,9 @@ class MAT:
if not suc:
self.control_logger.error("无法从摄像头捕获帧")
return None
# 录制当前帧到视频文件
if hasattr(self, 'capFile') and self.capFile.isOpened():
self.capFile.write(im)
ret,rate = self.predictor(im)
if ret is None:
@ -136,8 +138,13 @@ class MAT:
self.endpoint_logger.warning("异常情况colored超过90%但最后状态是transport")
self.endpoint_logger.info(f"疑似滴定终点: {self.colored_volume:.2f} ml")
t = f"Stat: {ret}, rate: {round(rate,2)}, Vol: {val:.2f} ml"
if self.middle_time > 0 and (now - self.middle_time)<self.bounce_time:
t += f", MIDCHK"
if self.colored_time is not None and (now - self.colored_time) < self.bounce_time:
t += f", ENDCHK"
cv2.putText(im,
f"State: {ret}, rate: {round(rate,2)}, Vol: {val:.2f} ml, typ: {'slow' if self.typ else 'fast'}",
t,
(10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (10,215, 255) if self.typ else (255,255,255), 2)
cv2.imshow("Frame", im)
cv2.waitKey(1)
@ -159,20 +166,28 @@ class MAT:
def __del__(self):
self.cap.release()
if hasattr(self, 'capFile') and self.capFile.isOpened():
self.capFile.release()
cv2.destroyAllWindows()
def run(self,quick_speed = 0.2,slow_speed = 0.05):
def run(self,quick_speed = 0.2,slow_speed = 0.05, cap_dir="Videos"):
self.running = True
self.typ = 0
self.last = 0
self.start_time = time.time()
self.speeds = (quick_speed, slow_speed)
if cap_dir is not None:
vid_name = f"{cap_dir}/{datetime.now().strftime('%Y%m%d_%H%M%S')}.mp4"
else:
vid_name = "Disabled"
# 记录实验开始
experiment_params = {
"视频源索引 ": self.videoSourceIndex,
"防抖时间 ": self.bounce_time,
"快速模式速度": f"{quick_speed} ml/次",
"慢速模式速度": f"{slow_speed} ml/次"
"慢速模式速度": f"{slow_speed} ml/次",
"录制视频 ": vid_name
}
self.system_logger.info("实验参数:")
for key, value in experiment_params.items():
@ -180,6 +195,23 @@ class MAT:
speed = self.speeds[self.typ]
# 获取摄像头的帧率和分辨率
fps = int(self.cap.get(cv2.CAP_PROP_FPS)) or 30
width = int(self.cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(self.cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
# 初始化视频录制器
if vid_name != "Disabled":
fourcc = cv2.VideoWriter_fourcc(*'avc1')
self.capFile = cv2.VideoWriter(vid_name, fourcc, fps, (width, height))
if not self.capFile.isOpened():
self.system_logger.error(f"无法打开视频录制器: {vid_name}")
del self.capFile
else:
self.system_logger.info(f"视频录制已初始化")
self.ch340_init()
while self.running:
if self.total_volume % 12 == 0:
self.ch340_pull() # 抽取12ml
@ -195,7 +227,12 @@ class MAT:
if self._pred() is None:
self.control_logger.error("预测失败,跳过当前帧")
continue
# 释放视频录制器
if hasattr(self, 'capFile') and self.capFile.isOpened():
self.capFile.release()
self.system_logger.info(f"视频录制完成: {vid_name}")
# 实验结束,记录结果
experiment_results = {
"总体积 ": f"{self.total_volume:.2f} ml",
@ -212,12 +249,13 @@ if __name__ == "__main__":
# 创建MAT类的实例并运行
mat = MAT(
videoSourceIndex = 1,
bounce_time=1
bounce_time=3
)
mat.run(
slow_speed = 0.05,
quick_speed = 0.15,
quick_speed = 0.15,
cap_dir=None
)