You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

步进电机提速与相机持续运行的裂纹检测系统优化问询

步进电机提速与相机持续运行的裂纹检测系统优化问询

嗨,我看了你的裂纹检测系统代码,针对你想要相机持续运行步进电机提速的需求,我整理了具体的优化方案,直接上干货:

一、核心优化思路

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()

三、关键改动说明

  1. 相机部分

    • 替换rpicam-still命令为cv2.VideoCapture,相机启动后持续运行,彻底告别反复启停的等待
    • 直接从内存读取帧,不用写入本地文件再读取,减少磁盘IO开销,速度更快
  2. 步进电机部分

    • step_motor的默认delay从0.001改成了0.0005,转速直接翻倍(如果电机没问题还可以再调小)
    • 去掉了原循环末尾的time.sleep(0.5),减少无意义的停顿
    • 注意:如果调整后电机出现丢步、卡顿或者噪音变大,说明delay太小了,调回大一点的值即可
  3. 推理逻辑优化

    • 直接用实时帧做推理,不用先存成图片文件,流程更顺畅

四、额外注意事项

  • 如果相机帧率低或者卡顿,可以适当降低分辨率(比如改成1920x1080),平衡检测精度和运行速度
  • YOLO推理如果慢,可以考虑用轻量化的YOLO模型(比如YOLOv8n),或者降低推理的conf阈值(不过你当前0.18已经比较低了)
  • 步进电机的步长steps_per_increment也可以根据实际需求调整,步长越大转动角度越大,配合delay可以找到最合适的转速

如果调整过程中遇到电机丢步、相机无法启动之类的问题,随时告诉我,我再帮你微调~

火山引擎 最新活动