news 2026/6/9 11:33:37

小白学习机械视觉笔记(四)图像

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
小白学习机械视觉笔记(四)图像

之前在计算机方面对图像的了解只是接触过图像文件,如JPG文件、PNG文件等,现在通过学习有了更深入的理解。
图像文件是作为CANMV K230模块对外交互的一个接口,需模块内部工作更多是由图像对象和图像数组完成的。
图像对象是指image.Image类(CanMV 自定义类),是 CanMV 中机器视觉处理的核心类,封装了丰富的图像操作方法和函数,支持绘图、编码保存、格式转换、特征检测等丰富操作。
图像数组是指ulab.numpy.ndarray类型的图像数据,支持数值计算(切片、数学运算),可以直接喂给 KPU 模型进行推理。说什么“KPU是神经网络处理器,可以在低功耗的情况下实现卷积神经网络计算”,我都不太理解,我感觉KPU就是一个张量的硬件处理器,因为他的输入输出都为张量——tensor数据。看在这我又撞见了“张量”,张量是多维数组,而ulab.numpy.ndarray是为micropython简化而来的二维数组,在 K230 的 CanMV 环境中,ulab.numpy.ndarray 实际上充当了 tensor 的角色,在 K230 上,ulab.numpy.ndarray 就是你打交道最多的"张量"类型。ulab.numpy.ndarray也有严重的缺点,它本质上是纯数值矩阵,不能直接用于读取或保存图像文件(如 JPG、PNG)。它也不支持直接进行图像绘制(如画框、写字)等高层语义操作。所以在后期想把AI2d处理结果看一下,废了不少劲。
说到图像,还想说几句关于图像显示的 OSD。以前不知道 OSD 是什么,现在觉得这个做法真是很聪明,可以很方便地对原始图像进行二次加工。
下面记录一些图像方面的坑和经验:
1.运行

img_obj=image.Image(480,800,image.RGBP888,alloc=image.ALLOC_REF,data=img)img_obj.save("/sdcard/output.bmp")

提示
OSError: current format not support save function!
也就是image.RGBP888格式的图像对象不能保存成图形文件。
2.使用img.rotation_corr()旋转图像画布不跟着旋转,致使旋转后的图像画面不完整。
3.记录一个NCHW或CHW转img对象函数

defnchw2img(w,h,nchw):ifhasattr(nchw,'to_numpy'):# 如果不是 ndarray(比如是 Tensor),就调用.to_numpy()转换 ai2d_output_np=nchw.to_numpy()#ai2d_output_np=nchw.to_numpy()# 类型转换print(ai2d_output_np.shape)# 预处理后的shape为[1,3,256,256]# 使用transpose处理输出为HWC排布的np数据,然后在np数据上创建RGB888格式的Image实例用于在IDE显示效果 shape=ai2d_output_np.shape ai2d_output_tmp=ai2d_output_np.reshape((shape[0]*shape[1],shape[2]*shape[3]))ai2d_output_tmp_trans=ai2d_output_tmp.transpose()ai2d_output_hwc=ai2d_output_tmp_trans.copy().reshape((shape[2],shape[3],shape[1]))#out_img=image.Image(256,256,image.RGB888,alloc=image.ALLOC_REF,data=ai2d_output_hwc)out_img=image.Image(w,h,image.RGB888,alloc=image.ALLOC_REF,data=ai2d_output_hwc)else:# 如果类型完全匹配 np.ndarray,说明已经是普通数组了,直接用 ai2d_output_np=nchw#ai2d_output_np=nchw.to_numpy()# 类型转换print(ai2d_output_np.shape)# 预处理后的shape为[3,256,256]# 使用transpose处理输出为HWC排布的np数据,然后在np数据上创建RGB888格式的Image实例用于在IDE显示效果 shape=ai2d_output_np.shape ai2d_output_tmp=ai2d_output_np.reshape((shape[0],shape[1]*shape[2]))ai2d_output_tmp_trans=ai2d_output_tmp.transpose()ai2d_output_hwc=ai2d_output_tmp_trans.copy().reshape((shape[1],shape[2],shape[0]))#out_img=image.Image(256,256,image.RGB888,alloc=image.ALLOC_REF,data=ai2d_output_hwc)out_img=image.Image(w,h,image.RGB888,alloc=image.ALLOC_REF,data=ai2d_output_hwc)returnout_img

4.AIBase 模块 API 手册 — CanMV K230
对于开发中常见的数据类型转换,这里给出对应的示例供参考。
Tips:
Image对象转ulab.numpy.ndarray:

importimageimg.to_rgb888().to_numpy_ref()#返回的array是HWC排布

ulab.numpy.ndarray转Image对象:

importulab.numpyas npimportimageimg_np=np.zeros((height,width,4),dtype=np.uint8)img=image.Image(width,height,image.ARGB8888,alloc=image.ALLOC_REF,data=img_np)

ulab.numpy.ndarray转tensor类型:

importulab.numpyas npimportnncase_runtimeas nn img_np=np.zeros((height,width,4),dtype=np.uint8)tensor=nn.from_numpy(img_np)

tensor 类型转ulab.numpy.ndarray:

importulab.numpyas npimportnncase_runtimeas nn img_np=tensor.to_numpy()
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/9 11:29:07

AI超连接时代:AI向“光”飞奔?

什么是CPO? 22年底ChatGPT横空出世以来,从算力(GPU)、存力(存储),指挥调度力(CPU)……AI已经带动了一个又一个的半导体超级产业机会、一个又一个的万亿美金市值公司。 …

作者头像 李华
网站建设 2026/6/9 11:23:12

Python爬虫实战:Referer防盗链

一、前言在网络爬虫与网络请求开发中,Referer(溯源请求头) 是中小型网站、音视频平台常用的基础反爬与防盗链机制。服务端通过校验请求头中的 Referer 字段,判断请求来源是否为官方页面,以此拦截非法跨站请求。本文以某…

作者头像 李华
网站建设 2026/6/9 11:22:56

利用 AI 选座,花小钱办大事!

如何用 AI 实惠选座在航班上高价选靠窗座位、花更多钱在舞台边欣赏艺人表演、观看体育赛事,这些一直是个人化选择,有时还带强烈情感因素,也常被高价门票“割韭菜”。有人对特定区域或座位情有独钟,体育场会给坐偏远或硬板凳座位的…

作者头像 李华
网站建设 2026/6/9 11:22:39

JGTechVision通用视觉软件-单相机引导定位项目设计

JGTechVision通用视觉软件-单相机引导定位项目设计 1 创建九点标定项目 1.1 创建Http服务端通信 1.2 创建-项目与接受文本 1.3 创建C#脚本解析 1.4 确认通信协议 Calib,150,150,1 Calib表示九点标定 150:机械手X 150: 机械手Y 1:表示第几个点1.5 C#脚本…

作者头像 李华