运行三摄显示时缓冲区正常显示但是配置的hdmi并没有正常输出画面

Viewed 8

问题描述


# 立创·庐山派-K230-CanMV开发板资料与相关扩展板软硬件资料官网全部开源
# 开发板官网:www.lckfb.com
# 技术支持常驻论坛,任何技术问题欢迎随时交流学习
# 立创论坛:www.jlc-bbs.com/lckfb
# 关注bilibili账号:【立创开发板】,掌握我们的最新动态!
# 不靠卖板赚钱,以培养中国工程师为己任

import time, os, sys

from media.sensor import *
from media.display import *
from media.media import *

from machine import UART
from machine import FPIOA

picture_width = 400
picture_height = 240

sensor_id = 0
sensor_id1 = 1
sensor = None

fpioa = FPIOA()
fpioa.set_function(11, FPIOA.UART2_TXD)
fpioa.set_function(12, FPIOA.UART2_RXD)
fpioa.set_function(50, FPIOA.UART3_TXD)
fpioa.set_function(51, FPIOA.UART3_RXD)

uart = UART(UART.UART2, baudrate=115200, bits=UART.EIGHTBITS, parity=UART.PARITY_NONE, stop=UART.STOPBITS_ONE)

roi = (75, 45, 250, 150)
UART_image_x = 0
UART_image_y = 0
Limit_x = 0
Limit_y = 0
Limit_w = 250
Limit_h = 150

sensor2 = None

# 显示模式选择:可以是 "VIRT"、"LCD" 或 "HDMI"
DISPLAY_MODE = "HDMI"

# 根据模式设置显示宽高
if DISPLAY_MODE == "VIRT":
    # 虚拟显示器模式
    DISPLAY_WIDTH = ALIGN_UP(1920, 16)
    DISPLAY_HEIGHT = 1080
elif DISPLAY_MODE == "LCD":
    # 3.1寸屏幕模式
    DISPLAY_WIDTH = 800
    DISPLAY_HEIGHT = 480
elif DISPLAY_MODE == "HDMI":
    # HDMI扩展板模式
    DISPLAY_WIDTH = 1920
    DISPLAY_HEIGHT = 1080
else:
    raise ValueError("未知的 DISPLAY_MODE,请选择 'VIRT', 'LCD' 或 'HDMI'")

