没有上路尝试过,但是如果用纸可以完成上路应该没啥问题,但是应该要调调阈值,或者说改变循迹框的位置

import cv2
import numpy as np
from picamera2 import Picamera2
from time import sleep

picam2 = Picamera2()
config = picam2.create_preview_configuration(main={"size": (640, 480)})
picam2.configure(config)
picam2.start()
sleep(2)

THRESHOLD = 50
BOX_WIDTH = 80
BOX_HEIGHT = 60
BOX_Y_POS = 400

def get_track_status(frame):
    gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
    track_status = [0, 0, 0, 0, 0]
    center_x = frame.shape[1] // 2
    box_positions = [
        center_x - 2*BOX_WIDTH,
        center_x - BOX_WIDTH,
        center_x,
        center_x + BOX_WIDTH,
        center_x + 2*BOX_WIDTH
    ]
    
    for i, x in enumerate(box_positions):
        x = max(0, min(frame.shape[1]-BOX_WIDTH, x))
        roi = gray[BOX_Y_POS:BOX_Y_POS+BOX_HEIGHT, x:x+BOX_WIDTH]
        mean_val = np.mean(roi)
        if mean_val < THRESHOLD:
            track_status[i] = 1
        color = (0, 255, 0) if track_status[i] else (0, 0, 255)
        cv2.rectangle(frame, (x, BOX_Y_POS), (x+BOX_WIDTH, BOX_Y_POS+BOX_HEIGHT), color, 2)
    
    return track_status

try:
    while True:
        frame = picam2.capture_array()
        frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR)
        status = get_track_status(frame)
        print("Track Status:", status)
        cv2.putText(frame, str(status), (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (255, 255, 255), 2)
        cv2.imshow("Track Detection", frame)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break

finally:
    picam2.stop()
    cv2.destroyAllWindows()

这是一个五路循迹代码,如果检测到黑色返回1,其他返回0,

如果想扩展至七路或者九路循迹,或者想要调整框的间距就改变这里

box_positions = [
    center_x - 2*SPACING,
    center_x - SPACING,
    center_x,
    center_x + SPACING,
    center_x + 2*SPACING
]

以及这里,几路循迹就改成几个数值

track_status = [0, 0, 0, 0, 0]

如果检测不到黑色,就改这个值,值越大,检测黑色能力就越强

THRESHOLD = 50

运行结果如下:

最后再把00110发给主控就行了

Logo

火山引擎开发者社区是火山引擎打造的AI技术生态平台,聚焦Agent与大模型开发,提供豆包系列模型(图像/视频/视觉)、智能分析与会话工具,并配套评测集、动手实验室及行业案例库。社区通过技术沙龙、挑战赛等活动促进开发者成长,新用户可领50万Tokens权益,助力构建智能应用。

更多推荐