OpenMv学习总结(满满干货)

本文主要记录了学习OpenMv过程中的点滴。它跟OpenCv其实是完全不同的两个东西,大家可不要被迷惑噢。

具体可以参考[1]: https://docs.singtown.com/micropython/zh/latest/openmvcam/openmvcam/quickref.html "Openmv"

OpenMv简介

简单来说,OpenMv就是一个可编程的摄像头,通过使用python语言,专门用作嵌入式当中的视觉感光元件。下面将介绍Openmv使用过程中的常用知识。

感光元件

感光元件即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对象

ROI区域

sensor.set_framesize(sensor.VGA) # 高分辨率
sensor.set_windowing((640, 80)) #取中间的640*80区域

获取/设置像素点

img = sensor.snapshot()
img.get_pixel(10,10)
img.set_pixcel(10,10,(255,0,0))#设置坐标(10,10)的像素点为红色(255,0,0)

图像的运算

  • image.invert() 图像取反

  • image.nand(image) 图像之间进行与非运算

  • image.nor(image) 图像之间进行或非运算

  • image.xor(image)图像之间进行异或运算

  • image.difference(image) 此函数通常用来做移动检测

画图

image.draw_line(line_tuple, color=White) 在图像中画一条直线,其中line_tuple的格式为(x0, y0, x1, y1),即从某点到某点的直线

image.draw_rectangle(rect_tuple, color=White) 在图像中画一个矩形框,其中rect_tuple 的格式是 (x, y, w, h)。

这里只举如上两个例子,其它的用到再去查即可。

添加自定义模块

OpenMv存在一个文件系统,根目录下有一个main.py,把你需要导入的自定义模块复制到根目录下即可。

操作LED

from pyb import LED

led = LED(1) # 红led
led.toggle()
led.on()#亮
led.off()#灭

操作IO口

from pyb import Pin

p_out = Pin('P7', Pin.OUT_PP)#设置p_out为输出引脚
p_out.high()#设置p_out引脚为高
p_out.low()#设置p_out引脚为低
p_in = Pin('P7', Pin.IN, Pin.PULL_UP)#设置p_in为输入引脚,并开启上拉电阻
value = p_in.value() # get value, 0 or 1#读入p_in引脚的值

可以看出,pyb模块里各种外设的操作和32类似,易上手。

控制舵机

from pyb import Servo

s1 = Servo(1) # servo on position 1 (P7)
s1.angle(45) # move to 45 degrees
s1.angle(-60, 1500) # move to -60 degrees in 1500ms
s1.speed(50) # for continuous rotation servos

具体需要用到哪个舵机还是需要参照原理图的结构。

定时器

from pyb import Timer

tim = Timer(4, freq=1000)
tim.counter() # get counter value
tim.freq(0.5) # 0.5 Hz
tim.callback(lambda t: pyb.LED(1).toggle())  //类似于32的回调函数

IO中断

from pyb import Pin, ExtInt

callback = lambda e: print("intr")
ext = ExtInt(Pin('P7'), ExtInt.IRQ_RISING, Pin.PULL_NONE, callback)

PWM输出

from pyb import Pin, Timer

p = Pin('P7') # P7 has TIM4, CH1
tim = Timer(4, freq=1000)
ch = tim.channel(1, Timer.PWM, pin=p)
ch.pulse_width_percent(50)

UART

from pyb import UART

uart = UART(3, 9600)
uart.write('hello')
uart.read(5) # read up to 5 bytes

Openmv应用(寻找色块)

image.find_blobs(thresholds, roi=Auto, x_stride=2, y_stride=1, invert=False, area_threshold=10, pixels_threshold=10, 
merge=False, margin=0, threshold_cb=None, merge_cb=None)
  • Thresholds是你想识别的颜色的阙值,注意它是一个列表对象。
  • roi即你感兴趣的区域。
  • x_stride 就是查找的色块的x方向上最小宽度的像素,y_stride 就是查找的色块的y方向上最小宽度的像素,默认为2。
  • invert反转阙值。
  • area_threshold 面积阈值,如果色块被框起来的面积小于这个值,会被过滤掉。
  • pixels_threshold 像素个数阈值,如果色块像素数量小于这个值,会被过滤掉。
  • merge 合并,如果设置为True,那么合并所有重叠的blob为一个。
  • margin 边界,如果设置为1,那么两个blobs如果间距1一个像素点,也会被合并。

颜色阙值的结构

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

但是OpenMv如此强大,在IDE工具栏里的Machine Vision中有阙值调试工具,效果图如下:

效果

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.area() 返回色块的外框的面积。应该等于(w * h)

能看到这里的人真不容易啊,你们都是大学霸!!!

OpenMv学习之串口的使用

先来看如下一段代码:

# Blob Detection and uart transport
import sensor, image, time
from pyb import UART
import json

sensor.reset() # Initialize the camera sensor.
sensor.set_pixformat(sensor.RGB565) # use RGB565.
sensor.set_framesize(sensor.QQVGA) # use QQVGA for speed.
sensor.skip_frames(10) # Let new settings take affect.
sensor.set_auto_whitebal(False) # turn this off.
clock = time.clock() # Tracks FPS.

uart = UART(3, 115200)

while(True):
    img = sensor.snapshot() # Take a picture and return the image.

    blobs = img.find_blobs([yellow_threshold])
    if blobs:
        print('sum :', len(blobs))
        output_str = json.dumps(blobs) # 在这里串口发送的数据中我们用了json格式,因为它使用起来简单方便,但缺点是占用的资源较多
        for b in blobs:
            # Draw a rect around the blob.
            img.draw_rectangle(b.rect()) # rect
            img.draw_cross(b.cx(), b.cy()) # cx, cy

        print('you send:',output_str)
        uart.write(output_str+'\n')
    else:
        print('not found!')

在这里,我们用串口来不断发送blob数据,而寻找色块的过程跟opencv的思路相似,在前边也介绍过,只不过在openmv中更简便。

当用openmv的串口发送完数据后,接收端需要进行相应的解析才能得到想要的数据,前提是你需要知道发送数据的格式并撰写相应的函数。

本文结束,谢谢阅读

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 159,835评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,598评论 1 295
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,569评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,159评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,533评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,710评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,923评论 2 313
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,674评论 0 203
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,421评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,622评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,115评论 1 260
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,428评论 2 254
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,114评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,097评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,875评论 0 197
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,753评论 2 276
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,649评论 2 271