OpenMV简介以及基本中文教程请参见目前官网给出OpenMV中国的三家代理商,英文教程请参见官网以及官方论坛。此笔记是由于中文代理商不够全面的基础上,整合官网教程,自己可以最大程度的了解这个小巧易用的摄像头模块,也方便大家参考,但*不保证正确,您所使用的代码,对您的openmv造成任何损害,我概不负责,慎用!*
>0x01<—>MicroPython库<
以下标准Python库内置于MicroPython中。对于其他库,请从micropython-lib存储库下载。Python标准库和微型库,以下标准Python库已经被“微观化”以适应MicroPython的理念。它们提供该模块的核心功能,旨在成为标准Python库的替代品。这些模块可以通过他们的 u-name引用,也可以通过它们的 non-u-name来获得。 non-u-name该名称的文件应在你的package路径中。例如,import json 将首先搜索 json.py 文件或 json 目录,如果找到它就可加载该包。如果没有找到任何内容,它将回退加载内置ujson模块。
官网给出的几个模块,引用方法同Python的基本语法一样,先 import,再 name.function()
- gc - 控制垃圾收集器
- math - 数学函数库
- select - 等待一组流上的事件
- sys - 系统特定功能
- ubinascii - 二进制/ ASCII转换
- uhashlib - 哈希算法
- uio - 输入/输出流
- ujson - JSON编码和解码
- uos - 基本的“操作系统”服务
- ure - 正则表达式
- usocket - 提供对BSD的访问。
- ustruct - 打包和解包原始数据类型
- utime - 时间相关功能
- uzlib - zlib解压缩
举个栗子
import math
def degrees(radians): #弧度制和角度制的转换计算
return (180 * radians) / math.pi
对于OpenMV,开发者,封装了专门的库,用于使用者调用,简单方便。
pyb # 与电路板相关的功能(板级功能)
#时间相关功能 (部分可以与time类替换)
#复位相关功能
#中断相关功能
#电源相关功能
#其他功能
#类(class)
########其他类#########
ADC #- 模数转换
#构造函数(Constructors)
#方法(Methods)
DAC #- 数模转换
#构造函数
#方法
CAN #总线控制器局域网通信总线
#构造函数
#类方法(Class Methods)
#方法
#常量(Constants)
ExtInt #- 配置I / O引脚以在外部事件中中断
#构造函数
#类方法
#方法
#常量
I2C # - 一个双线串行协议
#构造函数
#方法
#常量
LED #LED,板子上已经内置了几个led
#构造函数
#方法
I / O #引脚
#构造函数
#类方法
#方法
#常量
servo #- 3线伺服驱动器
构造函数
方法
SPI类 #- 主驱动串行协议
#构造函数
#方法
#常量
Timer #- 控制内部定时器
#构造函数
#方法
TimerChannel #- 为定时器设置通道
#方法
UART #- 双工串行通信总线
#构造函数
#方法
#常量
#流量控制
USB_VCP #- USB虚拟通信端口
#构造函数
#方法
time #- 追踪经过时间
#功能
#构造函数
#方法
sensor #- 摄像头传感器
#功能
#常量
image #- 机器视觉
#功能
HaarCascade #- 特征描述符
#构造函数
Histogram #- 直方图对象
#方法
Percentile #百分位数对象
方法
Statistics #- 统计对象
#方法
Blob #- Blob对象
#方法
Line #- Line对象
Circle #- Circle对象
#方法
Rect #- Rectangle Object
#方法
QRCode #- QRCode对象,扫码
#方法
AprilTag #- AprilTag对象,3D识别***标签***
#方法
DataMatrix #- DataMatrix对象
#方法
BarCode #- BarCode对象
#方法
kptmatch #- 关键点对象
#方法
ImageWriter #- ImageWriter对象
#构造函数
#方法
ImageReader # - ImageReader对象
#构造函数
#方法
Image #- 图像对象
#构造函数
#方法
#常量
gif #- gif录音
Gif #Gif录音机
#构造函数
#方法
mjpeg #- mjpeg录音
Mjpeg #- Mjpeg录音机
#构造函数
#方法
lcd #- lcd屏蔽驱动程序,配套官方屏幕
#功能
fir #- 热电屏蔽驱动器(fir ==远红外线)
#功能
cpufreq #- 简单的cpu频率控制
#功能
#常量
machine #- 与电路板相关的功能
#复位相关功能
#中断相关功能
#电源相关功能
#杂项功能
#类
I2C #- 一个双线串行协议
构造函数
一般方法
原始I2C操作
标准 bus 操作
内存操作
代码实例
import sensor, image, time,pyb
from pyb import UART
from pyb import Pin
green_threshold=(45,75,-40,-10,4,30)
blue_threshold = ( 30 ,45,0,30,-62,-39)
ROI=(77,8,221,216)#设置检测区域(兴趣范围)
sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QVGA) # use QQVGA for speed.
sensor.set_brightness(-1)#亮度
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_gain(False) # must be turned off for color tracking
sensor.set_auto_whitebal(False) # must be turned off for color tracking
#关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡。
clock = time.clock() # Tracks FPS.
single_out = Pin('P0', Pin.OUT_PP)#IO操作,注意对应OpenMV引脚
single_out.low()
# P4->TX ,P5->RX
uart = UART(3, 115200)#先实例化一个19200波特率的串口3,
pyb.delay(1000)#板级毫秒延时,也可以time.ticks()替换,
send_data_2=[0xf1,0,0,0,0,0,0,0,0,0xf2]
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
send_data=[]
send_data.append(0xf0)
img = sensor.snapshot() # Take a picture and return the image.
green_blobs = img.find_blobs([green_threshold],roi=ROI)
sum_bai=len(green_blobs)
#print("bai%d:"%sum_bai)#调试用
if sum_bai>=1:
#如果找到了目标颜色
for b in green_blobs[0:1]:#只取一个
#迭代找到的目标颜色区域
# Draw a rect around the blob.
img.draw_rectangle(b[0:4],color=(255,255,255)) # rect
#用白色矩形标记出目标颜色区域
img.draw_cross(b[5], b[6]) # cx, cy
#发打送包(8bit/位),精度保留
send_data.append(b[5]//256)
send_data.append(b[5]%256)
send_data.append(b[6]//256)
send_data.append(b[6]%256)
#在目标颜色区域的中心画十字形标记
if sum_bai==0:#保证数据包一样长
send_data.append(send_data_2[1])
send_data.append(send_data_2[2])
send_data.append(send_data_2[3])
send_data.append(send_data_2[4])
#蓝色识别追踪
blue_blobs = img.find_blobs([blue_threshold],roi=ROI)
sum_blue=len(blue_blobs)
if blue_blobs:
#如果找到了目标颜色
for b in blue_blobs:
#迭代找到的目标颜色区域
# Draw a rect around the blob.
img.draw_rectangle(b[0:4],color=(0,0,0)) # rect
#用白色矩形标记出目标颜色区域
img.draw_cross(b[5], b[6]) # cx, cy
#在目标颜色区域的中心画十字形标记
send_data.append(b[5]//256)
send_data.append(b[5]%256)
send_data.append(b[6]//256)
send_data.append(b[6]%256)
break
#在目标颜色区域的中心画十字形标记
if sum_blue==0:
send_data.append(send_data_2[5])
send_data.append(send_data_2[6])
send_data.append(send_data_2[7])
send_data.append(send_data_2[8])
img.draw_rectangle(ROI)
print(clock.fps()) # 帧率值,Note: Your OpenMV Cam runs about half as fast while
# connected to your computer. The FPS should increase once disconnected.
print("white: %d blue: %d"%(sum_bai,sum_blue))
send_data.append(0xf1)#帧尾
#自定义数据帧完毕,拉高P0为高电平,出发单片机外部IO中断接收数据包
single_out.high()
pyb.delay(5)
for i in send_data:
uart.writechar(i)
print(send_data)#调试用
send_data_2=send_data#更新包,目标出现短暂检测不出使用上一个位置的值
pyb.delay(1)#延迟再拉低P0,发送完毕,在示波器下可看出P0为高电平时,有UART3的发送引脚有电平变化即数据发送
single_out.low()