以下是代码部分
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