手势识别rtos小车(2)----蓝牙通信

在pycharm下面安装pybluez库

本人:win11+python3.8+pybluez2

第一步,直接在pycharm终端运行

pip install pybluez

一般都会直接报错

第二步,下载安装win11的SDK文件,Windows SDK - Windows 应用开发 | Microsoft Developer

 

 第三步,到pyblue官网,下载对应的版本

官方地址:GitHub - pybluez/pybluez: Bluetooth Python extension module
直接下载zip文件包,然后解压在自己的python解释器环境中,然后在pycharm终端打开进入到这个文件夹目录,执行

python setup.py install

 

 但是会遇到报错

error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/

这篇文章很好的解决了这个问题:Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools"的解决办法 - 知乎

然后运行

env -list

 

 就安装成功了

除此之外,我发现我安装之后,确实有了pybluez,但是无法找到库,我又安装了pybluez2【支持python3.x版本】,才可以 

首先找到你蓝牙的地址,以及你的端口号

#!/usr/bin/env python
# --*--coding=utf-8--*--
# pip install pybluezimport time
from bluetooth import *#列表,用于存放已搜索过的蓝牙名称
alreadyFound = []#搜索蓝牙
def findDevs():foundDevs = discover_devices(lookup_names=True)# 循环遍历,如果在列表中存在的就不打印for (addr,name) in foundDevs:if addr not in alreadyFound:print("[*]蓝牙设备:" + str(name))print("[+]蓝牙MAC:" + str(addr))# 新增的设备mac地址定到列表中,用于循环搜索时过滤已打印的设备alreadyFound.append(addr)# 循环执行,每5秒执行一次
while True:findDevs()time.sleep(1)

 找到你的蓝牙地址和端口号,借助sock.connect连接在一起。

import bluetooth
import time
bd_addr = "00:20:04:00:DB:02" #蓝牙的地址
port = 13
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((bd_addr, port))
sock.send('1')

 完整代码:

sock.send :是将信息发送到已连接的蓝牙设备上面,所以会直接将信息发送到蓝牙的串口上

# -*-coding:utf-8-*-import cv2
import mediapipe as mp
import time
import math
import bluetooth
cap = cv2.VideoCapture(0)
# 该函数的参数
# static_image_mode,max_num_hands,min_detection_confidence,min_tracking_confidence
mpHands = mp.solutions.hands
hands = mpHands.Hands()
mpDraw = mp.solutions.drawing_utils
pTime = 0#开始时间初始化
cTime = 0#目前时间初始化
xs = []
ys = []
ks = []
bd_addr = "你的蓝牙地址"  # 蓝牙的地址
port = 13     # 端口号
sock = bluetooth.BluetoothSocket(bluetooth.RFCOMM)
sock.connect((bd_addr, port))# 发送信息到串口
def send_Serial(num):sock.send(str(num))sock.send('\r\n')
# 大小为21的数组初始化
for i in range(0,21):xs.append(0)ys.append(0)
for i in range(0,4):ks.append(0)
# 计算两点间的距离
def point_distance(x1, y1, x2, y2 ):dis = abs(math.sqrt((x2 - x1)*(x2 - x1)+(y2 - y1)*(y2 - y1)))return dis
def K_count():k=5i=0while(k<20):aveX1 = (xs[k] + xs[k+1] + xs[k+2] + xs[k+3]) / 4aveY1 = (ys[k] + ys[k+1] + ys[k+2] + ys[k+3]) / 4t = (xs[k] * xs[k] + xs[k+1] * xs[k+1] + xs[k+2] * xs[k+2] + xs[k+3] * xs[k+3] - 4 * aveX1 * aveX1)if(abs (t - 0) < 0.000001):t += 0.000001if aveX1 != 0 and aveY1 != 0:k1 = (xs[k] * ys[k] + xs[k+1] * ys[k+1] + xs[k+2] * ys[k+2] + xs[k+3] * ys[k+3] - 4 * aveX1 * aveY1) /telse:k1 = 0ks[i] = k1i += 1k += 4avek = sum(ks)/4#print(avek)ks0 = abs(ks[0] - avek)ks1 = abs(ks[1] - avek)ks2 = abs(ks[2] - avek)ks3 = abs(ks[3] - avek)#ks0 = (ks[0] - avek)#ks1 = (ks[1] - avek)#ks2 = (ks[2] - avek)#ks3 = (ks[3] - avek)print(ks[1])dis = point_distance(xs[4], ys[4], xs[8], ys[8])if (ks0+ks1+ks2+ks3) < 3.5 and dis > 100 and abs(ks[1]) > 3:print("前进")send_Serial(1)elif (ks0+ks1+ks2+ks3) < 3.5 and dis > 100 and -1 < ks[1] < 0:print("左转")send_Serial(2)elif (ks0 + ks1 + ks2 + ks3) < 3.5 and dis > 100 and 0 < ks[1] < 1:print("右转")send_Serial(3)elif dis < 100:print("停止")send_Serial(4)
while True:count = 0success, img = cap.read()#BGR存储格式imgRGB = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)#转为RGB存储#处理返回的手的标志点以及处理results = hands.process(imgRGB)if results.multi_hand_landmarks:#返回none或手的标志点坐标for handLms in results.multi_hand_landmarks:#id是索引,lm是x,y坐标for id, lm in enumerate(handLms.landmark):h, w, c = img.shapecx, cy = int(lm.x*w), int(lm.y*h)# print(id, cx, cy)xs[id] = cxys[id] = cycv2.circle(img, (cx, cy), 5, (0, 255, 105), cv2.FILLED)cv2.putText(img, str(int(id)), (cx, cy), cv2.FONT_HERSHEY_PLAIN, 2,(200, 20, 50), 3)K_count()mpDraw.draw_landmarks(img, handLms, mpHands.HAND_CONNECTIONS)cTime = time.time()fps = 1 / (cTime - pTime)pTime = cTimecv2.putText(img, str(int(fps)), (10, 70), cv2.FONT_HERSHEY_PLAIN, 3,(255, 0, 255), 1)cv2.imshow("Image", img)k = cv2.waitKey(1)if k == 27:cap.release()cv2.destroyAllWindows()exit()

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

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

