openMV小记(一)迈出第一步

openMV小记(一)

(一)基础框架建立

前言

机器的视觉处理方面是第一次接触,今年刚好也学习了这门课程,个人感觉还是挺有意思的。一开始接触openMV还是比较懵的,完全的小白开始入门。现在长时间的积累想着整理点有用的,回头看着方便点。有啥不足之处望可指正!

openMV官网介绍
OpenMV摄像头是一款小巧,低功耗,低成本的电路板,它帮助你很轻松的完成机器视觉(machine vision)应用。你可以通过高级语言Python脚本(准确的说是 MicroPython ),而不是C/C++。Python的高级数据结构使你很容易在机器视觉算法中处理复杂的输出。但是,你仍然可以完全控制OpenMV。你可以很容易的使用外部终端触发拍摄或者或者执行算法,也可以把算法的结果用来控制IO引脚。

一、图像处理背景知识

在这里插入图片描述

这部分星瞳科技官网介绍的很详细了,有几个常用到的给说下
图像处理技术一般包括图像压缩,增强和复原,匹配、描述和识别3个部分

相机成像模型

摄像机模型中的小孔成像模型,所有景物通过摄像机光轴中心点投影到成像平面上的摄像机模型。

感光元件

感光元件就好比是数码相机的不用更换的“胶卷”,而且是与相机一体,也可称为是相机的心脏。图像透过镜头照在一个感光芯片上,感光芯片将光照的波长和强度等信息转成数字信号.

像素

像素是指由图像的小方格组成的,这些小方块都有一个明确的位置和被分配的色彩数值,小方格颜色和位置就决定该图像所呈现出来的样子。可以将像素视为整个图像中不可分割的单位或者是元素。感光元件是有很多个感光点构成的,比如有XY个点,每个点就是一个像素,把每个点的像素收集整理起来,就是一副图片,那么这张图片的分辨率就是XY.

帧率(FPS)

就是每秒钟处理的图片数量,如果超过20帧,人眼就基本分辨不出卡顿。也叫分辨率.

Lab
在这里插入图片描述

Lab颜色空间中,L亮度;a的正数代表红色,负端代表绿色;b的正数代表黄色,负端代表兰色。Lab颜色被设计来接近人类视觉。
因此L分量可以调整亮度对,修改a和b分量的输出色阶来做精确的颜色平衡。在OpenMV的查找色块的算法中,运用的就是这个LAB模式!一个颜色的阈值结构是这样的:(minL, maxL, minA, maxA, minB, maxB)

RGB
在这里插入图片描述

三原色的原理不是物理原因,而是由于人的生理原因造成的。人的眼睛内有几种辨别颜色的锥形感光细胞,分别对黄绿色、绿色和蓝紫色(或称紫罗兰色)的光最敏感(波长分别为564、534和420纳米)。

灰度图

灰度就是把白色与黑色之间按对数关系分为若干等级,灰度分为256阶。这样的图片就是灰度图了。灰度图阈值(min, max)。

二值化

图像的二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。将在thresholds内的图像部分的全部像素变为1白,将在阈值外的部分全部像素变为0黑

焦距

镜头焦距:是指镜头光学后主点到焦点的距离
镜头焦距的长短决定着拍摄的成像大小,视场角大小,景深大小和画面的透视强弱。
焦距越短,镜头视野会越广,进入镜头的像素点多,每个元素在画面中占的面积会变小。
焦距越长,镜头视野会越窄,进入镜头的像素点多,每个元素在画面中占的面积会很大。

二、OpenMV图像处理的方法

感光元件

sensor模块,用于设置感光元件的参数。

sensor.reset()            #初始化感光元件
sensor.set_pixformat()   
#设置像素模式。 #GRAYSCALE: 灰度,每个像素8bit,RGB565: 彩色,每个像素16bit。
sensor.set_framesize()   #设置图像的大小
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 设置一个固定的曝光时间(以微秒为单位)。
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)

基本操作

1、阈值

可以通过IDE里 工具/机器视觉/阈值编辑器 进行编辑
元组里面的数值分别是L A B 的最大值和最小值。

thresholds = (minL, maxL, minA, maxA, minB, maxB)

2、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() 返回色块的旋转角度(单位为弧度)(float)、也可以通过blob[7]来获取。
blob.code() 返回一个16bit数字,每一个bit会对应每一个阈值。
blob.count() 如果merge=True,那么就会有多个blob被合并到一个blob,这个函数返回的就是这个的数量。如果merge=False,那么返回值总是1。也可以通过blob[9]来获取。
blob.area() 返回色块的外框的面积。应该等于(w * h)
blob.density() 返回色块的密度。这等于色块的像素数除以外框的区域。如果密度较低,那么说明目标锁定的不是很好。

x_stride 就是查找的色块的x方向上最小宽度的像素,默认为2。
y_stride 就是查找的色块的y方向上最小宽度的像素,默认为1。
invert 反转阈值,把阈值以外的颜色作为阈值进行查找。
area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉。
pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉。
merge 合并,如果设置为True,那么合并所有重叠的blob为一个。
margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。

3、感兴趣区(roi)

roi的格式是(x, y, w, h)的tupple.
x:ROI区域中左上角的x坐标
y:ROI区域中左上角的y坐标
w:ROI的宽度
h:ROI的高度
可以根据自己所要用到的视觉区域,来进行更改

left_roi = [0,0,160,240]
blobs = img.find_blobs([thresholds],roi=left_roi)

4、画图

当找到色块,把这个区域用矩形框标注出来,这样非常直观。
(1)画线
image.draw_line(line_tuple, color=White) 在图像中画一条直线。
line_tuple的格式是(x0, y0, x1, y1),意思是(x0, y0)到(x1, y1)的直线。
颜色可以是灰度值(0-255),或者是彩色值(r, g, b)的tupple。默认是白色
(2)画框
image.draw_rectangle(rect_tuple, color=White) 在图像中画一个矩形框。
rect_tuple 的格式是 (x, y, w, h)。
(3)画圆
image.draw_circle(x, y, radius, color=White) 在图像中画一个圆。
x,y是圆心坐标
radius是圆的半径
(4)画十字
image.draw_cross(x, y, size=5, color=White) 在图像中画一个十字
x,y是坐标
size是两侧的尺寸
(5)写字
image.draw_string(x, y, text, color=White) 在图像中写字 8x10的像素
x,y是坐标。使用\n, \r, and \r\n会使光标移动到下一行。
text是要写的字符串。

三、应用

目前OpenMV摄像头可以用来做一下的事情

(1)Frame Differencing帧差分算法
(2)Color Tracking颜色追踪
(3)Marker Tracking标记跟踪
(4)Face Detection人脸检测
(5)Eye Tracking眼动跟踪
(6)Person Detection人检测
(7)Optical Flow光流
(8)QR Code Detection/Decoding二维码检测/解码
(9)Data Matrix Detection/Decoding矩阵码检测/解码
(10)Linear Barcode Decoding条形码
(11)AprilTag Tracking标记跟踪
(12)Line Detection直线检测
(13)Circle Detection圆形检测
(14)Rectangle Detection矩形检测
(15)Template Matching模板匹配
(16)Image Capture图像捕捉
(17)Video Recording视频录制
(18)TensorFlow Lite for Microcontrollers

前路漫漫,还要继续学习。能掌握点就整点!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值