光电智能垃圾分拣车 第八届全国大学生光电设计竞赛 赛题 2

第八届全国大学生光电设计竞赛 赛题 2 光电智能垃圾分拣车

5.20日的通知

因疫情影响,延期举行。但此赛题仍然有效,不会取消。

正文

1 竞技重点:

大视场垃圾搜寻、识别、分类、抢运能力。

2 竞赛说明:

设计一款光电智能垃圾分拣车,能够从指定位置出发,快速搜寻垃圾,发现 垃圾后对垃圾识别分类,并根据垃圾类别拣送到指定的垃圾堆放地。按照规定时 间内准确分拣的数量确定比赛名次。

3.2.3 垃圾种类、数量、标识、摆放

3.2.3.1 垃圾种类

竞赛用垃圾共 5 种,包括小号矿泉水瓶、7 号电池、一次性纸杯各 1 种,2 种不同形状的物品。其中,2 种不同形状的物品是橘子皮(尺寸大于 3 cm×3 cm, 形状随机)和 A4 纸纸团(形状随机)。矿泉水瓶体为塑料材质、透明、无色或 浅蓝色,瓶内无水,不保留瓶体包装纸和瓶盖,水瓶规格为 330 ml~380 ml。一 次性纸杯的杯体主色为白色,但可能存在其它颜色的花纹和图案,杯内无水,纸 杯规格为 200 ml~250 ml。

3.2.3.2 垃圾数量

比赛使用垃圾数量为 20 个。其中,小号矿泉水瓶、7 号电池、一次性纸杯、 橘子皮、A4 纸纸团各 1 种,每种 4 个。

3.2.3.3 垃圾分类标识

竞赛使用的垃圾分类标准见图 2-2。
场地内的垃圾被分拣车拣拾后按类堆放 到图 2-1 中的红色线框标示的特定堆放区。
5 种竞赛用垃圾、垃圾类别、垃圾堆放处颜色之间的对应关系为:
矿泉水瓶 ——可回收垃圾 ——蓝色;
7 号电池 ——有害垃圾 ——红色;
一次性纸杯 ——其它垃圾 ——黑灰色;
橘子皮 ——厨余垃圾 ——绿色;
A4 纸纸团 ——可回收垃圾 ——蓝色;

图像识别

识别的区域是: 蓝色(面积更大)、红色、绿色和黑灰色。
识别的物品是: 小号矿泉水瓶、7 号电池、一次性纸杯其中,橘子皮和A4 纸纸团(形状随机)。

图像识别工具:

OpenMV
对OpenMV的介绍和使用,笔者在另一篇文章有较详细说明:点击打开我的OpenMV文章

识别思路:

识别区域颜色

识别区域时,因为区域面积较大,且四种颜色色差较大,我们可以很容易根据OpenMV里LAB格式设置阈值,从而识别区分。
区分颜色即可。

这里有三对阈值参数
1.亮度,范围[0,100],从纯黑到纯白;2. a表示从红色到绿色的范围,[127,-128];3. b表示从黄色到蓝色范围,是[127,-128]

white_threshold_01 = ((95, 100, -18, 3, -8, 4));  #白色阈值
red_threshold_01 = ((35, 100, 41, 77, 24, 59));
green_threshold_01 = ((50, 100, -80, -20, 8, 20));
blue_threshold_01 = ((20, 100, -18, 18, -80, -30));

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], pixels_threshold=100, area_threshold=100, merge=True, margin=10);      #红色物块
        blobs1 = img.find_blobs([green_threshold_01], pixels_threshold=100, area_threshold=100, merge=True, margin=10); #绿色物块
        blobs2 = img.find_blobs([blue_threshold_01], pixels_threshold=100, area_threshold=100, merge=True, margin=10);   #蓝色物块
        cx=0;cy=0;cx1=0;cy1=0;cx2=0;cy2=0;
        if blobs:
            #如果找到了目标红色
            max_b = find_max(blobs);
            # Draw a rect around the blob.
            img.draw_rectangle(max_b[0:4]) # rect
            #用矩形标记出目标颜色区域
            img.draw_cross(max_b[5], max_b[6]) # cx, cy
            img.draw_cross(160, 120) # 在中心点画标记
            #在目标颜色区域的中心画十字形标记
            cx=max_b[5];
            cy=max_b[6];
            img.draw_line((160,120,cx,cy), color=(127));
            #img.draw_string(160,120, "(%d, %d)"%(160,120), color=(127));
            img.draw_string(cx, cy, "(%d, %d)"%(cx,cy), color=(127));
