1.什么是文件系统呢?
简单来说,就是各种文件夹和文件以树形结构排列,简单来说,就是你的U盘啦。而且在代码中可以使用路径来进行读入文件,创建文件等操作。
2.当你想烧录固件的时候,直接把脚本文件复制到对应“U盘”的main.py中。每次上电的时候,OpenMV会自动运行里面的main.py,这样就实现了脱机运行。

  • 模板匹配(find_temolate)采用的是ncc算法,只能匹配与模板图片大小和角度基本一致的图案。局限性相对来说比较大,视野中的目标图案稍微比模板图片大一些或者小一些就可能匹配不成功。
  • 模板匹配适应于摄像头与目标物体之间距离确定,不需要动态移动的情况。比如适应于流水线上特定物体的检测,而不适应于小车追踪一个运动的排球(因为运动的排球与摄像头的距离是动态的,摄像头看到的排球大小会变化,不会与模板图片完全一样)。
  • 多角度多大小匹配可以尝试保存多个模板,采用多模板匹配
  • 特征点检测(find_keypoint): 如果是刚开始运行程序,例程提取最开始的图像作为目标物体特征,kpts1保存目标物体的特征。默认会匹配目标特征的多种比例大小和角度,而不仅仅是保存目标特征时的大小角度,比模版匹配灵活,也不需要像多模板匹配一样保存多个模板图像。

    特征点检测,也可以提前保存目标特征,之前是不推荐这么做的,因为环境光线等原因的干扰,可能导致每次运行程序光线不同特征不同,匹配度会降低。但是最新版本的固件中,增加了对曝光度、白平衡、自动增益值的调节,可以人为的定义曝光值和白平衡值,相对来说会减弱光线的干扰。也可以尝试提前保存目标特征。

sensor.snapshot()
使用相机拍摄一张照片,并返回 image 对象。 OpenMV有两个图像存储区。用于正常MicroPython处理的经典堆栈/堆区可以将小图像存储在堆中。 但是,MicroPython堆只有大约100KB,这不足以存储更大的图像。因此,您的OpenMV Cam有一个辅助帧缓冲存储区, 用于存储 sensor.snapshot() 所拍摄的图像。 图像存储在该存储区域的底部。 剩下的任何内存都可供帧缓冲区堆栈使用,OpenMV Cam的固件使用它来保存用于图像处理算法的大型临时数据结构。
如果你需要空间来容纳多个帧,你可以通过调用 sensor.alloc_extra_fb() 来“偷走”帧缓冲区空间。

Indentation_Error: _unexpected indent 查了这是缩进的错误

人脸辨别的一种算法:

  1. def min(pmin, a, s):
  2. global num
  3. if a<pmin:
  4. pmin=a
  5. num=s
  6. return pmin
  7. for s in range(1, NUM_SUBJECTS+1):
  8. dist = 0
  9. for i in range(2, NUM_SUBJECTS_IMGS+1):
  10. img = image.Image("singtown/s%d/%d.pgm"%(s, i))
  11. d1 = img.find_lbp((0, 0, img.width(), img.height()))
  12. #d1为第s文件夹中的第i张图片的lbp特征
  13. dist += image.match_descriptor(d0, d1)#计算d0 d1即样本图像与被检测人脸的特征差异度。
  14. print("Average dist for subject %d: %d"%(s, dist/NUM_SUBJECTS_IMGS))
  15. pmin = min(pmin, dist/NUM_SUBJECTS_IMGS, s)#特征差异度越小,被检测人脸与此样本更相似更匹配。

from…import 语句与import区别在于:
import 导入模块,每次使用模块中的函数都要是定是哪个模块。
**from…import
**导入模块,每次使用模块中的函数,直接使用函数就可以了;注因为已经知道该函数是那个模块中的了

openmv发送16进制数据需要转换为字节的形式,假设要发送 0x80,0x06,0x02,0x78这几个16进制数据代码如下:

data=bytearray([0x80,0x06,0x02,0x78])
uart.write(data)

OpenMV 是可以直接通过串口发送字符串的。

  1. from pyb import UART
  2. uart = UART(3, 9600)
  3. string = "hello string!"
  4. uart.write(string)

字符串操作:
举例:

  1. blobs=[12,23,11,22,33,44]
  2. print("%d", blobs[3])

‘’’在python中表示多行字符串

RGB565色彩图和GRAYSCALE灰度图
frameSize就是屏幕的实际分辨率

高级特征

HAAR、HOG、LBP

介绍:
https://blog.csdn.net/juanjuan1314/article/details/50569841?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.channel_param

