×

用Raspberry Pi的视觉识别事物

消耗积分:0 | 格式:zip | 大小:0.30 MB | 2022-12-26

吴藩

分享资料个

描述

这篇文章包含制作您自己的图像分析器的说明。

硬件要求

  • 树莓派
  • 树莓派相机
  • 字符型液晶显示器
  • 跳线
  • 面包板
  • 电位计(如果您的 LCD 支持对比度调整)
  • 按钮

请检查下面的示意图以获取接线图。

软件要求

我们将在按下按钮时拍摄照片,然后将该图像上传到 Dropbox。然后,我们将从 Dropbox 获取可共享链接,并使用该照片链接调用 Microsoft Computer Vision API。API 调用返回的结果将显示在字符 LCD 上。

安装依赖项

Adafruit Python CharLCD 库

从以下 Github 链接获取 LCD 库。

https://github.com/adafruit/Adafruit_Python_CharLCD  

CD 到下载的文件夹并运行以下命令。

sudo python3 setup.py install   

要求

sudo pip3 install requests   

投递箱

登录您的保管箱帐户并创建一个应用程序来存储捕获的图像。您还需要一个访问令牌。以下链接可能会有所帮助。

通过键入以下命令安装 dropbox python 客户端库

sudo pip3 install dropbox   

获取计算机视觉 API(订阅)密钥以进行 API 调用

您可以通过访问以下链接获取免费订阅密钥。在撰写本文时,Microsoft 允许每月进行 5000 次免费交易

Python 3 代码

导入依赖项

import RPi.GPIO as GPIO  
import picamera  
import Adafruit_CharLCD as LCD  
import os.path  
import time  
import requests  
import dropbox  
import json   

调用 API 的变量

使用您之前获得的密钥更新 subscription_key 变量。

subscription_key = 'YOUR_Subscription_KEY'  
# URL will be mentioned when you obtain your  
url = "https://westcentralus.api.cognitive.microsoft.com/vision/v1.0/analyze"   

Dropbox 的访问令牌

access_token = 'YOUR_ACCESS_TOKEN'   

树莓派开发板

GPIO.setmode(GPIO.BCM)   

按钮设置

btn = 16  
GPIO.setup(btn, GPIO.IN, pull_up_down=GPIO.PUD_UP)   

驱动 LCD 的变量

对应的 Raspberry Pi GPIO 引脚用于 LCD 上的寄存器选择、指令和数据寄存器。稍后我们将使用这些变量来初始化 LCD。

lcd_rs = 4  
lcd_en = 17  
lcd_d4 = 25  
lcd_d5 = 24  
lcd_d6 = 23  
lcd_d7 = 18   

LCD 的尺寸,如果您有 16x2 的字符 LCD,则将 lcd_columns 变量修改为 16,将 lcd_rows 修改为 2。由于我使用的是 20x4 LCD,因此我将使用以下值。

lcd_columns = 20  
lcd_rows = 4   

初始化

通过调用 Dropbox、Adafruit 和 picamera 库提供的构造方法来初始化 Dropbox、LCD 和相机。如果您的 LCD 支持背光,那么您可以传入一个附加参数 backlight = 1 或 backlight = 0 来打开或关闭它。

# Initilaize Dropbox  
dbx = dropbox.Dropbox(access_token)  
# Initialize the LCD using the pins above by calling the construct method of Adafruit LCD library  
lcd = LCD.Adafruit_CharLCD(lcd_rs, lcd_en, lcd_d4, lcd_d5, lcd_d6, lcd_d7, lcd_columns, lcd_rows)  
# Initialize the camera  
cam = picamera.PiCamera()   

主函数

main() 函数是程序启动时第一个被调用的函数。它等待按钮按下,当按下按钮时,它调用其他函数来捕获图像,将其上传到保管箱,获取上传的图像链接,然后最后调用 predict_contents() 函数,该函数调用 Vision API 并在 LCD 上显示结果。当用户再次按下按钮时,在最后一步调用 main() 函数以执行相同的步骤。

