问题描述
# 立创·庐山派-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
看提示,应该是发生在建立摄像头缓冲区之后,需要断电重启才可以运行代码,按复位键是没有用的