相关文章

IT运维:使用数据分析平台监控PowerStore存储

概述 存储在企业中一直承担着重要的角色&#xff0c;保证数据的安全性更是重中之重。存储的运行是否正常&#xff1f;我们的数据是否安全&#xff1f;存储管理人员的操作是否规范&#xff1f;这些都是企业需要关注的问题。那么该如何确保这些问题能够有效的解决&#xff1f;我们…

Maven进阶1 -- 分模块开发、依赖管理、聚合与继承、属性、版本管理、多环境开发、跳过测试

目录 1.分模块开发 将原始模块按照功能拆分成若干个子模块&#xff0c;方便模块间的相互调用&#xff0c;接口共享。 案例&#xff1a;拆分一下这个SSM整合案例 ①创建maven模块 demo项目下的pom.xml文件&#xff08;主要看一下依赖&#xff09; <dependencies><!…

《雷达像智能识别对抗研究进展》阅读记录

&#xff08;1&#xff09;引言 ​ 神经网络通常存在鲁棒性缺陷&#xff0c;易受到对抗攻击的威胁。攻击者可以隐蔽的诱导雷达智能目标识别做出错误预测&#xff0c;如&#xff1a; ​ a图是自行车&#xff0c;加上对抗扰动后神经网络就会将其识别为挖掘机。 &#xff08;2&a…

Linux 文件编辑命令

一、三种模式介绍 命令模式 插入模式(编辑模式) 末行模式 二、模式切换 1.命令模式切换到插入模式 &#xff08;1&#xff09; a //进入到当前光标后开始编辑 &#xff08;2&#xff09; A //进入到当前光标所在行的行末开始编辑 &#xff08;3&#xff09;i //进入当前光…

【Java】一只小菜坤的编程题之旅【3】

文章目录 1丶判定是否互为字符重排2、杨辉三角3丶某公司的1个面试题&#xff08;字符串包含问题&#xff09; 1丶判定是否互为字符重排 这个题我们用一个非常简单的思想就能实现&#xff0c;我们先将字符串转换为字符数组&#xff0c;然后对字符数组进行排序&#xff0c;然后再…

数据结构:栈的实现(C实现)

个人主页 &#xff1a; 个人主页 个人专栏 &#xff1a; 《数据结构》 《C语言》 文章目录 前言一、栈的实现思路1. 结构的定义2. 初始化栈(StackInit)3. 入栈(StackPush)4. 出栈(StackPop)5. 获取栈顶元素(StackTop)6. 检查栈是否为空(StackEmpty)7. 销毁栈(StackDestroy) 二、…

VUE3组件

组件基础 {#components-basics} 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行单独的思考。在实际应用中&#xff0c;组件常常被组织成层层嵌套的树状结构&#xff1a; 这和我们嵌套 HTML 元素的方式类似&#xff0c;Vue 实现了自己的组件…

webpack 热更新的实现原理

webpack 的热更新⼜称热替换&#xff08;Hot Module Replacement&#xff09;&#xff0c;缩写为HMR。这个机制可以做到不⽤刷新浏览器⽽将新变更的模块替换掉旧的模块。 原理&#xff1a; ⾸先要知道 server 端和 client 端都做了处理⼯作&#xff1a; 在 webpack 的 watch…

BANI时代下的项目管理:如何迎接挑战与机遇

BANI时代的介绍与特点 BANI时代的起源 BANI这个概念首次被提出是为了描述和理解我们所处的复杂、多变、不确定的时代。与VUCA&#xff08;Volatile, Uncertain, Complex, Ambiguous&#xff09;相比&#xff0c;BANI更加准确地捕捉了我们面临的现实挑战。VUCA重点关注外部环境…

学习篇之React Fiber概念及原理

什么是React Fibber&#xff1f; React Fiber 是 React 框架的一种底层架构&#xff0c;为了改进 React 的渲染引擎&#xff0c;使其更加高效、灵活和可扩展。 传统上&#xff0c;React 使用一种称为堆栈调和递归算法来处理虚拟 DOM 的更新&#xff0c;这种方法在大型应用或者…

macOS使用ffmpeg与QT进行音视频推拉流

1.先启动流服务器 ./mediamtx 2.开始推流: ffmpeg -re -stream_loop -1 -i /Users/hackerx/Desktop/test.mp4 -c copy -rtsp_transport tcp -f rtsp rtsp://127.0.0.1:8554/stream 3. 安装ffmpeg 4.4 brew install ffmpeg4 4.添加ffmpeg头文件目录与库目录 5.链接ffmpeg相关库…

使用QT纯代码创建(查找)对话框详细步骤与代码

一、创建项目文件 打开Qt Creator->文件->新建文件或项目->选择Qt Widgets Application 为项目起名字 输入类的名字 二、 了解每个文件的作用 项目创建完毕之后就会出现以下几个文件&#xff0c;先来分别介绍以下这些文件的作用。 Headers->finddialog.h——很显…