def main():  
  while True:  
    cam.capture('image.jpg')  
    display_message('Uploading..')  
    upload_image()  
    display_message('Generating Image', 'link..')  
    image_url = get_image_url()  
    display_message('Analysing..')  
    predict_contents(image_url)  
    main()   

下面将更详细地描述此处使用的每个函数。

display_message() 函数

display_function() 函数利用 Adafruit LCD 库提供的 message() 函数。调用它时最多可以传入四个字符串,它会在新行上显示每个字符串。但是,如果您只传入 line1 参数,它将在多行中显示消息。lcd.clear()将清除 LCD 上的任何现有文本 lcd.home() 并将光标移至第 1 行和第 1 列。

def display_message(line1 = '', line2 = '', line3 = '', line4 = ''):  
  lcd.clear() # Clear the display  
  lcd.home() # Bring cursor to row 1 and column 1  
  if(line1 != '' and line2 == '' and line3 == '' and line4 == ''):  
    lcd.message(line1)  
  else:  
    lcd.message(line1 + '\n' + line2 + '\n' + line3 + '\n' + line4)  

upload_image() 函数

这段代码在命名的工作目录中获取先前捕获的图像image.jpg并将其上传到 dropbox。

def upload_image():  
  remote_file = '/image.jpg'  
  f = open(local_file, 'rb')  
  dbx.files_upload(f.read(), remote_file, mode=dropbox.files.WriteMode.overwrite)   

get_image_url() 函数

此函数向 Dropbox 发出发布请求,以获取我们在上一步上传的图像的可共享链接。然后将结果转换为 JSON。image_url.replace('www', 'dl')以便可以下载。此步骤是必要的,否则图像会在 Dropbox Web 应用程序中打开。此处使用之前从 Dropbox 获取的访问令牌对请求进行身份验证。

def get_image_url():  
  headers = {  
    'Authorization': 'Bearer ' + access_token,  
    'Content-Type': 'application/json'  
  }  
  data = {  
    "path": "/image.jpg"  
  }  
  r = requests.post('https://api.dropboxapi.com/2/sharing/create_shared_link', headers=headers, data=json.dumps(data))  
  image_url = r.json()['url']  
  image_url = image_url.replace('www', 'dl')  
  return image_url   

predict_contents(image_url) 函数

该函数将之前获取的图片链接作为参数传入计算机视觉API。订阅密钥用于对请求进行身份验证,visualFeatures参数包含有关我们要在图像中分析哪些特征的详细信息。Vision API 应用机器学习来识别图像并返回结果。标题最好用一个句子概括图像,标签包含有关图像中有哪些特征的信息。前 8 个最有信心的标签显示在 LCD 上的标题后。

def predict_contents(image_url):  
  params   = {'visualFeatures': 'Description'}  
  data     = {'url': image_url}  
  response = requests.post(url, headers=headers, params=params, json=data)  
  response.raise_for_status()  
  image_desc = response.json()['description']['captions'][0]['text']  
  image_tags = response.json()['description']['tags']  
  display_message(image_desc)  
  time.sleep(5)  
  display_message('{}, {},'.format(image_tags[0], image_tags[1]), '{}, {},'.format(image_tags[2], image_tags[3]), '{}, {},'.format(image_tags[4], image_tags[5]), '{}, {}'.format(image_tags[6], image_tags[7]),)  
  time.sleep(10)   

我们应用程序的起点

这是我们调用main()函数并在程序停止时显示“程序停止”的地方。

try:  
  main()  
finally:  
  display_message('Program Stopped.')   

运行应用程序

最后,我们到了启动程序并享受拍照的乐趣。https://github.com/dsdilpreet/blog/blob/master/recognize-things-with-raspberry-pi-vision

从 github 下载文件,打开终端并 cd 进入下载文件所在的文件夹并运行以下命令。

python3 app.py   

带有示例图片和结果链接的原始帖子

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !