openmv4系列4----图像处理
sensor模块,用于设置感光元件的参数。
一、感光元件的使用
import sensor#引入感光元件的模块
# 设置摄像头
sensor.reset()#初始化感光元件
sensor.set_pixformat(sensor.RGB565)#设置为彩色
sensor.set_framesize(sensor.QVGA)#设置图像的大小
sensor.skip_frames()#跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。
# 一直拍照
while(True):
img = sensor.snapshot()#拍摄一张照片,img为一个image对象
- 初始化
sensor.reset() 初始化感光元件 - 设置彩色/黑白
sensor.set_pixformat() 设置像素模式。
sensor.GRAYSCALE: 灰度,每个像素8bit。
sensor.RGB565: 彩色,每个像素16bit。 - 设置图像大小
sensor.set_framesize() 设置图像的大小
sensor.QQCIF: 88x72
sensor.QCIF: 176x144
sensor.CIF: 352x288
sensor.QQSIF: 88x60
sensor.QSIF: 176x120
sensor.SIF: 352x240
sensor.QQQQVGA: 40x30
sensor.QQQVGA: 80x60
sensor.QQVGA: 160x120
sensor.QVGA: 320x240
sensor.VGA: 640x480
sensor.HQQQVGA: 80x40
sensor.HQQVGA: 160x80
sensor.HQVGA: 240x160
sensor.B64X32: 64x32 (用于帧差异 image.find_displacement())
sensor.B64X64: 64x64 用于帧差异 image.find_displacement())
sensor.B128X64: 128x64 (用于帧差异 image.find_displacement())
sensor.B128X128: 128x128 (用于帧差异 image.find_displacement())
sensor.LCD: 128x160 (用于LCD扩展板)
sensor.QQVGA2: 128x160 (用于LCD扩展板)
sensor.WVGA: 720x480 (用于 MT9V034)
sensor.WVGA2:752x480 (用于 MT9V034)
sensor.SVGA: 800x600 (仅用于 OV5640 感光元件)
sensor.XGA: 1024x768 (仅用于 OV5640 感光元件)
sensor.SXGA: 1280x1024 (仅用于 OV5640 感光元件)
sensor.UXGA: 1600x1200 (仅用于 OV5640 感光元件)
sensor.HD: 1280x720 (仅用于 OV5640 感光元件)
sensor.FHD: 1920x1080 (仅用于 OV5640 感光元件)
sensor.QHD: 2560x1440 (仅用于 OV5640 感光元件)
sensor.QXGA: 2048x1536 (仅用于 OV5640 感光元件)
sensor.WQXGA: 2560x1600 (仅用于 OV5640 感光元件)
sensor.WQXGA2: 2592x1944 (仅用于 OV5640 感光元件) - 跳过一些帧
sensor.skip_frames(n=10) 跳过n张照片,在更改设置后,跳过一些帧,等待感光元件变稳定。 - 获取一张图像
sensor.snapshot() 拍摄一张照片,返回一个image对象。 - 自动增益
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设置一个固定的曝光时间(以微秒为单位)。
- 设置窗口ROI
sensor.set_windowing(roi)
ROI:Region Of Interest,图像处理中的术语“感兴趣区”。就是在要处理的图像中提取出的要处理的区域。
sensor.set_framesize(sensor.VGA) # 高分辨率
sensor.set_windowing((640, 80)) #取中间的640*80区域
roi的格式是(x, y, w, h)。
设置图像翻转
-
sensor.set_hmirror(True)
水平方向翻转 -
sensor.set_vflip(True)
垂直方向翻转
二、图像的基本运算
1.获取/设置像素点
- 我们可以通过
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)的值。
2.获取图像的宽度和高度
-
返回图像的宽度(像素)
image.width() -
返回图像的高度(像素)
image.height() -
灰度图会返回 sensor.GRAYSCALE,彩色图会返回 sensor.RGB565。
image.format() -
返回图像的大小(byte)
image.size()
3.图像的运算
- image.invert()
取反,对于二值化的图像,0(黑)变成1(白),1(白)变成0(黑)。
注: 图像可以是另一个image对象,或者是从
(bmp/pgm/ppm)文件读入的image对象。两个图像都必须是相同的尺寸和类型(灰度图/彩色图)。
-
image.nand(image)
与另一个图片进行与非(NAND)运算。 -
image.nor(image)
与另一个图片进行或非(NOR)运算。 -
image.xor(image)
与另一个图片进行异或(XOR)运算。 -
image.xnor(image)
与另一个图片进行异或非(XNOR)运算。 -
image.difference(image)
从这张图片减去另一个图片。比如,对于每个通道的每个像素点,取相减绝对值操作。这个函数,经常用来做移动检测。
三、图像的统计信息
1.ROI
roi的格式是(x, y, w, h)的tupple.
x:ROI区域中左上角的x坐标
y:ROI区域中左上角的y坐标
w:ROI的宽度
h:ROI的高度
2.Statistics
image.get_statistics(roi=Auto)
其中roi是目标区域。注意,这里的roi,bins之类的参数,一定要显式地标明,例如:
img.get_statistics(roi=(0,0,10,20))
如果是 img.get_statistics((0,0,10,20)),ROI不会起作用。
-
statistics.mean() 返回灰度的平均数(0-255) (int)。你也可以通过statistics[0]获得。
-
statistics.median() 返回灰度的中位数(0-255) (int)。你也可以通过statistics[1]获得。
-
statistics.mode() 返回灰度的众数(0-255) (int)。你也可以通过statistics[2]获得。
-
statistics.stdev() 返回灰度的标准差(0-255) (int)。你也可以通过statistics[3]获得。
-
statistics.min() 返回灰度的最小值(0-255) (int)。你也可以通过statistics[4]获得。
-
statistics.max() 返回灰度的最大值(0-255) (int)。你也可以通过statistics[5]获得。
-
statistics.lq() 返回灰度的第一四分数(0-255) (int)。你也可以通过statistics[6]获得。
-
statistics.uq() 返回灰度的第三四分数(0-255) (int)。你也可以通过statistics[7]获得。
上面的是灰度的值,接下来的
- l_mean,l_median,l_mode,l_stdev,l_min,l_max,l_lq,l_uq,
- a_mean,a_median,a_mode,a_stdev,a_min,a_max,a_lq,a_uq,
- b_mean,b_median,b_mode,b_stdev,b_min,b_max,b_lq,b_uq,
是LAB三个通道的平均数,中位数,众数,标准差,最小值,最大值,第一四分数,第三四分数。
3.举例
检测左上方的区域中的颜色值。
import sensor, image, time
sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(10) # 跳过10帧,使新设置生效
sensor.set_auto_whitebal(False) # Create a clock object to track the FPS.
ROI=(80,30,15,15)
while(True):
img = sensor.snapshot() # Take a picture and return the image.
statistics=img.get_statistics(roi=ROI)
color_l=statistics.l_mode()
color_a=statistics.a_mode()
color_b=statistics.b_mode()
print(color_l,color_a,color_b)
img.draw_rectangle(ROI)