当前位置: 首页 > news >正文

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 0sensor 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;

摄像头型号

分辨率
Width x Height

帧率

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;
    • QHD
    • 2560x1440
    • QXGA
    • 2048x1536
    • WQXGA
    • 2560x1600
    • WQXGA2
    • 2592x1944
  • 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)

类型

分辨率
(width x height @ fps)

备注

LT9611

1920x1080@30

默认值(01科技 默认HDMI驱动芯片)

1280x720@30

640x480@60

HX8377

1080x1920@30

默认值

ST7701

800x480@30

默认值
可设置为竖屏480x800

854x480@30

可设置为竖屏480x854

VIRT

640x480@90

默认值

IDE调试专用,不显示内容在外接屏幕
用户可自定义设置分辨率(64x64)-(4096x4096)和帧率(1-200)

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使用

图像传感器支持列表#

图像传感器型号

分辨率
Width x Height

帧率

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

http://www.dtcms.com/a/355249.html

相关文章:

  • flutter 中 的 关键字
  • flutter Function和自定义的Callback有什么区别?
  • flutter 高斯模糊闪烁问题
  • Spring AI Alibaba开发实战:从入门到高级应用
  • C# 模式匹配(Pattern Matching)
  • ASP4644四通道集成方案在射频通信系统中的可行性分析
  • Cesium入门教程(一):Cesium简介
  • PDFMathTranslate:让科学PDF翻译不再难——技术原理与实践指南
  • 回调函数的理解和例子
  • 从用户视角出发:如何提升B端产品的操作效率?
  • 把 AI 塞进「智能水杯」——基于声学指纹的零样本水质检测杯
  • [p2p-Magnet] 队列与处理器 | DHT路由表
  • Chrome 插件开发实战:从入门到精通
  • 基于复旦微ZYNQ7015+VU3P 的双FMC 基带信号处理平台(国产率100%)
  • 基于复旦微RFVU3P FPGA 的基带信号处理板(100%国产率)
  • 水果目标检测[3]:计算机视觉中的深度学习用于监测苹果树生长和水果生产的综合综述
  • 配置 Gitlab 和 Elasticsearch/Zoekt 并使用 Docker Metadata 数据库、Camo 代理服务
  • 鸿蒙Harmony-从零开始构建类似于安卓GreenDao的ORM数据库(五)
  • QP原理讲解
  • 企业微信配置LangBot通信机器人
  • Javascript》》JS》》ES6》》总结
  • 企业招聘难题破解:主流AI面试工具实测对比
  • 【Linux知识】Linux 设置账号密码永不过期
  • Day15 (前端:JavaScript基础阶段)
  • 健永科技RFID技术在羊智能分群管理系统的使用案例
  • leetcode 3446. 按对角线进行矩阵排序 中等
  • 3446. 按对角线进行矩阵排序
  • 前端异常监控,性能监控,埋点,怎么做的
  • 响应式编程框架Reactor【1】
  • React 类生命周期 和 React Hooks 比对