openmv图像处理的方法1

**初始化:**sensor.reset() 初始化感光元件
设置彩色/黑白:
sensor.set_pixformat() 设置像素模式。
sensor.GRAYSCALE: 灰度,每个像素8bit。
sensor.RGB565: 彩色,每个像素16bit。
设置图像大小:sensor.set_framesize()
跳过一些帧:sensor.skip_frames(n=10)
获取一张图像: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,图像处理中的术语“感兴趣区”。就是在要处理的图像中提取出的要处理的区域。
roi的格式是(x, y, w, h)的tupple.
x:ROI区域中左上角的x坐标
y:ROI区域中左上角的y坐标
w:ROI的宽度
h:ROI的高度
设置翻转
sensor.set_hmirror(True)
水平方向翻转
sensor.set_vflip(True)
垂直方向翻转
获取/设置像素点
image.get_pixel(x, y)
对于灰度图: 返回(x,y)坐标的灰度值.
对于彩色图: 返回(x,y)坐标的(r,g,b)的tuple.
image.set_pixel(x, y, pixel)
对于灰度图: 设置(x,y)坐标的灰度值。
对于彩色图: 设置(x,y)坐标的(r,g,b)的值。
获取图像的宽度和高度
image.width()
返回图像的宽度(像素)
image.height()
返回图像的高度(像素)
image.format()
灰度图会返回 sensor.GRAYSCALE,彩色图会返回 sensor.RGB565。
image.size()
返回图像的大小(byte)
图像的运算
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)
从这张图片减去另一个图片。比如,对于每个通道的每个像素点,取相减绝对值操作。这个函数,经常用来做移动检测。
statistic
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]获得。
画图
颜色可以是灰度值(0-255),或者是彩色值(r, g, b)的tupple。默认是白色。
其中的color关键字必须显示的标明color=。
画线
image.draw_line(line_tuple, color=White) 在图像中画一条直线。
line_tuple的格式是(x0, y0, x1, y1),意思是(x0, y0)到(x1, y1)的直线。
颜色可以是灰度值(0-255),或者是彩色值(r, g, b)的tupple。默认是白色。
画框
image.draw_rectangle(rect_tuple, color=White) 在图像中画一个矩形框。
rect_tuple 的格式是 (x, y, w, h)。
画圆
image.draw_circle(x, y, radius, color=White)
在图像中画一个圆。
x,y是圆心坐标,radius是圆的半径
画十字
image.draw_cross(x, y, size=5, color=White)
在图像中画一个十字
x,y是坐标,size是两侧的尺寸
写字
image.draw_string(x, y, text, color=White)
在图像中写字 8x10的像素
x,y是坐标。使用\n, \r, and \r\n会使光标移动到下一行。text是要写的字符串。
寻找色块
thresholds是颜色的阈值,注意:在返回的色块对象blob可以调用code方法,来判断是什么颜色的色块。
x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2,如果你只想查找宽度10个像素以上的色块,那么就设置这个参数为10:
blobs = img.find_blobs([red],x_stride=10)
y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1,如果你只想查找宽度5个像素以上的色块,那么就设置这个参数为5:
blobs = img.find_blobs([red],y_stride=5)
invert 反转阈值,把阈值以外的颜色作为阈值进行查找
area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉
pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉
merge 合并,如果设置为True,那么合并所有重叠的blob为一个。
注意:这会合并所有的blob,无论是什么颜色的。如果你想混淆多种颜色的blob,只需要分别调用不同颜色阈值的find_blobs。
margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。
blob
一个blobs列表里包含很多blob对象,blobs对象就是色块,每个blobs对象包含一个色块的信息
blob有多个方法:
blob.rect() 返回这个色块的外框——矩形元组(x, y, w, h),可以直接在image.draw_rectangle中使用。
blob.x() 返回色块的外框的x坐标(int),也可以通过blob[0]来获取。
blob.y() 返回色块的外框的y坐标(int),也可以通过blob[1]来获取。
blob.w() 返回色块的外框的宽度w(int),也可以通过blob[2]来获取。
blob.h() 返回色块的外框的高度h(int),也可以通过blob[3]来获取。
blob.pixels() 返回色块的像素数量(int),也可以通过blob[4]来获取。
blob.cx() 返回色块的外框的中心x坐标(int),也可以通过blob[5]来获取。
blob.cy() 返回色块的外框的中心y坐标(int),也可以通过blob[6]来获取。
blob.rotation() 返回色块的旋转角度,也可以通过blob[7]来获取。
blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。举个例子:
blobs = img.find_blobs([red, blue, yellow], merge=True)
如果这个色块是红色,那么它的code就是0001,如果是蓝色,那么它的code就是0010。注意:一个blob可能是合并的,如果是红色和蓝色的blob,那么这个blob就是0011。这个功能可以用于查找颜色代码。也可以通过blob[8]来获取。
blob.count() 如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取。
blob.area() 返回色块的外框的面积。应该等于(w * h)
blob.density() 返回色块的密度。这等于色块的像素数除以外框的区域。如果密度较低,那么说明目标锁定的不是很好。
模板匹配NCC
模板匹配和特征点检测的比较:
模板匹配(find_temolate)采用的是ncc算法,只能匹配与模板图片大小和角度基本一致的图案。局限性相对来说比较大,视野中的目标图案稍微比模板图片大一些或者小一些就可能匹配不成功。
模板匹配适应于摄像头与目标物体之间距离确定,不需要动态移动的情况。比如适应于流水线上特定物体的检测,而不适应于小车追踪一个运动的排球
多角度多大小匹配可以尝试保存多个模板,采用多模板匹配。

特征点检测(find_keypoint): 如果是刚开始运行程序,例程提取最开始的图像作为目标物体特征,kpts1保存目标物体的特征。默认会匹配目标特征的多种比例大小和角度,而不仅仅是保存目标特征时的大小角度,比模版匹配灵活,也不需要像多模板匹配一样保存多个模板图像。
特征点检测,也可以提前保存目标特征,之前是不推荐这么做的,因为环境光线等原因的干扰,可能导致每次运行程序光线不同特征不同,匹配度会降低。但是最新版本的固件中,增加了对曝光度、白平衡、自动增益值的调节,可以人为的定义曝光值和白平衡值,相对来说会减弱光线的干扰。也可以尝试提前保存目标特征。
测距
实际长度和摄像头里的像素成反比;
距离 = 一个常数/直径的像素;

你可能感兴趣的:(openmv图像处理的方法1)