一、现象
上面这张图是 320*240的原图数据
摄像头得到的QVGA/或其他更大的像素格式 的图像
上面这张是 set_windowing((224,224))
set_windowing((224,224)) 会导致 取到的是 左上角224*224的图像
ROI = (x,y,w,h)=(0,0,224,224)
根据set_windowing函数的声明,这时候通过设置ROI的x和y值 使 感兴趣区域 变为摄像头得到1的图像的中央
然而实际没有效果
结果搜索和技术支持的询问——maixbit自带的摄像头 的驱动 不支持 set_windowing函数中对ROI的x,y进行设置
二、解决办法
(一)物理解决办法,也是我在网上看到的大部分办法
将 k210摄像头的位置放在小车/云台中线偏右的地方 , 使模型的输入为小车正对着的数字
但是显然 误差很大
而且这样子能看到的范围很小,只能镜头的左上角看小车的正前方,而镜头右边的视野完全被set_window切割了
导致 小车在识别4个数字上 k210性能是足够识别4个,但是还是得一左一右两个k210来识别
(二)代码解决,网上没有,严重怀疑是我初创( )让我慰藉一下电赛前1.5个月都花在这个k210上面
(1)一开始的思路——除了set_windowing(roi),还有什么函数可以用
原则——我们是为了 预处理摄像头的图像 从而使模型的输入图像 是224*224 且是摄像头正对的图像,以摄像头为中线
img.copy(roi = (48,8,224,224))也可以设置输入图像的在摄像头源图像上的ROI
但是两者差别在哪呢?
set_windowing是sensor模块下的函数——即与摄像头有关,处理的是摄像头的图像
copy函数是ide带的对图像进行处理的函数——然而这里图像是由摄像头处理后的得到的
这有什么区别呢?
涉及到k210的存储系统
分为RGB565和888一个是pix格式,一个是给kpu处理的图像数据格式
然而如果是这样子写,会发现程序会在此处终止,结束执行,甚至k210会与ide断链
直接原因是 内存爆了
根本原因是 在图像处理的路上面 多了一个图片变量 而k210的内存本来就小,才8M吧
摄像头的照片 没试过能不能装在SD卡的区域内
但是没装sd卡也可以 处理摄像头照片且跑模型
解决办法就是 让这个路上只要有一个图像变量就行
img = sensor.snapshot()
img.copy(roi = (48,8,224,224),copy_to_fb = img)
img.pix_to_ai()
#然后在输入图像给模型
objects = kpu.run_yolo2(task, img)
后续还可以 通过 灰度图 来增快帧率