网上的教程大多是先讲GPIO口·,逐渐才讲摄像头,但是我觉得对于机器视觉的相关开发板而言,并不需要像学习32系列那样先学习GOIO口,在点个LED灯那样逐渐学习。相信开始学习摄像头的朋友们肯定学习过一些开发板,所以我们再向学习32那样开始学习GPIO口,其实是不适当的,所以我会先讲摄像头,先让屏幕在电脑上显示出来。

在这次开始教程开始之前,我觉得有必要先讲一下开发板上的摄像头的参数,以及怎么选择摄像头,以便于有些人们会升级摄像头,或者将开发板上的三路摄像头接口都接上,实现多视角或多目标的图像采集和处理。

一、摄像头

1.GC2093:

嘉立创K230上开发板默认发的是GC2093-200W摄像头小镜头版-定焦70cm,如果自身需要大的识别范围的话,可以购买嘉立创的大镜头版-可旋转调焦。

2.摄像头接口:

板子上提供了三路摄像头接口,都是22p-0.5mm的FPC接口,不同的是CSI2(默认摄像头)是立式的可插拔座子,在板子正面;CSI0和CSI1是卧式的翻盖座子,在板子背面,和mipi接口在同一侧。都兼容树莓派zero和树莓派5的摄像头接口,理论上能给树莓派zero和树莓派5使用的摄像头就可以给我们的板子使用,软件上需要额外适配。

3. K230的摄像头架构

K230的Sensor模块API提供了对这些硬件的底层控制,模块负责图像采集与数据处理。该模块提供了一套高级 API,开发者可以利用这些接口轻松获取不同格式与尺寸的图像,而无需了解底层硬件的具体实现。其架构如下图所示:

图中,sensor 0、sensor 1 和 sensor 2 分别代表三个图像输入传感器设备;这些传感器主要用于将环境中的光信号转化为数字图像信号。在实际系统中,这些传感器可以安装在不同的位置,用来捕获来自不同视角或者区域的图像数据。比如说三路摄像头场景,车辆前后摄像检测各一路+驾驶仓内一路。也可以将CSI0+CSI1转接成一个4lane的接口用来接更高清的摄像头。

二、代码部分

1. 核心模块导入

import time, os, sys

from media.sensor import * # 摄像头控制核心模块

from media.display import Display # 显示管理模块

from media.media import MediaManager # 系统资源管理模块

sensor:提供摄像头初始化、参数配置、图像捕获等底层接口。display:支持将图像渲染到虚拟显示或物理屏幕(本文使用 IDE 虚拟显示)。MediaManager:管理系统媒体资源,确保多模块协同工作

2. 可配置参数说明

SENSOR_ID = 2 # 摄像头设备ID(需与硬件连接通道对应)

RESOLUTION = (1920, 1080) # 采集分辨率(支持FHD/HD/VGA等,需根据硬件支持调整)

PIXFORMAT = Sensor.RGB888 # 像素格式(RGB888为24位真彩色,适合图像算法处理)

设备 ID(SENSOR_ID):通常对应开发板的 CSI 通道编号(如 0/1/2),需根据实际硬件连接配置。分辨率与像素格式:K230 支持多种分辨率,高分辨率需注意处理器性能与带宽占用平衡。

3. 摄像头初始化与配置

sensor = Sensor(id=SENSOR_ID)

sensor.reset() # 重置摄像头硬件

sensor.set_framesize(Sensor.FHD, chn=CAM_CHN_ID_0) # 设置1080P分辨率(通道0)

sensor.set_pixformat(PIXFORMAT, chn=CAM_CHN_ID_0) # 设置RGB888像素格式

reset():初始化摄像头传感器,恢复默认配置。set_framesize():指定采集分辨率(Sensor.FHD对应 1920x1080)。set_pixformat():设置图像像素格式,影响后续算法处理(如颜色空间转换)

4. 实时图像采集主循环

while True:

img = sensor.snapshot(chn=CAM_CHN_ID_0) # 捕获一帧图像

Display.show_image(img) # 在IDE中显示图像

time.sleep_ms(10) # 10ms延时降低CPU占用

核心逻辑:

snapshot():从指定通道(CAM_CHN_ID_0)获取图像数据,返回Image对象。show_image():将图像渲染到目标显示设备(此处为 IDE 虚拟屏幕)。延时优化:通过time.sleep_ms(10)避免 CPU 满负荷运行,保证系统稳定性。

6. 资源释放与异常处理

except KeyboardInterrupt:

print("程序已由用户终止")

except Exception as e:

print(f"运行时错误: {str(e)}")

finally:

if sensor:

sensor.stop() # 停止摄像头采集

print("摄像头已停止")

Display.deinit() # 反初始化显示模块

MediaManager.deinit() # 释放系统资源

print("资源已释放")

重要性:确保程序退出时正确关闭硬件设备,避免内存泄漏或设备占用冲突。

三、扩展与优化建议

分辨率调整:尝试将RESOLUTION改为(1280, 720)(HD)或(640, 480)(VGA),观察帧率变化。像素格式优化:若需灰度图处理,可将PIXFORMAT改为Sensor.GRAYSCALE以减少数据量。算法集成:在snapshot()后添加图像处理逻辑(如边缘检测、颜色过滤),实现智能视觉功能。物理显示输出:将Display.init()的第一个参数改为Display.LCD,并配置 LCD 屏幕参数,实现本地显示。

本文代码已在庐山派 K230 开发板(固件版本 v2.9.0)与 CanMV IDE v4.0.7 环境下测试通过,转载请注明出处。