You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于OpenCV与Python在树莓派实现棘轮头实时跟踪的问题咨询

树莓派OpenCV+Python棘轮头顶视图实时检测实现方案

参考图像

参考图1
参考图2
参考图3
参考图4

前置环境部署

树莓派端直接安装适配优化的依赖,避免源码编译浪费时间:

  • 执行系统命令安装依赖:sudo apt update && sudo apt install -y python3-opencv python3-numpy libopencv-dev
  • CSI摄像头需提前在raspi-config中开启摄像头权限,USB摄像头直接接入即可

核心检测逻辑实现

方案完全匹配「外部轮廓+内部大圆形双特征校验」的思路,所有参数均为相对值,可适配不同尺寸的同外形棘轮头:

完整可运行代码

import cv2
import numpy as np

# 摄像头初始化,CSI摄像头可替换为cv2.VideoCapture(0, cv2.CAP_GSTREAMER)
cap = cv2.VideoCapture(0)
# 降低分辨率提升树莓派运行速度,可根据实际场景调整
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

# 可调校验参数,首次部署时根据实际场景微调即可
MIN_INNER_RADIUS = 10       # 内部圆形最小半径,过滤小噪点
MAX_INNER_RADIUS = 100      # 内部圆形最大半径
MIN_OUTER_AREA = 300        # 外部轮廓最小面积
MIN_RATIO = 1.8             # 外轮廓外接圆/内部圆最小半径比
MAX_RATIO = 3.2             # 外轮廓外接圆/内部圆最大半径比
MAX_POS_DEVIATION_RATIO = 0.3 # 内外圆圆心最大偏差比例,基于内部圆半径

while True:
    ret, frame = cap.read()
    if not ret:
        break

    # 图像预处理
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    blurred = cv2.GaussianBlur(gray, (5, 5), 0)

    # 第一步:检测内部圆形
    circles = cv2.HoughCircles(
        blurred,
        cv2.HOUGH_GRADIENT,
        dp=1.2,
        minDist=50,
        param1=50,
        param2=30,
        minRadius=MIN_INNER_RADIUS,
        maxRadius=MAX_INNER_RADIUS
    )

    if circles is not None:
        circles = np.uint16(np.around(circles))
        for (inner_x, inner_y, inner_r) in circles[0, :]:
            # 基于内部圆位置划定ROI,减少外部轮廓计算量
            roi_padding = int(inner_r * 3.5)
            roi_x1 = max(0, inner_x - roi_padding)
            roi_y1 = max(0, inner_y - roi_padding)
            roi_x2 = min(frame.shape[1], inner_x + roi_padding)
            roi_y2 = min(frame.shape[0], inner_y + roi_padding)
            roi = blurred[roi_y1:roi_y2, roi_x1:roi_x2]

            # 提取ROI内的外部轮廓
            edges = cv2.Canny(roi, 50, 150)
            contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

            for cnt in contours:
                # 过滤小面积噪点
                if cv2.contourArea(cnt) < MIN_OUTER_AREA:
                    continue
                # 计算外轮廓最小外接圆
                (outer_x_roi, outer_y_roi), outer_r = cv2.minEnclosingCircle(cnt)
                outer_x = outer_x_roi + roi_x1
                outer_y = outer_y_roi + roi_y1

                # 双特征校验:内外圆心偏差符合要求 + 半径比在合理范围
                pos_deviation = np.sqrt((outer_x - inner_x) ** 2 + (outer_y - inner_y) ** 2)
                radius_ratio = outer_r / inner_r
                if pos_deviation < inner_r * MAX_POS_DEVIATION_RATIO and MIN_RATIO < radius_ratio < MAX_RATIO:
                    # 检测到棘轮头,绘制标记
                    cv2.circle(frame, (inner_x, inner_y), inner_r, (0, 255, 0), 2)
                    cv2.circle(frame, (int(outer_x), int(outer_y)), int(outer_r), (255, 0, 0), 2)
                    cv2.putText(
                        frame, "Ratchet Head",
                        (int(outer_x - outer_r), int(outer_y - outer_r - 10)),
                        cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 0, 255), 2
                    )

    cv2.imshow("Ratchet Detection", frame)
    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
cv2.destroyAllWindows()

树莓派实时性能优化建议

  • 保持当前640*480的分辨率即可满足检测需求,算力占用仅为1080P的1/5左右
  • 若仍有卡顿,可每2帧执行一次检测逻辑,中间帧直接复用前一次的检测位置做跟踪,帧率可提升50%以上
  • 关闭不需要的后台进程,避免占用树莓派CPU资源

侧视图识别拓展思路

后续开发侧视图识别时,可在现有基础上新增轮廓匹配逻辑:提前采集不同尺寸侧视图的轮廓特征,用cv2.matchShapes计算轮廓相似度,相似度阈值设置为0.1~0.15即可完成稳定识别。


内容的提问来源于stack exchange,提问作者Utkarsh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.24 00:45:04