find_blobs(thresholds, invert=False, roi=Auto),thresholds为颜色阈值,是一个元组,需要用括号[ ]括起来。invert=1,反转颜色阈值,invert=False默认不反转。roi设置颜色识别的视野区域,roi是一个元组, roi = (x, y, w, h),代表从左上顶点(x,y)开始的宽为w高为h的矩形区域,roi不设置的话默认为整个图像视野。
这个函数返回一个列表,[0]代表识别到的目标颜色区域左上顶点的x坐标,[1]代表左上顶点y坐标,[2]代表目标区域的宽,[3]代表目标区域的高,[4]代表目标区域像素点的个数,[5]代表目标区域的中心点x坐标,[6]代表目标区域中心点y坐标,[7]代表目标颜色区域的旋转角度(是弧度值,浮点型,列表其他元素是整型),[8]代表与此目标区域交叉的目标个数,[9]代表颜色的编号(它可以用来分辨这个区域是用哪个颜色阈值threshold识别出来的)。
**
OpenMV 的IDE里加入了阈值选择工具,极大的方便了对于颜色阈值的调试。

感光元件控制
白平衡值、曝光值

通过调整R/G/B增益值使得图像的平均颜色为灰色来实现白平衡。
自动白平衡(AWB)算法可以为您完成此操作,但每次打开相机时通常会得到不同的结果,这使得难以正确地进行颜色跟踪设置。
通过手动记录您喜欢的增益值,然后在启动时强制它们到传感器,您可以控制相机看到的颜色。

增益和曝光控制之间有什么区别?

通过增加图像的曝光时间,您可以在相机上获得更多光线。这为您提供了最佳的信噪比。
# 您通常总是希望增加曝光时间…除非,当您增加曝光时间时,您会降低最大可能的帧速率,
# 如果图像中有任何移动,它将在更长的曝光时间内开始模糊。
# 增益控制允许您使用模拟和数字乘法器增加每像素的输出……但是,它也会放大噪声

  • sensor.set_auto_gain() 自动增益开启(True)或者关闭(False)。在使用颜色追踪时,需要关闭自动增益。
  • sensor.set_auto_whitebal() 自动白平衡开启(True)或者关闭(False)。在使用颜色追踪时,需要关闭自动白平衡。
  • sensor.set_auto_exposure(enable[\, exposure_us])
    • enable 打开(True)或关闭(False)自动曝光。默认打开。
    • 如果 enable 为False, 则可以用 exposure_us 设置一个固定的曝光时间(以微秒为单位)

我们可以通过image.get_pixel(x, y)方法来获取一个像素点的值。

  • image.get_pixel(x, y)
    • 对于灰度图: 返回(x,y)坐标的灰度值.
    • 对于彩色图: 返回(x,y)坐标的(r,g,b)的tuple.

同样,我们可以通过image.set_pixel(x, y, pixel)方法,来设置一个像素点的值。

  • image.set_pixel(x, y, pixel)
    • 对于灰度图: 设置(x,y)坐标的灰度值。
    • 对于彩色图: 设置(x,y)坐标的(r,g,b)的值。

照片采集时注意采集时尽量让背景均匀,并且让人脸尽量充满整个画面。人脸可以微笑,不笑,正脸,歪头,戴眼镜,不戴眼镜等。可以选择每人10-20张图片。

kpts1 = img.find_keypoints(max_keypoints=150, threshold=10, scale_factor=1.2)
#image.find_keypoints(roi=Auto, threshold=20, normalized=False, scale_factor=1.5,
max_keypoints=100, corner_detector=CORNER_AGAST)

#roi表示识别的区域,是一个元组(x,y,w,h),默认与framsesize大小一致。
#threshold是0~255的一个阈值,用来控制特征点检测的角点数量。用默认的AGAST特征点检测,这个阈值大概是20。用FAST特征点检测,这个阈值大概是60~80。阈值越低,获得的角点越多。
#normalized是一个布尔数值,默认是False,可以匹配目标特征的多种大小(比ncc模版匹配效果灵活)。如果设置为True,关闭特征点检测的多比例结果,仅匹配目标特征的一种大小(类似于模版匹配),但是运算速度会更快一些。
#scale_factor是一个大于1.0的浮点数。这个数值越高,检测速度越快,但是匹配准确率会下降。一般在1.35~1.5左右最佳。
#max_keypoints是一个物体可提取的特征点的最大数量。如果一个物体的特征点太多导致RAM内存爆掉,减小这个数值。
#corner_detector是特征点检测采取的算法,默认是AGAST算法。FAST算法会更快但是准确率会下降。