赞
踩
前言:
最近参加了光电赛,校赛运气不好碰到铁板被淘汰了,我是大一菜鸟,只负责宝藏识别部分,花了一个多月学python、研究openmv写出来的代码,虽然技术性不高,但也算一种学习和成长了。
目录
自己临时找的资料和网课
openmv官方文档:10分钟快速上手 · OpenMV中文入门教程https://book.openmv.cc/quick-starter.htmlPython基础知识:Python导学视频_哔哩哔哩_bilibiliPython导学视频是黑马程序员python教程,8天python从入门到精通,学python看这套就够了的第1集视频,该合集共计164集,视频收藏或关注UP主,及时了解更多相关视频内容。https://www.bilibili.com/video/BV1qW4y1a7fU?p=1&vd_source=bacf9907e915b4bed671807a9c8859a1
己方真宝藏推倒,其他宝藏均不推倒。
假设己方为蓝方,发现己方宝藏外层均为蓝色,真宝藏内层为黄色圆形,假宝藏内层为绿色三角形,敌方同理。
若为真宝藏则对矩形画蓝框,若为假宝藏则画红框。
1. 识别到矩形确认是宝藏;
2. 在矩形区域内,识别蓝色确认是己方宝藏,若为红色则直接判定为假;
3. 在矩形区域内,确认为己方宝藏条件下,识别到圆形确认为真宝藏,否则为假宝藏;
失败原因:圆是徒手画的,识别效果不好;识别圆形需要加畸变矫正,可能阻碍了矩形的识别。
# 畸变矫正
img = sensor.snapshot().lens_corr(1.8)
1. 识别到矩形确认是宝藏;
2. 在矩形区域内,识别蓝色确认是己方宝藏,若为红色则直接判定为假;
3. 在矩形区域内,确认为己方宝藏条件下,识别到黄色色块确认为真宝藏,否则为假宝藏;
失败原因:假宝藏非常容易被识别为真宝藏,敌方真宝藏也有一定概率被误识别为真宝藏,或者直接没有任何识别反应。可能原因一是因为openmv对绿色色块不敏感,但对黄色色块非常敏感;可能原因二是光线较暗的环境下颜色对比度低,无法识别颜色。
- while True:
- clock.tick()
- img = sensor.snapshot()
- for r in img.find_rects(threshold=10000):
- area = r.rect() # 检测到矩形
- blobs_blue = img.find_blobs(blue_threshold, roi = area)
- if blobs_blue:
- # 在矩形内检测到蓝色,说明是己方宝藏
- blobs_yellow = img.find_blobs(yellow_threshold, roi = area)
- # 在矩形框内检测黄色色块
- if blobs_yellow:
- img.draw_rectangle(r.rect(), color = (0, 0, 255))
- # 在检测到的真宝藏上画蓝框
- print("真宝藏")
- else:
- # 没识别到黄色色块,说明是假宝藏
- print("假宝藏")
- else:
- # 没检测到蓝色, 说明是敌方宝藏
- print("敌方宝藏")
图里的代码是很早的版本,看看效果就行,我后面的效果图因为比赛寄了,全删完了回收站都找不到QAQ
1. 识别到矩形确认是宝藏;
2. 在矩形区域内,识别蓝色确认是己方宝藏,若为红色则直接判定为假;
3. 在矩形区域内,确认为己方宝藏条件下,识别到黄色色块确认为真宝藏;
4. 为尽量避免假宝藏的误识别,我将假宝藏的判定条件改为:在矩形区域内,确认为己方宝藏条件下,识别到绿色色块且绿色色块的density在0.40到0.60之间(三角形判定)。
5. 同时,将敌方宝藏的判定条件改为在矩形内检测红色色块。
- while True:
- clock.tick()
- img = sensor.snapshot()
- for r in img.find_rects(threshold=10000):
- area = r.rect() # 检测到矩形
- blobs_blue = img.find_blobs(blue_threshold, roi = area)
- if blobs_blue:
- # 在矩形内检测到蓝色,说明是己方宝藏
- blobs_yellow = img.find_blobs(yellow_threshold, roi = area)
- # 在矩形框内内检测黄色色块
- if blobs_yellow:
- img.draw_rectangle(r.rect(), color = (0, 0, 255))
- # 在检测到的真宝藏上画蓝框
- print("真宝藏")
- else:
- for blob_green in img.find_blobs(green_threshold, roi = area):
- if blob_green and blob_green.density() > 0.40 and blob_green.density() < 0
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。