k230 使用摄像头将拍照的RGB565格式图片,保存为jpg图片文件到板载TF存储卡中
k230 使用摄像头将拍照的RGB565格式图片,保存为jpg图片文件到板载TF存储卡中 的源代码,程序执行后的效果如下:
实际运行效果输出如下:
camera_test
find sensor gc2093_csi2, type 30, output 1920x1080@60
vb common pool count 5
sensor(0), mode 0, buffer_num 4, buffer_size 0
MPY: soft reboot
CanMV v1.3-132-gb19c756(based on Micropython e00a144) on 2025-08-09; k230_canmv_01studio with K230
程序运行后,会在以下程序运行后,保寸摄像头拍摄图片文件到TF存储卡中,存储位置为虚拟U盘的/sdcard/目录下,图片文件的名称为test.jpg。
img = sensor.snapshot(chn = CAM_CHN_ID_1)
img.save("/sdcard/test.jpg")
源程序如下:
#RGB565保存为图片
#将RGB888的照片压缩为JPEG imga = img.compressed(quality=70)
import time, os, sysfrom media.sensor import *
from media.display import *
from media.media import *# save image raw data, use 7yuv to previewtry:print("camera_test")# construct a Sensor object with default configuresensor = Sensor()# sensor resetsensor.reset()# set chn0 output size, 1920x1080sensor.set_framesize(Sensor.FHD)# set chn0 output formatsensor.set_pixformat(Sensor.YUV420SP)# bind sensor chn0 to display layer video 1bind_info = sensor.bind_info()Display.bind_layer(**bind_info, layer = Display.LAYER_VIDEO1)# set chn1 output formatsensor.set_framesize(width = 640, height = 480, chn = CAM_CHN_ID_1)sensor.set_pixformat(Sensor.RGB565, chn = CAM_CHN_ID_1)# use hdmi as display outputDisplay.init(Display.LT9611, to_ide = True)# init media managerMediaManager.init()# sensor start runsensor.run()# drop 100 framesfor i in range(100):sensor.snapshot()img = sensor.snapshot(chn = CAM_CHN_ID_1)img.save("/sdcard/test.jpg")except KeyboardInterrupt as e:print(f"user stop")
except BaseException as e:print(f"Exception '{e}'")
finally:# sensor stop runif isinstance(sensor, Sensor):sensor.stop()# deinit displayDisplay.deinit()os.exitpoint(os.EXITPOINT_ENABLE_SLEEP)time.sleep_ms(100)# release media bufferMediaManager.deinit()
扩展知识:
CanMV K230使用camera模块实现摄像头采集图像功能,K230硬件支持3路sensor输入(CSI接口),每个sensor设备均可独立完成图像数据采集捕获处理,并可以同时输出3路图像数据。如下图:
sensor 0,sensor 1,sensor 2表示三个图像传感器;Camera Device 0,Camera Device 1,Camera Device 2表示三个sensor设备;output channel 0,output channel 1,output channel 2表示sensor设备的三个输出通道。三个图像传感器可以通过软件配置映射到不同的sensor 设备。
图中,sensor 0、sensor 1 和 sensor 2 分别代表三个图像输入传感器设备;这些传感器主要用于将环境中的光信号转化为数字图像信号。在实际系统中,这些传感器可以安装在不同的位置,用来捕获来自不同视角或者区域的图像数据。
每个Camera Device支持 3个输出通道(output channel 0、output channel 1 和 output channel 2)。这些输出通道的主要功能是将处理后的图像数据并行传输到后续的算法模块或显示设备,同时也支持多种数据格式和尺寸。这样的架构设计,让K230能够支持多路图像数据的高效并行处理,非常适合实时性要求较高的AI视觉任务。
K230 的 sensor 模块最多支持三路图像传感器的同时接入,每一路均可独立完成图像数据的采集、捕获和处理。此外,每个视频通道可并行输出三路图像数据供后端模块进行进一步处理。实际应用中,具体支持的传感器数量、输入分辨率和输出通道数将受限于开发板的硬件配置和内存大小,因此需根据项目需求进行综合评估。
三路图像输入:
同时接入3个传感器,适合多摄像头应用场景,比如:
- 自动驾驶中的多视角检测。
- 安防监控中的多区域捕获。
- 工业检测中的多面检测。
三路图像输出:
为每个输入提供并行的多通道输出,便于在不同模块中并发处理,比如:
- 一路用于实时显示。
- 一路用于AI算法推理。
- 一路用于视频存储或回放。
Sensor对象
构造函数
from media.sensor import * #导入sensor模块,使用摄像头相关接口
API描述
构造函数
【描述】
根据csi id和摄像头类型构建Sensor对象
用户需要先构建Sensor对象再继续操作
目前已实现自动探测摄像头,用户可选择输出图像的最大分辨率和帧率,参考摄像头列表
用户设置目标分辨率和帧率之后,如果底层驱动不支持该设置,则会进行自动匹配出最佳配置,具体使用的配置可参考日志,如use sensor 23, output 640x480@90
sensor = Sensor(id,[width, height, fps])
构建摄像头对象。目前支持摄像头型号有:GC2093、OV5647
- id: CSI输入号。
- 0 : CSI0;
- 1 : CSI1;
- 2 : CSI2;默认值,开发板上的摄像头。
- width: 可选参数,sensor采集图像宽度。默认1920;
- height: 可选参数,sensor采集图像高度。默认1080;
- fps: 可选参数,sensor最大帧率。默认30;
摄像头型号 | 分辨率 | 帧率 |
OV5647 | 1920x1080 | 30 |
1280x960 | 60 | |
1280x720 | 60 | |
640x480 | 90 |
sensor = Sensor(id = 0)
sensor = Sensor(id = 0, witdh = 1280, height = 720, fps = 60)
sensor = Sensor(id = 0, witdh = 640, height = 480)
使用方法
sensor.reset()
复位和初始化摄像头。
设置指定通道的输出图像尺寸
用户可使用framesize或通过指定width&height来设置输出图像尺寸
宽度会自动对齐到16像素宽
sensor.set_framesize(framesize = FRAME_SIZE_INVAILD, [width, height],chn = CAM_CHN_ID_0, alignment=0, **kwargs)
设置每个通道的图像输出尺寸。
- framesize: 输出通道图像尺寸。下面列出一些常用尺寸。自定义尺寸可以通过[width, height]参数设置,如: width=800, height=480 。注意framesize和 [width, height]只使用其中一种方式设置。
- sensor.QQVGA : 320x240
- sensor.QVGA : 320x240
- sensor.VGA : 640x480;
- Sensor.FHD : 1920x1080;
- Sensor.HD : 1280x720;
|
|
|
|
|
|
|
|
-
- chn: 通道编号。每个摄像头设备有3个通道。
- CAM_CHN_ID_0 : 通道0;
- CAM_CHN_ID_1 : 通道1;
- CAM_CHN_ID_2 : 通道2;
- # 配置sensor设备0,输出通道0, 输出图尺寸为640x480
- sensor.set_framesize(chn = CAM_CHN_ID_0, width = 640, height = 480)
- # 配置sensor设备0,输出通道1, 输出图尺寸为320x240
- sensor.set_framesize(chn = CAM_CHN_ID_1, width = 320, height = 240)
设置指定sensor设备和通道的输出图像格式
sensor.set_pixformat(pixformat, chn = CAM_CHN_ID_0)
设置图像像素格式。
- pixformat: 输出图像格式。
- sensor.GRAYSCALE : 灰度图像,每像素8位(1字节),处理速度快。
- sensor.RGB565 : 每像素为16位(2字节),5位用于红色,6位用于绿色,5位用于蓝色,处理速度比灰度图像要慢。
- sensor.RGB888
- sensor.RGBP888
- sensor.YUV420SP :YVU420planar NV12
- chn: 输出通道编号。每个摄像头设备有3个通道。
- CAM_CHN_ID_0 : 通道0;
- CAM_CHN_ID_1 : 通道1;
- CAM_CHN_ID_2 : 通道2;
- # 配置sensor设备0,输出通道0, 输出NV12格式
- sensor.set_pixformat(sensor.YUV420SP, chn = CAM_CHN_ID_0)
- # 配置sensor设备0,输出通道1, 输出RGB888格式
- sensor.set_pixformat(sensor.RGB888, chn = CAM_CHN_ID_1)
sensor.set_hmirror(enable)
设置摄像头画面水平镜像。
- enable: 格式。
- 1 : 开启水平镜像;
- 0 : 关闭水平镜像。
sensor.set_vflip(enable)
设置摄像头画面垂直翻转。
- enable: 格式。
- 1 : 开启垂直翻转;
- 0 : 关闭垂直翻转。
提示:通过设置摄像头的水平镜像和垂直翻转组合可以实现任意画面变换。
sensor.run()
启动摄像头。必须在MediaManager.init()之前调用
如果同时使用多个摄像头(最多3个),只需要其中一个执行run即可
如果同时使用多个摄像头(最多3个),需要每一个都执行stop
sensor.stop()# 停止sensor设备0输出数据流
从指定sensor设备的支持输出通道中捕获一帧图像数据
sensor.snapshot()#从sensor设备0的通道0输出捕获一帧图像数据
sensor.snapshot(chn = CAM_CHN_ID_0)# CAM_CHN_ID_0 CAM_CHN_ID_1 CAM_CHN_ID_2
使用相机拍摄一张照片,并返回 image 对象。
sensor.bind_info在Display.bind_layer时使用,获取绑定信息
sensor.bind_info(x = 0, y = 0, chn = CAM_CHN_ID_0)
x,y:将sensor指定通道输出图像绑定到Display或Venc模块的指定坐标
sensor.bind_info
【描述】
在Display.bind_layer时使用,获取绑定信息
【语法】
sensor.bind_info(x = 0, y = 0, chn = CAM_CHN_ID_0)
【参数】
参数名称 | 描述 | 输入/输出 |
x | 将sensor指定通道输出图像绑定到Display或Venc模块的指定坐标 | |
y | 将sensor指定通道输出图像绑定到Display或Venc模块的指定坐标 | |
chn_num | sensor输出通道号 |
chn = sensor输出通道号
find sensor gc2093_csi2, type 30, output 1920x1080@60
LAYER_OSD1 不支持格式:Sensor.YUV420SP
Display.LAYER_VIDEO1:AssertionError: bind video layer only support format PIXEL_FORMAT_YUV_SEMIPLANAR_420
Display.init(type = None, width = None, height = None, osd_num = 1, to_ide = False, fps = None)
类型 | 分辨率 | 备注 |
LT9611 | 1920x1080@30 | 默认值(01科技 默认HDMI驱动芯片) |
1280x720@30 | ||
640x480@60 | ||
HX8377 | 1080x1920@30 | 默认值 |
ST7701 | 800x480@30 | 默认值 |
854x480@30 | 可设置为竖屏480x854 | |
VIRT | 640x480@90 | 默认值 |
IDE调试专用,不显示内容在外接屏幕 |
K230 提供 2 层视频图层支持和 4 层 OSD 图层支持。分列如下:
显示层 | 说明 | 备注 |
LAYER_VIDEO1 | 仅bind_layer可用 | |
LAYER_VIDEO2 | 仅bind_layer可用 | |
LAYER_OSD0 | 支持show_image和bind_layer使用 | |
LAYER_OSD1 | 支持show_image和bind_layer使用 | |
LAYER_OSD2 | 支持show_image和bind_layer使用 | |
LAYER_OSD3 | 支持show_image和bind_layer使用 |
图像传感器支持列表#
图像传感器型号 | 分辨率 | 帧率 |
OV5647 | 2592x1944 | 10 FPS |
1920x1080 | 30 FPS | |
1280x960 | 45 FPS | |
1280x720 | 60 FPS | |
640x480 | 90 FPS | |
GC2093 | 1920x1080 | 30 FPS |
1920x1080 | 60 FPS | |
1280x960 | 60 FPS | |
1280x720 | 90 FPS | |
IMX335 | 1920x1080 | 30 FPS |
2592x1944 | 30 FPS |