基于micropython和esp32cam的图像颜色识别小作品

前言

平台:thonny windows10 micropython esp32cam flask 0.96oled

芯片为ssd1306的0.96oled的micropython驱动:http://t.csdnimg.cn/T7Dn3

urequests py文件代码:http://t.csdnimg.cn/t4pbe

conwlan.py是自己封装的连接wifi库,见文中

总以分为前端和后端的代码编写

前端

注意,如果esp32cam初始化失败,需要重启;init和deinit必须配对使用才能保证下次运行程序时不出同样的错。

我觉得esp32cam的闪光灯太亮了,影响颜色判断,就选择不开启

总体逻辑是相关外设初始化连接wifi拍照将数据发给服务器打印服务器返回的数据

整体代码

from machine import Pin,SoftI2C
from conwlan import ConWLAN
import camera
import urequests as requests
import json
from oled import SSD1306# 按需要选择是否使用oled和板载闪光灯
# i2c=SoftI2C(scl=Pin(15),sda=Pin(14))
# oled=SSD1306(i2c)
# led=Pin(4,Pin.OUT)# camera初始化
try:camera.init(0,format=camera.JPEG)
except Exception as e:camera.deinit()camera.init(0,format=camera.JPEG)# 连接wifi
ConWLAN('mate60','888888889')try:# 开启闪光灯#led.on()# 拍照buf=camera.capture()# 关闭闪光灯#led.off()# 发送数据给服务器,url写自己的服务器地址response = requests.post(url="http://172.16.3.186:5000/hello",headers = {'content-type': 'image/jpeg'}, data = buf)color_name=response.json()['color']print(color_name)#oled.text(color_name,0,0)except Exception as e:print(e)
finally:camera.deinit()

 conwlan.py

import network
class ConWLAN():def __init__(self,ssid,pasw):wlan=network.WLAN(network.STA_IF)wlan.active(True)if not wlan.isconnected():wlan.connect(ssid,pasw)while not wlan.isconnected():pass

后端

后端的主要逻辑:将接收的图像以时间为名保存 (方便后期的日志记录)调用判断颜色的函数将结果返回给客户端

这里用opencv将图片转HSV再计算面积最大的颜色,然后返回颜色名。如果返回英文,可以直接使用oled.text()显示到oled中,如果返回中文,需要取模处理或使用带中文字库的固件(自行寻找)

当然也可以用神经网络进行颜色分类。

from flask import Flask, request, jsonify
import time 
import numpy as np
import cv2
import collections
app = Flask(__name__)class colorList():# 图片路径def __init__(self,path):self.path=path# 设定你要检测的颜色列表def getColorList(self):dict = collections.defaultdict(list)# 黑色lower_black = np.array([0, 0, 0])upper_black = np.array([180, 255, 46])color_list = []color_list.append(lower_black)color_list.append(upper_black)dict['黑色'] = color_list# 白色lower_white = np.array([0, 0, 221])upper_white = np.array([180, 30, 255])color_list = []color_list.append(lower_white)color_list.append(upper_white)dict['白色'] = color_list# 红色lower_red = np.array([0, 43, 46])upper_red = np.array([10, 255, 255])color_list = []color_list.append(lower_red)color_list.append(upper_red)dict['红色'] = color_list# 黄色lower_yellow = np.array([26, 43, 46])upper_yellow = np.array([34, 255, 255])color_list = []color_list.append(lower_yellow)color_list.append(upper_yellow)dict['黄色'] = color_list# 绿色lower_green = np.array([35, 43, 46])upper_green = np.array([77, 255, 255])color_list = []color_list.append(lower_green)color_list.append(upper_green)dict['绿色'] = color_list# 蓝色lower_blue = np.array([100, 43, 46])upper_blue = np.array([124, 255, 255])color_list = []color_list.append(lower_blue)color_list.append(upper_blue)dict['蓝色'] = color_list# 紫色lower_purple = np.array([125, 43, 46])upper_purple = np.array([155, 255, 255])color_list = []color_list.append(lower_purple)color_list.append(upper_purple)dict['紫色'] = color_listreturn dict# 处理图片def get_color(self):img = cv2.imread(self.path)hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)maxsum = -100color = Nonecolor_dict = colorList(self.path).getColorList()for d in color_dict:mask = cv2.inRange(hsv, color_dict[d][0], color_dict[d][1])binary = cv2.threshold(mask, 127, 255, cv2.THRESH_BINARY)[1]binary = cv2.dilate(binary, None, iterations=2)img, cnts = cv2.findContours(binary.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)sum = 0for c in img:sum += cv2.contourArea(c)if sum > maxsum:maxsum = sumcolor = dreturn color@app.route("/hello", methods=["POST"])
def process_image():imageData = request.get_data(parse_form_data=False)# 保存图片filename = time.strftime("%m%d%H%M%S", time.localtime()) + ".jpg"path = "./test_imgs/" + str(filename)with open(path,'wb') as f:f.write(imageData)# 颜色识别color_name=colorList(path).get_color()# 返回结果return jsonify({'color': color_name})if __name__ == "__main__":app.run(host='0.0.0.0',debug=True)   

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/4452.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fast-DetectGPT 无需训练的快速文本检测

