查看: 920|回复: 12

[项目] DF小黑盒变身---神奇宝贝图鉴

[复制链接]

一、项目介绍:
     作为一个资深神奇宝贝迷老爸,每部关于精灵宝可梦的电影和动画片必看;《大侦探皮卡丘》讲述了蒂姆·古德曼为寻找下落不明的父亲来到莱姆市,意外与父亲的前宝可梦搭档大侦探皮卡丘相遇,并惊讶地发现自己是唯一能听懂皮卡丘说话的人类,他们决定组队踏上揭开真相的刺激冒险之路得故事。每次欣赏完大片,各种玩具和图鉴等衍生产品成了必买选择;老爸荷包严重缩水,授人以鱼不如授人以渔,趁假期和孩子一起造《神奇宝贝图鉴》,捕获属于自己的神奇宝贝。
    小伙伴们,快来辨别和收服现实世界中的动物们吧。

202007254733..png

二、项目功能及运行流程
202007253992..png

三、硬件清单
1.DF小黑盒  *1
4.碰撞传感器(左右皆可)*1 https://www.dfrobot.com.cn/goods-638.html



202007257867..png


四、硬件连接
1.连接OLED屏幕
202007259207..png

2.连接碰撞开关
202007251117..png

3.连接树莓派摄像头
202007254865..png

五、调试代码
代码运行思路如下
设置系统自动运行程序,按按钮拍照屏幕显示照片;识别照片,屏幕反馈结果。
202007256095..png
1.程序为python 3.7.3版本
导入库文件,和显示图形和屏幕输出文字函数三个函数解析:
shape()、animal_pt(anim) 、 shape_1()
特别注意animal_pt(anim)的句子
font = ImageFont.truetype('simkai.ttf', 20)
simkai.ttf为字体库 ,可以下载,也可以在系统的字体文件夹直接拷贝


[Python] 纯文本查看 复制代码
'''
导入需要库
'''
# -*- coding: utf-8 -*-
from RPi import GPIO
import time
import os
import requests
import base64
import Adafruit_SSD1306
#import subprocess
from PIL import Image
from PIL import ImageDraw
from PIL import ImageFont

#屏幕显示开启提示
def shape():
    RST = 24
    # Note the following are only used with SPI:
    DC = 23
    SPI_PORT = 0
    SPI_DEVICE = 0
    #128x64 display with hardware I2C:
    disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
    disp.begin()
    disp.clear()
    disp.display()
    width = disp.width
    height = disp.height
    image = Image.new('1', (width, height))
    draw = ImageDraw.Draw(image)
    draw.rectangle((0,0,width,height), outline=0, fill=0)
    font = ImageFont.load_default()
    font = ImageFont.truetype('simkai.ttf', 20)
    draw.text((20, 20), '系統已開啓',  font=font, fill=255)
    disp.image(image)
    disp.display()


#根据图片识别结果,文字输出屏幕反馈
def animal_pt(anim):
    if data_ocr1 !="非动物":
        text = '獲取成功'
        #animal_pt(data_ocr1,text1)
    else :
        text = '無法獲取' 
    RST = None
    disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
    disp.begin()
    disp.display()
    width = disp.width
    height = disp.height
    image = Image.new('1', (width, height))
    draw = ImageDraw.Draw(image)
    font = ImageFont.load_default()
    font = ImageFont.truetype('simkai.ttf', 20)
    draw.text((10, 10), anim,  font=font, fill=255)
    draw.text((40, 40), text,  font=font, fill=255)
    disp.image(image)
    disp.display()
    
#屏幕显示拍摄的动物图片
def shape_1():
    RST = None
    disp = Adafruit_SSD1306.SSD1306_128_64(rst=RST)
    # Initialize library.
    disp.begin()
    # Clear display.
    disp.clear()
    disp.display()
    width = disp.width
    height = disp.height
    image = Image.new('1', (width, height))
    # Get drawing object to draw on image.
    draw = ImageDraw.Draw(image)
    # Draw a black filled box to clear the image.
    draw.rectangle((0,0,width,height), outline=0, fill=0)
    image = Image.open('tiger.jpg').resize((disp.width, disp.height), Image.ANTIALIAS).convert('1')
    disp.image(image)  
    disp.display()

