esp32与python-opencv的联动(micropython固件)

这篇具有很好参考价值的文章主要介绍了esp32与python-opencv的联动(micropython固件)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

开发环境:Thonny,python

硬件要求:esp32cam

实现思路:

        将esp32cam拍摄的图片通过网络协议传到电脑进行处理

下位机代码:

import camera
import socket
import network
import camera
import time

SSID='XXX'#输入wifi名字
password='XXX'#输入WIFI密码
IP='192.168.1.34'#换成自己的IPv4地址
port=9090

#连接wifi
wlan = network.WLAN(network.STA_IF)
wlan.active(True)
if not wlan.isconnected():
    print('connecting to network...')
    wlan.connect(SSID,password)
    while not wlan.isconnected():
        pass
print('网络配置:', wlan.ifconfig())
camera.init(0,format=3)
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
i=0
while 1:
    i=i+1
    buf = camera.capture() # 获取图像数据
    s.sendto(buf,(IP,port)) # 向服务器发送图像数据
    time.sleep(0.15)
    print(i,buf)

原理很简单,传输的途径是UDP,一开始是有想过用串口或TCP,但是串口就剩UART0,用不了,TCP与UDP相比,UDP更快,因此采用UDP。

上位机代码:

import socket
import cv2
import io
from PIL import Image
import numpy as np
import mediapipe as mp
import math

IP="192.168.1.34" #换成自己的IPv4地址
port=9090


def vector_2d_angle(v1,v2):
    '''
        求解二维向量的角度
    '''
    v1_x=v1[0]
    v1_y=v1[1]
    v2_x=v2[0]
    v2_y=v2[1]
    try:
        angle_= math.degrees(math.acos((v1_x*v2_x+v1_y*v2_y)/(((v1_x**2+v1_y**2)**0.5)*((v2_x**2+v2_y**2)**0.5))))
    except:
        angle_ =65535.
    if angle_ > 180.:
        angle_ = 65535.
    return angle_
def hand_angle(hand_):
    '''
        获取对应手相关向量的二维角度,根据角度确定手势
    '''
    angle_list = []
    #---------------------------- thumb 大拇指角度
    angle_ = vector_2d_angle(
        ((int(hand_[0][0])- int(hand_[2][0])),(int(hand_[0][1])-int(hand_[2][1]))),
        ((int(hand_[3][0])- int(hand_[4][0])),(int(hand_[3][1])- int(hand_[4][1])))
        )
    angle_list.append(angle_)
    #---------------------------- index 食指角度
    angle_ = vector_2d_angle(
        ((int(hand_[0][0])-int(hand_[6][0])),(int(hand_[0][1])- int(hand_[6][1]))),
        ((int(hand_[7][0])- int(hand_[8][0])),(int(hand_[7][1])- int(hand_[8][1])))
        )
    angle_list.append(angle_)
    #---------------------------- middle 中指角度
    angle_ = vector_2d_angle(
        ((int(hand_[0][0])- int(hand_[10][0])),(int(hand_[0][1])- int(hand_[10][1]))),
        ((int(hand_[11][0])- int(hand_[12][0])),(int(hand_[11][1])- int(hand_[12][1])))
        )
    angle_list.append(angle_)
    #---------------------------- ring 无名指角度
    angle_ = vector_2d_angle(
        ((int(hand_[0][0])- int(hand_[14][0])),(int(hand_[0][1])- int(hand_[14][1]))),
        ((int(hand_[15][0])- int(hand_[16][0])),(int(hand_[15][1])- int(hand_[16][1])))
        )
    angle_list.append(angle_)
    #---------------------------- pink 小拇指角度
    angle_ = vector_2d_angle(
        ((int(hand_[0][0])- int(hand_[18][0])),(int(hand_[0][1])- int(hand_[18][1]))),
        ((int(hand_[19][0])- int(hand_[20][0])),(int(hand_[19][1])- int(hand_[20][1])))
        )
    angle_list.append(angle_)
    return angle_list

def h_gesture(angle_list):
    thr_angle = 65.
    thr_angle_thumb = 53.
    thr_angle_s = 49.
    gesture_str = None
    if 65535. not in angle_list:
         if (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]>thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):
              gesture_str = "one"
         elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]>thr_angle) and (angle_list[4]>thr_angle):
             gesture_str = "two"
         elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle) and (angle_list[4]>thr_angle):
             gesture_str = "three"
         elif (angle_list[0]>thr_angle_thumb)  and (angle_list[1]<thr_angle_s) and (angle_list[2]<thr_angle_s) and (angle_list[3]<thr_angle) and (angle_list[4]<thr_angle):
             gesture_str = "four"
         elif (angle_list[0] < thr_angle_s) and (angle_list[1] < thr_angle_s) and (angle_list[2] < thr_angle_s) and (angle_list[3] < thr_angle_s) and (angle_list[4] < thr_angle_s):
             gesture_str = "five"
    return gesture_str
mp_drawing = mp.solutions.drawing_utils
mp_hands = mp.solutions.hands
hands = mp_hands.Hands(
        static_image_mode=False,
        max_num_hands=1,
        min_detection_confidence=0.5,
        min_tracking_confidence=0.5)
print("开始")
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM,0)
s.bind((IP,port))
a=0
while True:
    data,IP = s.recvfrom(100000)
    a=a+1
    print(a,IP)
    bytes_stream = io.BytesIO(data)
    image = Image.open(bytes_stream)
    img = np.asarray(image)
    img = cv2.cvtColor(img, cv2.COLOR_RGB2BGR)
    # BiCubic_small = cv2.resize(img, (int(img.shape[1] * 0.5), int(img.shape[0] * 0.5)), interpolation=cv2.INTER_CUBIC)
    # img = cv2.resize(BiCubic_small, (600, 400), interpolation=cv2.INTER_CUBIC)
    results = hands.process(img)
    if results.multi_hand_landmarks:
        for hand_landmarks in results.multi_hand_landmarks:
            mp_drawing.draw_landmarks(img, hand_landmarks, mp_hands.HAND_CONNECTIONS)
            hand_local = []
            for i in range(21):
                x = hand_landmarks.landmark[i].x * img.shape[1]
                y = hand_landmarks.landmark[i].y * img.shape[0]
                hand_local.append((x, y))
            if hand_local:
                angle_list = hand_angle(hand_local)
                gesture_str = h_gesture(angle_list)
                cv2.putText(img, gesture_str, (0, 100), 0, 1.3, (0, 0, 255), 3)
    cv2.imshow('MediaPipe Hands', img)
    if cv2.waitKey(1)==ord("q"):
        break

 成品效果如下,图片发送速率和丢失率都是能接受的,毕竟30几块的模块,目前做了一个手部关键点的检测和人体关节的检测,有了这个成功的先例,接下来就搞物品分类。 

micropython opencv,python,opencv,开发语言

欧!!!!!还有一个重点是接一个天线会好很多

micropython opencv,python,opencv,开发语言

 文章来源地址https://www.toymoban.com/news/detail-614535.html