本文提出了一种新的文本检测方法 ——Fast-DetectGPT,无需训练,直接使用开源小语言模型检测各种大语言模型,如GPT等生成的文本内容。 Fast-DetectGPT 将检测速度提高了 340 倍,将检测准确率相对提升了 75%,超过商用系…

leetcode58 最后一个单词的长度

给你一个字符串 s,由若干单词组成,单词前后用一些空格字符隔开。返回字符串中 最后一个 单词的长度。 单词 是指仅由字母组成、不包含任何空格字符的最大 子字符串。 示例 1: 输入:s "Hello World" 输出&#xff1…

使用yumdownloader或repotrack等工具在有网络的环境中下载所需的RPM包及其依赖项,然后将其复制到离线环境中进行安装

使用yumdownloader或repotrack等工具在有网络的环境中下载所需的RPM包及其依赖项,然后将其复制到离线环境中进行安装是一个很好的方法。以下是详细的步骤: 使用yumdownloader 安装yumdownloader: 如果系统中没有安装yumdownloader,您可以使用包管理器进行安装。例如,在基…

【中级软件设计师】上午题12-软件工程(1):软件工程模型、敏捷方法、软件需求、系统设计

上午题12-软件工程(1) 1 软件过程1.1 CMM 能力成熟度模型1.1 CMMI (建议直接看思维导图) 2 软件过程模型2.1 瀑布模型2.2 增量模型2.3 演化模型2.3.1 原型模型2.3.2 螺旋模型 2.5 喷泉模型 3 统一过程(UP)模型4 敏捷方…

【python】利用 GridSearchCV 和 SVM 进行学生成绩预测

在机器学习领域,寻找最优模型参数是一个重要的步骤,它直接影响模型的泛化能力和预测准确性。本文将通过一个具体案例介绍如何使用支持向量机(SVM)和网格搜索(GridSearchCV)来预测学生的成绩,并通…

可审批可审计追溯的单网络导出文件方案,了解一下

在物理隔离状态下,单网络导出文件是一个重要的安全需求,特别是在处理敏感数据时。在这种环境下,数据导出需要采取特殊的安全措施,以确保数据传输的安全性和合规性。需要考虑以下因素: 安全性:确保传输过程加…

筛选日志并生成序列化文件

1.在idea中创建项目 selectData. 2.添加依赖,插件包,指定打包方式,日志文件 大家可以直接从前面项目复制。 3.本次只需要进行序列化操作,所以不需要Reducer模块,编写Mapper模块 package com.maidu.selectdata;import…

Bert基础(十八)--Bert实战:NER命名实体识别

1、命名实体识别介绍 1.1 简介 命名实体识别(NER)是自然语言处理(NLP)中的一项关键技术,它的目标是从文本中识别出具有特定意义或指代性强的实体,并对这些实体进行分类。这些实体通常包括人名、地名、组织…