try:
    # 构造一个具有默认配置的摄像头对象
    sensor = Sensor(id=sensor_id)
    # 重置摄像头sensor
    sensor.reset()
    # 设置通道0的输出尺寸为1920x1080
    sensor.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_0)
    # 设置通道0的输出像素格式为RGB565
    sensor.set_pixformat(Sensor.GRAYSCALE, chn=CAM_CHN_ID_0)

    # 构造一个具有默认配置的摄像头对象
    sensor1 = Sensor(id=sensor_id1)
    # 重置摄像头sensor
    sensor1.reset()
    # 设置通道0的输出尺寸为1920x1080
    sensor1.set_framesize(width=picture_width, height=picture_height, chn=CAM_CHN_ID_1)
    # 设置通道0的输出像素格式为RGB565
    sensor1.set_pixformat(Sensor.GRAYSCALE, chn=CAM_CHN_ID_1)
    
    # 构造一个具有默认配置的摄像头对象
    sensor2 = Sensor(id=2)
    # 重置摄像头sensor
    sensor2.reset()
    # 设置通道0的输出尺寸为1920x1080
    sensor2.set_framesize(sensor.FHD)
    # 设置通道0的输出像素格式为RGB565
    sensor2.set_pixformat(Sensor.YUV420SP)
    
    # 无需进行镜像翻转
    # 设置水平镜像
    # sensor.set_hmirror(False)
    # 设置垂直翻转
    sensor.set_vflip(True)
    sensor1.set_vflip(True)
    
    bind_info = sensor2.bind_info(x=0, y=0)
    Display.bind_layer(**bind_info, layer=Display.LAYER_VIDEO1)
    
    # 根据模式初始化显示器
    if DISPLAY_MODE == "VIRT":
        Display.init(Display.VIRT, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
    elif DISPLAY_MODE == "LCD":
        Display.init(Display.ST7701, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)
    elif DISPLAY_MODE == "HDMI":
        Display.init(Display.LT9611, width=DISPLAY_WIDTH, height=DISPLAY_HEIGHT, to_ide=True)

    # 初始化媒体管理器
    MediaManager.init()
    # 启动传感器
    sensor.run()
    #sensor1.run()

    while True:
        os.exitpoint()

        # 捕获通道0的图像
        img = sensor.snapshot(chn=CAM_CHN_ID_0)
        img1 = sensor1.snapshot(chn=CAM_CHN_ID_1)

        # 可以在此处根据需求先做一些预处理,如灰度化、边缘检测、二值化等

        # 查找线段(LSD算法)
        #  merge_distance=20         # 两线段中心点相距小于20像素则合并
        #  max_theta_diff=10        # 两线段角度差小于10°则合并\

        eyes = img.find_eye(roi)
        

        #for eye in eyes:
            #img.draw_line(line.eye(), color=(1, 147, 230), thickness=3)  # 绘制线段
        img.draw_circle(eyes[0], eyes[1], 20, 0, thickness=5)
        print(f"eye : {eyes}")  # 打印线段信息
#        if(eyes[0] > 0):
#            uart.write(f"{eyes[0]}\r\n")
        img.draw_rectangle(75, 45, Limit_w, Limit_h, 0, thickness=5)
        
        eyes = img1.find_eye(roi)
        
        img1.draw_circle(eyes[0], eyes[1], 20, 0, thickness=5)
        print(f"eye : {eyes}")  # 打印线段信息
#                if(eyes[0] > 0):
#                    uart.write(f"{eyes[0]}\r\n")
        img1.draw_rectangle(75, 45, Limit_w, Limit_h, 0, thickness=5)

            #count += 1  # 更新计数器
#        lines = img.find_line_segments(merge_distance=20, max_theta_diff=10)
#        count = 0  # 初始化线段计数器

#        print("------线段统计开始------")
#        for line in lines:
#            img.draw_line(line.line(), color=(1, 147, 230), thickness=3)  # 绘制线段
#            print(f"Line {count}: {line}")  # 打印线段信息
#            count += 1  # 更新计数器
#        print("---------END---------")

        # 显示捕获的图像,中心对齐,居中显示aa
        Display.show_image(img, x=int((DISPLAY_WIDTH - picture_width) / 2), y=int((DISPLAY_HEIGHT - picture_height) / 2), layer=Display.LAYER_OSD1)
        Display.show_image(img1, x=int(((DISPLAY_WIDTH - picture_width) / 2) + picture_width), y=int((DISPLAY_HEIGHT - picture_height) / 2), layer=Display.LAYER_OSD2)

except KeyboardInterrupt as e:
    print("用户停止: ", e)
except BaseException as e:
    print(f"异常: {e}")
finally:
    # 停止传感器运行
    if isinstance(sensor, Sensor):
        sensor.stop()
        sensor1.stop()
        sensor2.stop()
    # 反初始化显示模块
    Display.deinit()
    os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)
    time.sleep_ms(100)
    # 释放媒体缓冲区
    MediaManager.deinit()

复现步骤


1.上电启动开发板
2.代码粘贴进canmv
3,点击绿色按钮开始运行,不把代码保存在开发板本地
4.串口正常输出,缓冲区也正常输出画面,但就是hdmi不输出

硬件板卡


庐山派

软件版本


CanMV K230 LCKFB _micropython_v1.4-0-g6cce59c nncase_v2.9.0.img.gz

其他信息


而且还有一定概率触发异常: 'sensor(2) snapshot chn(2) failed(3)'
camera_test
find sensor ov5647_csi0, type 1, output 1920x1080@30
find sensor ov5647_csi1, type 6, output 1920x1080@30
find sensor gc2093_csi2, type 24, output 1920x1080@60
vb common pool count 9
sensor(0), mode 1, buffer_num 4, buffer_size 4149248
sensor(1), mode 1, buffer_num 4, buffer_size 4149248
sensor(2), mode 1, buffer_num 4, buffer_size 4149248
异常: 'sensor(2) snapshot chn(2) failed(3)'
MPY: soft reboot
CanMV v1.4-24-gf73abaf(based on Micropython e00a144) on 2025-11-19; k230_canmv_lckfb with K230
看提示,应该是发生在建立摄像头缓冲区之后,需要断电重启才可以运行代码,按复位键是没有用的

1 Answers