步进电机提速与相机持续运行的裂纹检测系统优化问询
步进电机提速与相机持续运行的裂纹检测系统优化问询
嗨,我看了你的裂纹检测系统代码,针对你想要相机持续运行和步进电机提速的需求,我整理了具体的优化方案,直接上干货:
一、核心优化思路
1. 相机持续运行替代单张捕获
原来用rpicam-still每次拍单张都要启停相机,不仅慢还浪费资源。改成用OpenCV的VideoCapture读取摄像头实时流,相机全程保持运行,不用反复启停,效率直接拉满。
2. 步进电机提速
步进电机的转速由step_motor里的delay参数控制,原来的0.001秒(1毫秒)可以适当缩小,同时去掉循环里不必要的等待时间,减少无意义的停顿。
二、优化后的完整代码
import time import cv2 from gpiozero import OutputDevice from ultralytics import YOLO # --- Stepper Motor Setup --- STEP_PIN = 17 DIR_PIN = 18 step = OutputDevice(STEP_PIN) direction = OutputDevice(DIR_PIN) direction.on() # Set direction # 提速关键:减小delay值,根据电机实际情况调整,避免丢步 def step_motor(steps, delay=0.0005): for _ in range(steps): step.on() time.sleep(delay) step.off() time.sleep(delay) # --- YOLO Model Setup --- model = YOLO("/home/alex/crackDetection/gen1/best.onnx", task="detect") # --- 相机持续运行设置 --- # 初始化摄像头,0代表默认摄像头,可根据实际调整 cap = cv2.VideoCapture(0) # 设置摄像头分辨率,和原来的参数保持一致 cap.set(cv2.CAP_PROP_FRAME_WIDTH, 2028) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 1520) def capture_frame(): # 从实时流读取一帧 ret, frame = cap.read() if ret: # 转成灰度再转RGB,和原来的推理逻辑匹配 img_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) return cv2.cvtColor(img_gray, cv2.COLOR_GRAY2RGB) return None def run_inference(frame): if frame is None: return None, None results = model(frame, conf=0.18) boxes = results[0].boxes if boxes is not None and len(boxes) > 0: confs = boxes.conf.cpu().numpy() max_index = confs.argmax() confidence = confs[max_index] boxes.data = boxes.data[max_index].unsqueeze(0) return confidence, results[0] return None, None # --- Main Loop: Rotate + Capture + Analyze --- print("🚨 Starting 8-position scan. Press Ctrl+C to stop.") best_conf = 0 best_position = None best_result = None try: steps_per_increment = 100 # 可根据需要调整步长 for i in range(8): print(f"\n🔄 Position {i+1}/8") # 先转动电机,再捕获当前位置的帧(可根据需求调换顺序) step_motor(steps_per_increment) # 从实时流取帧,不用存本地再读取,节省IO时间 frame = capture_frame() confidence, result = run_inference(frame) if confidence is not None: print(f"🔍 Confidence at position {i+1}: {confidence:.2f}") if confidence > best_conf: best_conf = confidence best_position = i + 1 best_result = result else: print("✅ No crack detected.") if best_result: print(f"\n⚠️ Highest confidence crack detected at position {best_position} with confidence {best_conf:.2f}") best_result.show() else: print("\n✅ No cracks detected in any position.") except KeyboardInterrupt: print("🛑 Interrupted by user.") finally: # 程序退出时务必释放摄像头资源 cap.release() cv2.destroyAllWindows()
三、关键改动说明
相机部分
- 替换
rpicam-still命令为cv2.VideoCapture,相机启动后持续运行,彻底告别反复启停的等待 - 直接从内存读取帧,不用写入本地文件再读取,减少磁盘IO开销,速度更快
- 替换
步进电机部分
- 把
step_motor的默认delay从0.001改成了0.0005,转速直接翻倍(如果电机没问题还可以再调小) - 去掉了原循环末尾的
time.sleep(0.5),减少无意义的停顿 - 注意:如果调整后电机出现丢步、卡顿或者噪音变大,说明delay太小了,调回大一点的值即可
- 把
推理逻辑优化
- 直接用实时帧做推理,不用先存成图片文件,流程更顺畅
四、额外注意事项
- 如果相机帧率低或者卡顿,可以适当降低分辨率(比如改成1920x1080),平衡检测精度和运行速度
- YOLO推理如果慢,可以考虑用轻量化的YOLO模型(比如YOLOv8n),或者降低推理的
conf阈值(不过你当前0.18已经比较低了) - 步进电机的步长
steps_per_increment也可以根据实际需求调整,步长越大转动角度越大,配合delay可以找到最合适的转速
如果调整过程中遇到电机丢步、相机无法启动之类的问题,随时告诉我,我再帮你微调~




