思路应该就是给他一个区域,然后在区域里面找红色小球
拉到最后看结果,前面目前是死路……
那么找小球代码
官网:http://book.openmv.cc/quick-starter.html
import sensor, image, time
red_threshold=(18, 69, 40, 86, 0, 72)
sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
sensor.set_framesize(sensor.QQVGA) # 使用 QQVGA 速度快一些
sensor.skip_frames(time = 2000) # 跳过2000s,使新设置生效,并自动调节白平衡
sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的,在颜色识别中,一定要关闭白平衡。
sensor.set_auto_whitebal(False)
clock = time.clock() # 追踪帧率
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # 从感光芯片获得一张图像
blobs = img.find_blobs([red_threshold])
if blobs:
#如果找到了目标颜色
for b in blobs:
img.draw_rectangle(b[0:4]) # rect
img.draw_cross(b[5], b[6]) # cx, cy
print(b)
颜色和形状一起识别
import sensor, image, time
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
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()
while(True):
clock.tick()
img = sensor.snapshot().lens_corr(1.8)
for c in img.find_circles(threshold = 3500, x_margin = 10, y_margin = 10, r_margin = 10,
r_min = 2, r_max = 100, r_step = 2):
area = (c.x()-c.r(), c.y()-c.r(), 2*c.r(), 2*c.r())
#area为识别到的圆的区域,即圆的外接矩形框
statistics = img.get_statistics(roi=area)#像素颜色统计
print(statistics)
#(0,100,0,120,0,120)是红色的阈值,所以当区域内的众数(也就是最多的颜色),范围在这个阈值内,就说明是红色的圆。
#l_mode(),a_mode(),b_mode()是L通道,A通道,B通道的众数。
if 0<statistics.l_mode()<100 and 0<statistics.a_mode()<127 and 0<statistics.b_mode()<127:#if the circle is red
img.draw_circle(c.x(), c.y(), c.r(), color = (255, 0, 0))#识别到的红色圆形用红色的圆框出来
else:
img.draw_rectangle(area, color = (255, 255, 255))
#将非红色的圆用白色的矩形框出来
print("FPS %f" % clock.fps())
roi的格式是(x, y, w, h)的tupple.
- x:ROI区域中左上角的x坐标
- y:ROI区域中左上角的y坐标
- w:ROI的宽度
- h:ROI的高度
l_mean,l_median,l_mode,l_stdev,l_min,l_max,l_lq,l_uq,
a_mean,a_median,a_mode,a_stdev,a_min,a_max,a_lq,a_uq,
b_mean,b_median,b_mode,b_stdev,b_min,b_max,b_lq,b_uq,
是LAB三个通道的平均数,中位数,众数,标准差,最小值,最大值,第一四分数,第三四分数。
import sensor, image, time
sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(10) # 跳过10帧,使新设置生效
sensor.set_auto_whitebal(False) # Create a clock object to track the FPS.
ROI=(80,30,15,15)
while(True):
img = sensor.snapshot() # Take a picture and return the image.
statistics=img.get_statistics(roi=ROI)
color_l=statistics.l_mode()
color_a=statistics.a_mode()
color_b=statistics.b_mode()
print(color_l,color_a,color_b)
img.draw_rectangle(ROI)
从这三个历程中应该能写出我们的代码了吧
先把找颜色的小球代码前面复制下来
import sensor, image, time
r=red_threshold=(18, 69, 40, 86, 0, 72)
sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
sensor.set_framesize(sensor.QQVGA) # 使用 QQVGA 速度快一些
sensor.skip_frames(time = 2000) # 跳过2000s,使新设置生效,并自动调节白平衡
sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的,在颜色识别中,一定要关闭白平衡。
sensor.set_auto_whitebal(False)
clock = time.clock() # 追踪帧率
while(True):
pass
写我们的While循环(没成功,不行,放弃)
while(True):
pass
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # 从感光芯片获得一张图像
area = (0, 0, image.width(), image.height())#x,y,w,h
statistics=img.get_statistics(roi=area)
if r[0]<statistics.l_mode()<r[1] and r[2]<statistics.a_mode()<r[3] and r[4]<statistics.b_mode()<r[5]:#if the circle is red
img.draw_rectangle(b[0:4]) # rect
else:
img.draw_rectangle(area, color = (255, 255, 255))
#将非红色的圆用白色的矩形框出来
print("FPS %f" % clock.fps())
blobs = img.find_blobs([red_threshold])
if blobs:
#如果找到了目标颜色
for b in blobs:
img.draw_rectangle(b[0:4]) # rect
img.draw_cross(b[5], b[6]) # cx, cy
print(b)
最终思路和代码:
哈哈,发现有个更简单的方法
area = (0, 0, 80, 80)#x,y,w,h
sensor.set_windowing(area) #取中间的80*80区域
最终代码
import sensor, image, time
red_threshold=(18, 69, 40, 86, 0, 72)
sensor.reset() # 初始化摄像头
sensor.set_pixformat(sensor.RGB565) # 格式为 RGB565.
sensor.set_framesize(sensor.QQVGA) # 使用 QQVGA 速度快一些
sensor.skip_frames(time = 2000) # 跳过2000s,使新设置生效,并自动调节白平衡
sensor.set_auto_gain(False) # 关闭自动自动增益。默认开启的,在颜色识别中,一定要关闭白平衡。
sensor.set_auto_whitebal(False)
clock = time.clock() # 追踪帧率
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # 从感光芯片获得一张图像
area=(0,0,80,120)
blobs = img.find_blobs([red_threshold],roi=area)
if blobs:
#如果找到了目标颜色
for b in blobs:
img.draw_rectangle(b[0:4]) # rect
img.draw_cross(b[5], b[6]) # cx, cy
pass
print(clock.fps())
结果
OpenMv色块追踪算法的改善
思路借鉴:https://blog.csdn.net/jiejiemcu/article/details/80579893
import sensor, image, time
red_threshold=(18, 69, 40, 86, 0, 72)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(20)
sensor.set_auto_whitebal(False)
#关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡
clock = time.clock()
while(True):
img = sensor.snapshot()
blobs = img.find_blobs([red_threshold],
area_threshold=4)
if blobs:
last_blobs = blobs
break
while(True):
clock.tick()
img = sensor.snapshot()
if last_blobs:
for b in blobs:
x1 = b[0]-7
y1 = b[1]-7
w1 = b[2]+12
h1 = b[3]+12
#print(b.cx(),b.cy())
roi2 = (x1,y1,w1,h1)
print(roi2)
blobs = img.find_blobs([red_threshold],
roi = roi2,
area_threshold=4)
last_blobs = blobs
img.draw_rectangle(b[0:4])
img.draw_cross(b[5], b[6])
else:
blobs = img.find_blobs([red_threshold],
area_threshold=4)
last_blobs = blobs
print("帧率 : ",clock.fps())
发现有个问题就是它一般识别中间的小球,结合识别最大小球?
思路,把思路写下来,唉,好烦没写出来前
思路:
首先拍一张照,找到最大色块,然后,在色块周围的兴趣区域搜索红色,画框,如果兴趣区没找到红色,就在整个屏幕找
还是有思路,实现就很简单啦!!!!
初级:还是不行
import sensor, image, time
red_threshold=(18, 69, 40, 86, 0, 72)
area=(0,0,160,120)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(20)
sensor.set_auto_whitebal(False)
#关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡
clock = time.clock()
def find_max(blobs):
max_size=0
for blob in blobs:
if blob[2]*blob[3] > max_size:
max_blob=blob
max_size = blob[2]*blob[3]
return max_blob
def find_maxball(ball_threshold):
pass
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([ball_threshold],roi=area)
if blobs:
max_blob = find_max(blobs)
img.draw_rectangle(max_blob[0:4]) # rect
img.draw_cross(max_blob[5], max_blob[6]) # cx, cy
return(max_blob)
while(True):
track=find_maxball(red_threshold)
if track:
print('track=',track)
x1=track[0]-7
y1=track[1]-7
w1=track[2]+12
h1=track[3]+12
area=(x1,y1,w1,h1)
print('area=',area,area[1])
else:
print('跳出范围了')
area=(0,0,160,120)
print("帧率 : ",clock.fps())
不知不觉写成了可以多色块追踪
import sensor, image, time
red_threshold=(18, 69, 40, 86, 0, 72)
area=(0,0,160,120)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(20)
sensor.set_auto_whitebal(False)
#关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡
clock = time.clock()
def find_max(blobs):
max_size=0
for blob in blobs:
if blob[2]*blob[3] > max_size:
max_blob=blob
max_size = blob[2]*blob[3]
return max_blob
def find_maxball(ball_threshold,area):
pass
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([ball_threshold],roi=area)
print(blobs)
if blobs:
max_blob = find_max(blobs)
img.draw_rectangle(max_blob[0:4]) # rect
img.draw_cross(max_blob[5], max_blob[6]) # cx, cy
return(max_blob)
def track_maxball(red_threshold,area):
track=find_maxball(red_threshold,area)
if track:
print('track=',track)
x1=track[0]-2
y1=track[1]-2
w1=track[2]+4
h1=track[3]+4
area=(x1,y1,w1,h1)
print('area=',area,area[1])
else:
print('跳出范围了')
area=(0,0,160,120)
return(track)
print("帧率 : ",clock.fps())
while(True):
for i in range(50):
track=find_maxball(red_threshold,area)
if track!=None:
print('找到了最大小球,追踪最大小球')
while(True):
print(track)
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
x1=track[0]-2
y1=track[1]-2
w1=track[2]+4
h1=track[3]+4
area=(x1,y1,w1,h1)
print('area=',area)
blobs = img.find_blobs([red_threshold])
if blobs:
for b in blobs:
print('成功追踪',b)
img.draw_rectangle(b[0:4]) # rect
else:
print('丢失目标')
else:
print('没找着,继续找最大')
真真真最后结果:
还没简化,笑哭死,简化需要area是全局变量还是什么的
import sensor, image, time
red_threshold=(18, 69, 40, 86, 0, 72)
area=(0,0,160,120)
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(20)
sensor.set_auto_whitebal(False)
#关闭白平衡。白平衡是默认开启的,在颜色识别中,需要关闭白平衡
clock = time.clock()
def find_max(blobs):
max_size=0
for blob in blobs:
if blob[2]*blob[3] > max_size:
max_blob=blob
max_size = blob[2]*blob[3]
return max_blob
def find_maxball(ball_threshold,area):
pass
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([ball_threshold],roi=area)
print(blobs)
if blobs:
max_blob = find_max(blobs)
img.draw_rectangle(max_blob[0:4]) # rect
img.draw_cross(max_blob[5], max_blob[6]) # cx, cy
return(max_blob)
def track_maxball(red_threshold,area):
track=find_maxball(red_threshold,area)
if track:
print('track=',track)
x1=track[0]-2
y1=track[1]-2
w1=track[2]+4
h1=track[3]+4
area=(x1,y1,w1,h1)
print('area=',area,area[1])
else:
print('跳出范围了')
area=(0,0,160,120)
return(track)
print("帧率 : ",clock.fps())
while(True):
for i in range(50):
track=find_maxball(red_threshold,area)
if track!=None:
print('找到了最大小球,追踪最大小球')
while(True):
print(track)
x1=track[0]-2
y1=track[1]-2
w1=track[2]+4
h1=track[3]+4
area=(x1,y1,w1,h1)
print('area=',area)
while(True):
clock.tick() # Track elapsed milliseconds between snapshots().
img = sensor.snapshot() # Take a picture and return the image.
blobs = img.find_blobs([red_threshold],roi=area)
if blobs:
for b in blobs:
x1=b[0]-4
y1=b[1]-4
w1=b[2]+8
h1=b[3]+8
area=(x1,y1,w1,h1)
print('area=',area)
print('成功追踪',b)
img.draw_rectangle(area[0:4]) # rect
img.draw_rectangle(b[0:4]) # rect
else:
print('丢失目标')
area=(0,0,160,120)
else:
print('没找着,继续找最大')