极简shell制作

🌎自定义简单shell制作 (ps: 文末有完整代码) 文章目录: 自定义简单shell制作 简单配置Linux文件 自定义Shell编写 命令行解释器       获取输入的命令       字符串分割       子进程进行进程替换 内建命令…

28.Gateway-网关过滤器

GatewayFilter是网关中提供的一种过滤器,可以多进入网关的请求和微服务返回的响应做处理。 GatewayFilter(当前路由过滤器,DefaultFilter) spring中提供了31种不同的路由过滤器工厂。 filters针对部分路由的过滤器。 default-filters针对所有路由的默认…

Swift - swiftc

文章目录 Swift - swiftcswiftc存放在Xcode内部一些操作 Swift - swiftc swiftc存放在Xcode内部 Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 一些操作 生成语法树: swiftc -dump-ast main.swift生成最简洁的SIL代码: swiftc…

opencv基础篇 ——(九)图像几何变换

图像几何变换是通过对图像的几何结构进行变换来改变图像的形状、大小、方向或者透视关系。常见的图像几何变换包括缩放、旋转、平移、仿射变换和透视变换等。下面对这些几何变换进行简要介绍: 矩阵的转置(transpose ): 对于图像来…

微服务之SpringCloud AlibabaNacos服务注册和配置中心

一、概述 1.1注册中心原理 在微服务远程调用的过程中,包括两个角色: 服务提供者:提供接口供其它微服务访问,比如item-service 服务消费者:调用其它微服务提供的接口,比如cart-service 在大型微服务项目…

符合医药行业规范的液氮罐运输和存储温度监测解决方案

API原料药、冻干物质和人体样本必须在玻璃相中以尽可能低的温度运输和存储。专门的低温容器——干式液氮罐——可通过液氮(LN2)将温度保持在-196 C。由于温度极低,低温容器的温度数据监测不仅具有挑战性,而且还需要更复杂的过程&a…

力扣:187. 重复的DNA序列(Java)

目录 题目描述:输入:输出:代码实现: 题目描述: DNA序列 由一系列核苷酸组成,缩写为 ‘A’, ‘C’, ‘G’ 和 ‘T’.。 例如,“ACGAATTCCG” 是一个 DNA序列 。 在研究 DNA 时,识别 D…

Linux下的常用基本指令

基本指令 前言ls 指令语法功能常用选项举例注意要点关于拼接关于 -a关于文件ls与/的联用ls与根目录ls与任意文件夹ls与常用选项与路径 ls -d与ls -ldls与ll pwd命令语法功能常用选项注意要点window与Linux文件路径的区别家目录 cd 指令语法功能举例注意要点cd路径.. .相对路径与…

Cesium116版本安装跑错,注意Node版本

SyntaxError: Unexpected token ?? at Loader.moduleStrategy (internal/modules/esm/translators.js:149:18) 无法解析ES node.js本本过低 nvm use无效NVM踩坑不完全指南,nvm use没有*_nvm use 无效-CSDN博客

决策树模型示例

通过5个条件判定一件事情是否会发生,5个条件对这件事情是否发生的影响力不同,计算每个条件对这件事情发生的影响力多大,写一个决策树模型pytorch程序,最后打印5个条件分别的影响力。 一 决策树模型是一种非参数监督学习方法,主要…

centos7 openresty lua 自适应webp和缩放图片

目录 背景效果图准备安装cwebp等命令,转换文件格式安装ImageMagick,压缩文件下载Lua API 操控ImageMagick的依赖包 代码参考 背景 缩小图片体积,提升加载速度,节省流量。 效果图 参数格式 : ?image_processformat,…

Llama-7b-Chinese本地推理

Llama-7b-Chinese 本地推理 基础环境信息(wsl2安装Ubuntu22.04 miniconda) 使用miniconda搭建环境 (base) :~$ conda create --name Llama-7b-Chinese python3.10 Channels:- defaults Platform: linux-64 Collecting package metadata (repodata.js…