NONAI2D CSC 模块 API 手册#
概述#
K230芯片内置24个硬件色彩空间转换(CSC)通道,能够高效地进行图像色彩空间转换处理。该模块支持多种图像格式转换,包括RGB/YUV等常见格式,适用于视频处理、图像显示等场景。
API 参考#
构造函数#
功能 初始化CSC转换通道。通道号由系统自动分配,无需用户指定。
语法
from nonai2d import CSC
csc = CSC(fmt, max_width=1920, max_height=1080, buf_num=2)
参数说明
参数 |
类型 |
说明 |
默认值 |
|---|---|---|---|
fmt |
int |
目标图像格式(见常量定义) |
无 |
max_width |
int |
支持处理的最大图像宽度(像素) |
1920 |
max_height |
int |
支持处理的最大图像高度(像素) |
1080 |
buf_num |
int |
分配的VB缓冲区数量,影响处理性能 |
2 |
返回值 成功返回CSC对象,失败抛出异常
重要说明
通道号由系统自动分配(0-23范围内),用户无需也无法指定
建议根据实际图像尺寸设置max_width/max_height以节省内存
当
fmt=PIXEL_FORMAT_GRAYSCALE时,内部会先转换为 YUV420SP 再提取灰度通道
属性
属性名 |
类型 |
描述 |
|---|---|---|
|
int |
系统分配的 CSC 通道号 |
|
int |
目标图像格式 |
convert方法#
功能 执行图像色彩空间转换
语法
result = csc.convert(frame, timeout_ms=1000, cvt=True)
参数说明
参数 |
类型 |
说明 |
默认值 |
|---|---|---|---|
frame |
py_video_frame_info |
输入图像帧(Sensor.snapshot获取) |
无 |
timeout_ms |
int |
转换超时时间(毫秒) |
1000 |
cvt |
bool |
True返回Image对象,False返回py_video_frame_info |
True |
返回值 根据cvt参数返回转换后的Image对象或py_video_frame_info
get_frame方法#
功能 从CSC通道获取转换后的帧(低级别接口,不自动转换为Image)。
语法
frame = csc.get_frame(timeout_ms=1000)
参数说明
参数 |
类型 |
说明 |
默认值 |
|---|---|---|---|
timeout_ms |
int |
超时时间(毫秒) |
1000 |
返回值
成功返回 py_video_frame_info 对象,超时返回 None
注意:使用
get_frame获取的帧需要手动调用release_frame释放。
release_frame方法#
功能
释放通过 get_frame 获取的帧。
语法
csc.release_frame(frame)
参数说明
参数 |
类型 |
说明 |
|---|---|---|
frame |
py_video_frame_info |
需要释放的帧对象 |
destroy方法#
功能 释放CSC通道资源
语法
csc.destroy()
说明 调用后将释放该CSC通道占用的所有资源,不可再使用该对象
常量定义#
图像格式常量#
常量名称 |
说明 |
典型应用场景 |
|---|---|---|
PIXEL_FORMAT_GRAYSCALE |
灰度图像格式 |
黑白图像处理 |
PIXEL_FORMAT_RGB_565 |
RGB565格式(大端) |
LCD显示 |
PIXEL_FORMAT_RGB_565_LE |
RGB565格式(小端) |
特殊显示设备 |
PIXEL_FORMAT_BGR_565 |
BGR565格式(大端) |
OpenCV兼容处理 |
PIXEL_FORMAT_BGR_565_LE |
BGR565格式(小端) |
特殊显示设备 |
PIXEL_FORMAT_RGB_888 |
RGB888格式 |
高质量图像处理 |
PIXEL_FORMAT_BGR_888 |
BGR888格式 |
OpenCV兼容处理 |
PIXEL_FORMAT_ARGB_8888 |
ARGB8888格式(带透明度) |
图形界面合成 |
PIXEL_FORMAT_ARGB_1555 |
ARGB1555格式(带透明度) |
低色彩深度UI |
PIXEL_FORMAT_ARGB_4444 |
ARGB4444格式(带透明度) |
低色彩深度UI |
PIXEL_FORMAT_BGR_888_PLANAR |
BGR888平面格式 |
专业图像处理 |
PIXEL_FORMAT_RGB_888_PLANAR |
RGB888平面格式 |
专业图像处理 |
PIXEL_FORMAT_YVU_PLANAR_420 |
YVU420平面格式 |
视频解码输出 |
PIXEL_FORMAT_YUV_SEMIPLANAR_420 |
YUV420半平面格式 |
视频编码输入 |
PIXEL_FORMAT_YVU_SEMIPLANAR_420 |
YVU420半平面格式 |
视频处理 |
PIXEL_FORMAT_YVU_PLANAR_444 |
YVU444平面格式 |
高质量视频处理 |
PIXEL_FORMAT_YUV_PACKAGE_444 |
YUV444打包格式 |
高质量视频处理 |
PIXEL_FORMAT_YUV_SEMIPLANAR_444 |
YUV444半平面格式 |
高质量视频处理 |
PIXEL_FORMAT_YVU_SEMIPLANAR_444 |
YVU444半平面格式 |
高质量视频处理 |
最佳实践#
import time, os, urandom, sys
from media.display import *
from media.media import *
from media.uvc import *
from nonai2d import CSC
DISPLAY_WIDTH = ALIGN_UP(800, 16)
DISPLAY_HEIGHT = 480
# hardware Color Space Converter (通道号自动分配)
csc = CSC(CSC.PIXEL_FORMAT_RGB_565)
# use lcd as display output
Display.init(Display.ST7701, width = DISPLAY_WIDTH, height = DISPLAY_HEIGHT, to_ide = True)
while True:
plugin, dev = UVC.probe()
if plugin:
print(f"detect USB Camera {dev}")
break
time.sleep_ms(100)
mode = UVC.video_mode(640, 480, UVC.FORMAT_MJPEG, 30)
succ, mode = UVC.select_video_mode(mode)
print(f"select mode success: {succ}, mode: {mode}")
UVC.start(cvt = True)
clock = time.clock()
while True:
clock.tick()
img = UVC.snapshot()
if img is not None:
img = csc.convert(img)
Display.show_image(img)
print(clock.fps())
# deinit display
Display.deinit()
csc.destroy()
UVC.stop()
time.sleep_ms(100)
