通过Python调⽤OpenMV识别⼩球获取坐标
OPenMV介绍
OpenMV是基于Python的嵌⼊式机器视觉模块,⽬标是成为机器视觉界的“Arduino”。它成本低易拓展,开发环境友好,除了⽤于图像处理外,还可以⽤Python调⽤其硬件资源,进⾏I/O控制,与现实世界进⾏交互。
⼀、如何通过串⼝发送数据—-UART
1、UART⽤法读写操作
# 读⼊10个字符,返回⼀个⽐特对象
# 读取所有的有效字符
# 读⼊⼀⾏
# 读⼊并且保存在缓存中
uart.write('abc')    # write the 3 characters
# 向串⼝写⼊3个字符abc
2、单个字符的读取与写⼊
# 读⼊⼀个字符
uart.writechar(42)  # write 1 character
# 写⼊ASCALL码为42的字符
3、判断串⼝是否有数据
uart.any()          # returns the number of characters waiting
案例:
串⼝简单⽤例—》向串⼝发送数据的代码
# UART Control 串⼝通信
import time
from pyb import UART
uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1) # init with given parameters
while(True):
uart.write("Hello World!\r")
print("Hello World")
# 休眠1s
time.sleep(1000)
串⼝简单⽤例—》向串⼝接收数据
# UART Control 串⼝通信
import time
from pyb import UART
uart = UART(3, 115200)
uart.init(115200, bits=8, parity=None, stop=1) # init with given parameters
while(True):
if uart.any():
# 判断是否有数据,有的话就读⼊
tmp_data = adline()
print(tmp_data)
# 休眠1s
time.sleep(1000)
⼆、如何通过OPenMV摄像头获取⼩球坐标
1、矩形绘制
/*
*  x: 矩形的左上⾓  x坐标
*  y:矩形的左上⾓ y坐标
*  width:矩形的宽度
*  height: 矩形的⾼度
*/
image.draw_rectangle([x, y, width, height])
2、⼗字绘制
/*
*  x: ⼗字的x坐标
*  y: ⼗字的y坐标
*/
image.draw_cross(x, y)
3、find_blobs函数
find_blobs(thresholds, invert=False, roi=Auto)
thresholds 颜⾊阈值 元组数组
invert=1 反转颜⾊阈值,invert=False默认不反转.
roi 设置颜⾊识别的视野区域,roi是⼀个元组, roi = (x, y, w, h),代表从左上顶点(x,y)开始的宽为w⾼为h的矩形区域,roi不设置的话默认为整个图像视野。
4、Blob 对象
{x:26, y:54, w:83, h:38, pixels:448, cx:65, cy:75, rotation:0.342305, code:1, count:1}
1. x 代表矩形区域的左上⾓的x坐标
2. y 代表矩形区域的左上⾓的y坐标
3. w 矩形区域的宽度
4. h 矩形区域的⾼度
5. pixels ⽬标区域满⾜图像阈值范围的像素点的个数
6. cx center x, 矩形区域中⼼的x坐标
7. cy center y, 矩形区域中⼼的y坐标
8. rotation 代表⽬标颜⾊区域blob的旋转⾓度
9. code 代表颜⾊的编号, 它可以⽤来分辨这个这个矩形区域是⽤哪个threshold识别出来的
0. count blob内包含的⼦blob个数。
注:
rotation 单位是弧度值,如果识别的物体是长条状的,例如钢笔, 那其取值范围为0-180度,如果是圆形的画, 其rotaiton值没有任何意义。
code 颜⾊编号 取值范围 2^n : 1,2, 4, 8
count 如果merge=False count恒等于1, 如果开启⾊块合并merge=True 则>=1
案例:
# Blob Detection Example
#
# This example shows off how to use the find_blobs function to find color
# blobs in the image. This example in particular looks for dark green objects.
import sensor, image, time
# For color tracking to work really well you should ideally be in a very, very,
# very, controlled enviroment where the lighting
red_threshold_01 = (0, 35, 0, 50, -10, 40)
#设置红⾊的阈值,括号⾥⾯的数值分别是L A B 的最⼤值和最⼩值(minL, maxL, minA, # maxA, minB, maxB),LAB的值在图像左侧三个坐标图中选取。如果是灰度图,则只需#设置(min, max)两个数字即可。
# You may need to tweak the above settings for tracking
# Select an area in the Framebuffer to copy the color settings.
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)
#关闭⽩平衡。⽩平衡是默认开启的,在颜⾊识别中,需要关闭⽩平衡。
clock = time.clock() # Tracks FPS.
python怎么读取串口数据while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
#  pixels_threshold=100, area_threshold=100
blobs = img.find_blobs([red_threshold_01], area_threshold=150)
if blobs:
#如果到了⽬标颜⾊
print(blobs)
for b in blobs:
#迭代到的⽬标颜⾊区域
# Draw a rect around the blob.
img.draw_rectangle(b[0:4]) # rect
#⽤矩形标记出⽬标颜⾊区域
img.draw_cross(b[5], b[6]) # cx, cy
#在⽬标颜⾊区域的中⼼画⼗字形标记
print(clock.fps()) # Note: Your OpenMV Cam runs about half as fast while
# connected to your computer. The FPS should increase once disconnected.
三、综合案例
main.py⽂件如下:
# main.py -- put your code here!
import sensor, image, time
import protocol
import utils
from pyb import UART
import json
sensor.set_pixformat(sensor.RGB565)  #设置为彩⾊模式
sensor.set_framesize(sensor.QQVGA)      #画幅为QQVGA即分辨率为160*120
sensor.skip_frames(time = 2000)        #跳过起始画⾯,获取稳定图像
sensor.set_auto_gain(False) #在⾊块检测模式下关闭⾃动补光
sensor.set_auto_whitebal(False) #关闭⽩平衡
clock = time.clock()
#根据测量设备⼩球颜⾊,并把LAB⾊值存储到集合中
red_threshold  = ( 65,75,-60,-40,30,48) #设置监测红⾊⾊块阈值
green_threshold  = ( 65,75,-60,-40,30,48) #设置检测绿⾊⾊块阈值
blue_threshold  = ( 65,75,-60,-40,30,48) #设置监测蓝⾊⾊块阈值
yellow_threshold  = ( 65,75,-60,-40,30,48) #设置监测黄⾊⾊块阈值
# 初始化各坐标值
xPositionNow = 0
yPositionNow = 0
xPositionLast = 0
yPositionLast = 0
imageSize = 128
count=0
#存储每个⼩球的坐标
matrix = [[] for i in range(10)]
index=0#识别次数
Color() #获取要识别颜⾊⼩球
print('xIndex',xIndex)
#判断是要识别什么颜⾊的⼩球
xThreshold=(0,0,0,0,0,0) #默认值
if xIndex==0x01:
xThreshold=red_threshold #红⾊
print('当前要识别的⼩球颜⾊是红⾊')
elif xIndex==0x02:
xThreshold=green_threshold #绿⾊
print('当前要识别的⼩球的颜⾊是绿⾊')

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。