按键切换摄像头拍照失败

Viewed 58

问题描述


代码能运行第一个显示,切换摄像头得时候会报错:
Traceback (most recent call last):
File "", line 80, in
File "media/sensor.py", line 1, in snapshot
RuntimeError: sensor(1) snapshot chn(0) failed(3)
MPY: soft reboot

复现步骤


'''
实验平台:01Studio CanMV K230
'''

import time, os, sys, network

from media.sensor import * #导入sensor模块,使用摄像头相关接口
from media.display import * #导入display模块,使用display相关接口
from media.media import * #导入media模块,使用meida相关接口

from media.pyaudio import * #导入pyaudio模块,用于采集和播放音频
import media.wave as wave   #导入wav模块,用于保存和加载wav音频文件

from machine import Pin,TOUCH
from machine import FPIOA

#将GPIO52、GPIO21配置为普通GPIO模式
fpioa = FPIOA()
fpioa.set_function(52,FPIOA.GPIO52)
fpioa.set_function(21,FPIOA.GPIO21)

LED=Pin(52,Pin.OUT) #构建LED对象,开始熄灭
KEY=Pin(21,Pin.IN,Pin.PULL_UP) #构建KEY对象
LED.value(1)
time.sleep_ms(150)
LED.value(0)
time.sleep_ms(150)
LED.value(1)
time.sleep_ms(150)
LED.value(0)
time.sleep_ms(150)

#构建3.5寸电容触摸屏对象
tp = TOUCH(0)

state=0 #LED引脚状态
test = 1 #测试项目编号
camera_index = 0 #当前摄像头索引

# 初始化三个摄像头
sensor0 = Sensor(id=0, fps=30) #构建摄像头对象0
sensor0.reset() #复位和初始化摄像头
sensor0.set_framesize(width=800, height=480) #设置帧大小(800x480)
sensor0.set_pixformat(Sensor.RGB565) #设置输出图像格式

sensor1 = Sensor(id=1, fps=30) #构建摄像头对象1
sensor1.reset() #复位和初始化摄像头
sensor1.set_framesize(width=800, height=480) #设置帧大小(800x480)
sensor1.set_pixformat(Sensor.RGB565) #设置输出图像格式

sensor2 = Sensor(id=2, fps=30) #构建摄像头对象2
sensor2.reset() #复位和初始化摄像头
sensor2.set_framesize(width=800, height=480) #设置帧大小(800x480)
sensor2.set_pixformat(Sensor.RGB565) #设置输出图像格式

#使用IDE缓冲区输出图像,显示尺寸和sensor配置一致。
Display.init(Display.ST7701, to_ide = True)

MediaManager.init() #初始化media资源管理器

# 启动所有摄像头(无需停止,直接切换)
sensor0.run()
sensor1.run()
sensor2.run()

clock = time.clock()

while True:

    ########################
    ###  测试信息:摄像头和LCD
    ########################

    while test == 1: #摄像头和LCD测试
        # 根据摄像头索引选择不同的摄像头拍摄
        if camera_index == 0:
            img = sensor0.snapshot() #拍摄摄像头0的图
        elif camera_index == 1:
            img = sensor1.snapshot() #拍摄摄像头1的图
        else:
            img = sensor2.snapshot() #拍摄摄像头2的图

        #写字符,支持中文。
        img.draw_string_advanced(0, 0, 40, "1.Camera and LCD", color = (255, 255, 255))
        img.draw_string_advanced(450, 0, 40, "(Press KEY to next)", color = (255, 255, 255))
        img.draw_string_advanced(0, 40, 30, f"Camera ID: {camera_index}", color = (255, 255, 255))

        Display.show_image(img) #显示图片

        if KEY.value()==0:   #按键被按下
            time.sleep_ms(10) #消除抖动
            if KEY.value()==0: #确认按键被按下
                # 直接切换到下一个摄像头(无需停止)
                if camera_index < 2:
                    camera_index += 1
                else:
                    # 已经显示完所有摄像头,进入下一项测试
                    test = test + 1
                    camera_index = 0  # 重置摄像头索引
                    break  # 跳出摄像头测试循环
                
                while not KEY.value(): #检测按键是否松开
                    pass
                # 不要break,让循环继续执行显示新的摄像头

硬件板卡


01studio-K230

软件版本


CanMV v1.3-142-g902d740(based on Micropython e00a144) on 2025-08-26; k230_canmv_01studio with K230

1 Answers

你好,这个代码无法复现拍照失败的问题~