【感兴区roi学习应用】OpenMv如何只识别左边屏幕里面的红色小球

思路应该就是给他一个区域,然后在区域里面找红色小球
拉到最后看结果,前面目前是死路……

那么找小球代码
官网: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())

haiyou

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('没找着,继续找最大')
        

  • 20
    点赞
  • 116
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值