blob = blobs[0]
img_ball_r= calc_radius(blob)

识别物体形状

识别物块就有很多难点:矿泉水瓶是透明的,7号电池很小,A4纸团是最大的干扰,形状与橘子皮相似(都随机),颜色与一次性水杯相似,都为白色,如何将其区分开来是一大挑战。橙黄色的橘子皮相对容易识别,而一次性纸杯和A4纸团就是最难以区分的了。

所以我们将从区分形状下手。

以下是检测圆形及颜色的OpenMV代码。

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())

以下为识别矩形的代码:

# Find Rects Example
#
# 这个例子展示了如何使用april标签代码中的四元检测代码在图像中找到矩形。 四元检测算法以非常稳健的方式检测矩形,并且比基于Hough变换的方法好得多。 例如,即使镜头失真导致这些矩形看起来弯曲,它仍然可以检测到矩形。 圆角矩形是没有问题的!
# (但是,这个代码也会检测小半径的圆)...

import sensor, image, time

sensor.reset()
sensor.set_pixformat(sensor.RGB565) # grayscale is faster (160x120 max on OpenMV-M7)
sensor.set_framesize(sensor.QQVGA)
sensor.skip_frames(time = 2000)
clock = time.clock()

while(True):
    clock.tick()
    img = sensor.snapshot()

    # 下面的`threshold`应设置为足够高的值,以滤除在图像中检测到的具有
    # 低边缘幅度的噪声矩形。最适用与背景形成鲜明对比的矩形。

    for r in img.find_rects(threshold = 10000):
        img.draw_rectangle(r.rect(), color = (255, 0, 0))
        for p in r.corners(): img.draw_circle(p[0], p[1], 5, color = (0, 255, 0))
        print(r)

    print("FPS %f" % clock.fps())

本文持续更新中,进度受特殊时期影响,欢迎收藏并留言交流讨论。

2021.5.24 更新

不知不觉,距离上一次编辑这篇文章已经过去了一年多。因为笔者已转向其他研究方向,不再参加本次比赛,所以也就一直没有更新进度,期间很多朋友留言,我也没有足够的时间一一回复,这里统一回复一些大家比较关心的问题:车模可以逛逛淘宝店(可能有点贵,所以先逛逛了解一下),摄像头编程可以多看看教程。

敲黑板 问的最多的关于全局定位:

我们当时有几种方案:
方案一:摄像头智能循迹。(智能控制,别的不多说,至少能享受智能控制的乐趣)
方案二:通过编码器计算路程,实现定位。(较难实现,一旦有随机误差,就会失误,但是机会与风险并存,一旦顺利可能非常完美)
方案三:直接控制轮胎的转动时间,通过延时实现(很容易有误差,不太推荐)
我们后来是方案一和二并用,效果不错。

再这里给大家一个温馨提示,这个比赛与“2019年大学生工程训练综合能力竞赛—智能物流搬运机器人”赛题有一定相似度。大家可以学习那个比赛的经验,我也是参加了工程训练比赛积累的经验。因此也可以看出这个比赛不仅考验电路和编程水平,最好还有工程制造学院的大佬来保障小车的硬件。我们当时是组队是一半制造专业同学,一半电子专业的同学。
最后预祝大家比赛顺利!

  • 79
    点赞
  • 393
    收藏
    觉得还不错? 一键收藏
  • 35
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值