到了这里,关于esp32与python-opencv的联动(micropython固件)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • ESP32环境搭建(Thonny+MicroPython+ESP32)

    硬件:ESP32 解释器:MicroPython(一种针对于硬件做了特殊处理的Python解释器) IDE:Thonny(类似于pycharm这个也是个IDE,它对ESP32支持更好,所以选择它) ESP32引脚图如下: 下载地址:https://thonny.org/ 也可在以下链接进行下载,包括了Thonny、MicroPython固件和ESP32驱动安装包。 ESP3

    2024年02月10日
    浏览(49)
  • ESP32-S3 >>> MicroPython 编程初探

      今天买了一个ESP32-S3,打算试试在这上面进行MicroPython的编程(附资料网址)。   首先为了在ESP32上进行mp的编程,需要对其重新烧录固件。这就需要我们电脑安装好CH343驱动,然后找到适用于ESP32-S3的固件,利用flash下载工具将其下载到板子中。总结一下就是两个步骤:

    2023年04月20日
    浏览(45)
  • MicroPython开发esp32入门笔记--串口篇

    串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。串行接口 (Serial Interface)是指数据一位一位地顺序传送。其特点是通信线路简单,只要一对传输线就可以实现双向通信(可以直接利用电话线作为传输线),从而大

    2024年02月05日
    浏览(52)
  • MicroPython开发ESP32入门笔记 -- 蓝牙篇

    博主之前学习了用C语言去开发了51单片机,虽然没有将各种外设和传感器都玩遍,但博主基本将一些重要的外设和传感器通过原理学习加小项目实验的方式比较深入地玩了一下。众所周知,51单片机是相对底层的,用来开发一些大项目的效率会比较低,所以我们很有必要学习

    2023年04月19日
    浏览(53)
  • ESP32(MicroPython) 编码器电机闭环控制

    本人最近查找资料时,发现ESP32上的使用MicroPython的编码器电机相关程序较少,闭环控制程序都是Pyboard上的,与ESP32不完全兼容。本人通过micropython编程 esp32+drv8833+霍尔编码器_micropython 编码器_青右的博客-CSDN博客 上的程序读取编码器计数,然后另写了控制程序,有两个版本。

    2024年02月16日
    浏览(42)
  • ESP32(MicroPython) 网页控制环形WS2812

    ESP32(MicroPython)网页控制环形WS2812 本程序用于提供网页控制环形WS2812,为了不影响网页正常运行,本程序取消了流水灯形式,改为每个灯或每2个灯或每4个灯取随机亮度,延时和亮度可调。主控换成ESP32C3,感觉网页流畅度比ESP32-EROOM32低一些。 程序如下

    2024年02月15日
    浏览(44)
  • 1、Thonny+MicroPython+ESP32开发环境搭建

    1.1 ESP32 大白话来说:ESP32就是一个开发板,上面有芯片以及用到的其它硬件 1.2 ESP32运行程序? 只要是硬件电路(数字电路)那么就可以通过编程的方式对其进行控制 那么这个开发板能认识什么样的程序呢? python ? C ? C++ ? Java ?。。。。 答:只认识二进制的 0 和 1 ,即

    2024年02月14日
    浏览(49)
  • ESP32 Micropython编程(Thonny)01----环境搭建&点灯

    本人持续分享更多关于嵌入式和单片机的知识,如果大家喜欢,别忘点个赞加个关注哦,让我们一起共同进步~ ok,接下来我们就进入Micropython的学习吧(因为我是一边学习一边记录,因此肯定会出现一些错误,欢迎大家指正,大家一起学习进步) 下载地址:Thonny 选择对应版

    2024年02月02日
    浏览(38)
  • ESP32(MicroPython) 四足机器人(五)功能补充

    本次更新增加了前后倾斜(每次动作交换前部和后部高度)、蹲起与抬脚动作,均位于用于连续执行动作的function函数中,但实测抬脚动作需要先启动function函数的另一项功能才能正常开启,代码检查无误,应该是MicroPython固件的bug。另外,对于判断功能,增加了elif语句的使用

    2024年02月15日
    浏览(45)
  • ESP32(MicroPython) 矩阵键盘电子琴+RGB灯

     本程序相比上一个矩阵键盘电子琴程序增加了一个矩阵键盘,并把三个矩阵键盘的同一行相连,扫描周期缩短到40ms。增加RGB灯带,每个周期刷新一个灯(随机颜色)。 代码如下 #导入Pin模块 from machine import Pin import time from machine import PWM from neopixel import NeoPixel import random #扬声

    2024年02月09日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包