新手小白,我写了一个轮询来开两个摄像头来进行检测,但是出了问题,请大佬解惑

Viewed 52

以下是代码部分

from libs.PipeLine import PipeLine, ScopedTiming
from libs.YOLO import YOLOv8
import os, sys, gc, time
import ulab.numpy as np
import image
from machine import UART, FPIOA
from media.sensor import *
from media.media import *

# 配置参数
display_mode = "lcd"  
rgb888p_size = [640, 640]
display_size = [640, 480] if display_mode == "lcd" else [640, 640]
kmodel_path = "/data/fang.kmodel"
labels = ["1", "2", "3", "4", "5", "6"]
confidence_threshold = 0.8
nms_threshold = 0.45
model_input_size = [640, 640]

# 自定义区域
custom_regions = [
    (0, 0, 97, 640),     
    (97, 0, 208, 640),   
    (208, 0, 319, 640),  
    (319, 0, 430, 640),  
    (430, 0, 520, 640),  
    (520, 0, 640, 640),  
]

# 初始化UART
fpioa = FPIOA()
fpioa.set_function(3, FPIOA.UART1_TXD)
uart = UART(UART.UART1, 115200)

# 初始化推理系统
def init_inference_system():  
    MediaManager._config()
    MediaManager.init()
    pl = PipeLine(rgb888p_size=rgb888p_size, display_size=display_size, display_mode=display_mode)
    pl.create(hmirror=True)
    yolo = YOLOv8(
        task_type="detect", 
        mode="image",  
        kmodel_path=kmodel_path,
        labels=labels,
        rgb888p_size=rgb888p_size,
        model_input_size=model_input_size,
        display_size=display_size,
        conf_thresh=confidence_threshold,
        nms_thresh=nms_threshold,
        max_boxes_num=50,
        debug_mode=0
    )
    yolo.config_preprocess()
    return pl, yolo

# 处理单帧
def process_frame(yolo, pl, img, camera_id, frame_num):
    try:
        img = img.resize(rgb888p_size)
        with ScopedTiming(f"camera_{camera_id}_frame_{frame_num}", 1):
            res = yolo.run(img)
            detection_regions = [{} for _ in range(6)]
            for det in res:
                x1, y1, x2, y2 = det[:4]
                cx, cy = (x1 + x2)/2, (y1 + y2)/2
                region_idx = -1
                for i, (rx1, ry1, rx2, ry2) in enumerate(custom_regions):
                    if rx1 <= cx < rx2 and ry1 <= cy < ry2:
                        region_idx = i
                        break
                if 0 <= region_idx < 6:
                    label = labels[int(det[5])]
                    detection_regions[region_idx][label] = detection_regions[region_idx].get(label, 0) + 1
            output = [max(reg, key=reg.get) if reg else "0" for reg in detection_regions]
            output_str = f"Camera {camera_id} Frame {frame_num}: " + " ".join(output)
            uart.write(output_str)
            print(output_str)
            yolo.draw_result(res, pl.osd_img)
            pl.show_image()
            gc.collect()
            return output_str
    except Exception as e:
        print(f"处理摄像头 {camera_id} 第{frame_num}帧时出错: {e}")
        return None

# 配置摄像头(返回实例)
def config_camera(sensor_id):
    if sensor_id==0:
        sensor1 = Sensor(id=sensor_id, vflip=True)
        sensor1.reset()
        sensor1.set_pixformat(sensor.RGB565)
        sensor1.set_framesize(sensor.SVGA)
        sensor1.set_framerate(30)
    else:
        sensor2 = Sensor(id=sensor_id, vflip=True)
        sensor2.reset()
        sensor2.set_pixformat(sensor.RGB565)
        sensor2.set_framesize(sensor.SVGA)
        sensor2.set_framerate(30)
    time.sleep_ms(100)
    print(f"摄像头 {sensor_id} 配置完成")
    return sensor

# 采集并处理帧(接收 sensor 实例)
def capture_and_process_frames(yolo, pl, sensor, num_frames):
    camera_id = sensor.id
    print(f"开始从摄像头 {camera_id} 采集并处理 {num_frames} 帧...")
    for i in range(num_frames):
        img = sensor.snapshot()
        process_frame(yolo, pl, img, camera_id, i + 1)
        time.sleep_ms(10)
    print(f"摄像头 {camera_id} 采集与处理完成")

# 主程序
def main():
    camera1_id = 0
    camera2_id = 2
    frames_per_cycle = 10
    sensor1 = None  
    sensor2 = None 
    pl = None
    yolo = None
    try:
        pl, yolo = init_inference_system()
        # 获取配置好的 sensor 实例
        sensor1 = config_camera(camera1_id)
        if sensor1 is None:
            print(f"配置 camera {camera1_id} 失败,无法获取 sensor 实例")
        sensor2 = config_camera(camera2_id)  
        if sensor2 is None:
            print(f"配置 camera {camera2_id} 失败,无法获取 sensor 实例")
        print("开始轮询采集与推理...")
        while True:
            capture_and_process_frames(yolo, pl, sensor1, frames_per_cycle)
            capture_and_process_frames(yolo, pl, sensor2, frames_per_cycle)
            time.sleep_ms(100)
    except KeyboardInterrupt:
        print("程序被用户中断")
    except Exception as e:
        print(f"发生错误: {e}")
    finally:
        yolo.deinit()
        pl.destroy()
        uart.deinit()
        # 用实例重置
        sensor1.reset()  
        sensor2.reset()  
        print("程序结束")

if __name__ == "__main__":
    main()

以下是报错
AttributeError: 'NoneType' object has no attribute 'deinit'
Traceback (most recent call last):
File "", line 152, in
File "", line 143, in main
AttributeError: 'NoneType' object has no attribute 'deinit'
MPY: soft reboot
CanMV v1.2.2(based on Micropython e00a144) on 2024-12-18; k230_canmv_01studio with K230
发生错误: _config() takes 2 positional arguments but 1 were given

1 Answers

你打印一下main方法中的yolo,看一下类型是不是对的