2.animal_ocr()函数对设备拍摄的照片,进行AI识别,模型库为百度已训练好

[Python] 纯文本查看 复制代码
'''
动物识别 ,可参考百度AI平台动物识别连接
[url=https://ai.baidu.com/tech/imagerecognition/animal]https://ai.baidu.com/tech/imagerecognition/animal[/url]
'''
def animal_ocr():
    request_url = "https://aip.baidubce.com/rest/2.0/image-classify/v1/animal"
    # 二进制方式打开图片文件
    m = open('tiger.jpg', 'rb')
    img = base64.b64encode(m.read())
    params = {"image":img}
    access_token = '24.2ae5773a75806bb5e69d0cd15ae02b3e.2592000.1597564614.282335-21433533'
    #调用鉴权接口获取的token,参考动物识别获取token.py
    request_url = request_url + "?access_token=" + access_token
    headers = {'content-type': 'application/x-www-form-urlencoded'}
    response = requests.post(request_url, data=params, headers=headers)
    if response:
        #print (response.json())
        data = response.json()
        #print(data)
        data = data['result']
        data_ocr= data[0]['name']
        print('相似度:', data[0]['score'])
        print('动物名称:', data[0]['name'])
    return data_ocr
3.定义按钮端口和判断程序
[Python] 纯文本查看 复制代码
# 采用BCM引脚编号
GPIO.setmode(GPIO.BCM)
# 关闭警告
GPIO.setwarnings(False)
# 设置GPIO输入模式, 使用GPIO内置的下拉电阻, 即开关断开情况下输入为LOW
GPIO.setup(22, GPIO.IN)
shape()
try: 
    while True:
        if (GPIO.input(22)==GPIO.LOW):
            print('拍照開始!')
            os.system("raspistill -n -t 200 -w 1024 -h 768 -o tiger.jpg")
            time.sleep(2)
            shape_1()     
            data_ocr1=animal_ocr()
            animal_pt(data_ocr1)
            time.sleep(3)
        else :
            print('請按快門拍照!')
            shape()
            time.sleep(0.5)
except Exception :
    print('erorr')         
GPIO.cleanup()

六、组装外壳,整体测试

202007252227..png

202007254147..png

202007253919..png

202007259594..png

202007257535..png

202007257274..png

七、设备测试视频

八、项目扩展:
1.增加语音输出
2.攒钱买个大屏幕
3.配置移动电源,方便携带
4.扩展为其他物品识别模式

九、字体库
可以下载附件也可以 直接在控制面板-字体中复制

202007251656..png


simkai.rar

6.07 MB, 下载次数: 12

rzyzzxw  版主

发表于 2020-7-25 17:53:27

棒棒的
回复

使用道具 举报

hnyzcj  版主

发表于 2020-7-25 18:03:24

是一个图像识别吗
回复

使用道具 举报

gray6666  初级技神
 楼主|

发表于 2020-7-26 14:47:21

hnyzcj 发表于 2020-7-25 18:03
是一个图像识别吗

动物图片识别,可以扩展成其物品
回复

使用道具 举报

pATAq  版主

发表于 2020-7-29 22:45:02

来了来了
回复

使用道具 举报

gray6666  初级技神
 楼主|

发表于 2020-7-30 07:45:11


欢迎欢迎
回复

使用道具 举报

20060606  高级技匠

发表于 2020-7-30 18:04:27

df的包装盒质量很好,还可以做项目外壳
回复

使用道具 举报

DFS1w2cb8o8  中级技师

发表于 2020-7-30 20:11:19

厉害厉害
回复

使用道具 举报

gray6666  初级技神
 楼主|

发表于 2020-7-31 16:27:00

群众组织一场DF小纸壳创意赛吧
回复

使用道具 举报

pATAq  版主

发表于 2020-8-1 13:06:22

gray6666 发表于 2020-7-31 16:27
群众组织一场DF小纸壳创意赛吧

我也有好多df盒子,拿来废物利用
回复

使用道具 举报

Storm  初级技师

发表于 2020-8-5 10:42:47

就地取材666
回复

使用道具 举报

 初级技师

发表于 2020-8-5 16:10:43

厉害呀666
回复

使用道具 举报

牛小宝  见习技师

发表于 2020-9-14 16:06:41

666牛逼666!!!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2020 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail