当前位置: 首页 > news >正文

东莞seo建站优化费用建筑直聘网

东莞seo建站优化费用,建筑直聘网,山西省吕梁市有哪些县,网站抬头怎么做一、项目目标 追踪人手大拇指指尖#xff1a; 当人手移动时#xff0c;摄像头通过控制两个伺服电机#xff08;分别是偏航和俯仰#xff09;把大拇指指尖放到视界的中心位置#xff0c;本文采用了PID控制伺服电机 Mediapipe Hand简介 MediaPipe 手部标志任务可检测图像…一、项目目标 追踪人手大拇指指尖 当人手移动时摄像头通过控制两个伺服电机分别是偏航和俯仰把大拇指指尖放到视界的中心位置本文采用了PID控制伺服电机 Mediapipe Hand简介 MediaPipe 手部标志任务可检测图像中手部的标志。 您可以使用此任务来定位手的关键点并在其上渲染视觉效果。 该任务使用机器学习ML模型作为静态数据或连续流对图像数据进行操作并输出图像坐标中的手部标志、世界坐标中的手部标志以及多个检测到的手的惯用手左/右手。 二、 需要准备的软、硬件 Raspiberry Pi 4b两个SG90 180度舵机注意舵机的角度最好是180度且带限位的切勿选360度舵机二自由度舵机云台如下图Raspiberry CSI 摄像头mediapipe库, 安装方法可以参照此链接 组装后的效果 三、具体步骤 创建“hand_tracking_PID.py”文件代码如下我在本文中追踪的是大拇指指尖如果你想追踪其它部位只须将fingerID参数设置成你想追踪的数字即可。具体数字分布如下图。 #-*- coding: UTF-8 -*- # 调用必需库 #hand_tracking_PID.py from multiprocessing import Manager from multiprocessing import Process from handobj import HandObj from pid import PID from servo import Servo import signal import time import sys import cv2 import mediapipe as mp from picamera2 import Picamera2# 定义舵机 panServo(pin19) tiltServo(pin16)#定义图像尺寸 dispW1280 dispH720# 定义手指ID fingerID4# 键盘终止函数 def signal_handler(sig, frame):# 输出状态信息print([INFO] You pressed ctrl c! Exiting...)# 关闭舵机pan.stop()tilt.stop()# 退出sys.exit()def hand_obj(objX,objY,centerX,centerY):# ctrlc退出进程signal.signal(signal.SIGINT, signal_handler)# 启动视频流并缓冲print([INFO] waiting for camera to warm up...)cv2.startWindowThread()picam2 Picamera2()preview_config picam2.create_preview_configuration(main{size: (dispW, dispH),format:RGB888})picam2.configure(preview_config)picam2.start()time.sleep(2.0)#初始化手掌对象探测器handHandObj(fingerID)#进入循环while True:# 从视频流抓取图像并旋转frame picam2.capture_array()frame cv2.flip(frame, 1)# 找到图像中心(H, W) frame.shape[:2]centerX.value W // 2centerY.value H // 2# 画出图像中心点cv2.circle(frame, (centerX.value, centerY.value), 5, (0, 0, 255), -1)# 找到手指对象点objectLoc hand.update(frame, (centerX.value, centerY.value))((objX.value, objY.value), handlms) objectLoc# 画出手指关注的对象点这是里前面定义的ID:4,即大拇指指尖if handlms is not None: cv2.circle(frame, (objX.value, objY.value), 15, (255, 0, 255), cv2.FILLED)cv2.imshow(Hand, frame)cv2.waitKey(1)def pid_process(output, p, i, d, objCoord, centerCoord):# ctrlc退出进程signal.signal(signal.SIGINT, signal_handler)# 创建一个PID类的对象并初始化p PID(p.value, i.value, d.value)p.initialize()# 进入循环while True:# 计算误差error centerCoord.value - objCoord.value# 更新输出值,当error小于50时误差设为0以避免云台不停运行。if abs(error) 50:error 0output.value p.update(error)def set_servos(panAngle, tiltAngle):# ctrlc退出进程signal.signal(signal.SIGINT, signal_handler)#进入循环while True:# 偏角变号yaw -1 * panAngle.valuepitch -1 * tiltAngle.value# 设置舵机角度。pan.set_angle(yaw)tilt.set_angle(pitch)# 启动主程序 if __name__ __main__:# 启动多进程变量管理with Manager() as manager: # 相当于managerManager(),with as 语句操作上下文管理器context manager它能够帮助我们自动分配并且释放资源。# 舵机角度置零pan.set_angle(0)tilt.set_angle(0)# 为图像中心坐标赋初值centerX manager.Value(i, 0) # i即为整型integercenterY manager.Value(i, 0)# 为人脸中心坐标赋初值objX manager.Value(i, 0)objY manager.Value(i, 0)# panAngle和tiltAngle分别是两个舵机的PID控制输出量panAngle manager.Value(i, 0)tiltAngle manager.Value(i, 0)# 设置一级舵机的PID参数panP manager.Value(f, 0.015) # f即为浮点型floatpanI manager.Value(f, 0.01)panD manager.Value(f, 0.0008)# 设置二级舵机的PID参数tiltP manager.Value(f, 0.025)tiltI manager.Value(f, 0.01)tiltD manager.Value(f, 0.008)# 创建4个独立进程# 1. objectCenter - 探测人脸# 2. panning - 对一级舵机进行PID控制控制偏航角# 3. tilting - 对二级舵机进行PID控制控制俯仰角# 4. setServos - 根据PID控制的输出驱动舵机processObjectCenter Process(targethand_obj, args(objX, objY, centerX, centerY))processPanning Process(targetpid_process, args(panAngle, panP, panI, panD, objX, centerX))processTilting Process(targetpid_process, args(tiltAngle, tiltP, tiltI, tiltD, objY, centerY))processSetServos Process(targetset_servos, args(panAngle, tiltAngle))# 开启4个进程processObjectCenter.start()processPanning.start()processTilting.start()processSetServos.start()# 添加4个进程processObjectCenter.join()processPanning.join()processTilting.join()processSetServos.join() 创建“handobj.py”代码如下 #handobj.py #-*- coding: UTF-8 -*- # 调用必需库 import mediapipe as mpclass HandObj:def __init__(self,fingerID):# 初始化手掌关键点坐标self.myHandsmp.solutions.hands# 初始化手掌关键点坐标和手掌关键点连接情况self.handsself.myHands.Hands()# 初始化手掌关键点绘制库self.mpDrawmp.solutions.drawing_utils# 初始化手掌关键点IDself.fingerIDfingerIDdef update(self, frame, frameCenter):# 处理视频流results self.hands.process(frame)if results.multi_hand_landmarks:for handLms in results.multi_hand_landmarks:# 绘制手掌关键点self.mpDraw.draw_landmarks(frame, handLms, self.myHands.HAND_CONNECTIONS)for id, lm in enumerate(handLms.landmark):h, w, c frame.shapecx, cy int(lm.x * w), int(lm.y * h)if id self.fingerID:#绘制手掌关键点并返回手掌关键点坐标return ((cx, cy), handLms)return(frameCenter,None) 创建“pid.py”代码如下 #-*- coding: UTF-8 -*- # 调用必需库 import timeclass PID:def __init__(self, kP1, kI0, kD0):# 初始化参数self.kP kPself.kI kIself.kD kDdef initialize(self):# 初始化当前时间和上一次计算的时间self.currTime time.time()self.prevTime self.currTime# 初始化上一次计算的误差self.prevError 0# 初始化误差的比例值积分值和微分值self.cP 0self.cI 0self.cD 0def update(self, error, sleep0.5):# 暂停time.sleep(sleep)# 获取当前时间并计算时间差self.currTime time.time()deltaTime self.currTime - self.prevTime# 计算误差的微分deltaError error - self.prevError# 比例项self.cP error# 积分项self.cI error * deltaTime# 微分项self.cD (deltaError / deltaTime) if deltaTime 0 else 0# 保存时间和误差为下次更新做准备self.prevTime self.currTimeself.prevError error# 返回输出值return sum([self.kP * self.cP,self.kI * self.cI,self.kD * self.cD])上述代码中的from servo import Servo导入servo这个库是没有的我们要手动创建这个库在object_tracking.py所在的目录下新建servo.py文件复制下面的代码到文件中 #!/usr/bin/env python3 import pigpio from time import sleep # Start the pigpiod daemon import subprocess result None status 1 for x in range(3):p subprocess.Popen(sudo pigpiod, shellTrue, stdoutsubprocess.PIPE, stderrsubprocess.STDOUT)result p.stdout.read().decode(utf-8)status p.poll()if status 0:breaksleep(0.2) if status ! 0:print(status, result)Use the DMA PWM of the pigpio library to drive the servoMap the servo angle (0 ~ 180 degree) to (-90 ~ 90 degree)class Servo():MAX_PW 1250 # 0.5/20*100MIN_PW 250 # 2.5/20*100_freq 50 # 50 Hz, 20msdef __init__(self, pin, min_angle-90, max_angle90):self.pi pigpio.pi()self.pin pin self.pi.set_PWM_frequency(self.pin, self._freq)self.pi.set_PWM_range(self.pin, 10000) self.angle 0self.max_angle max_angleself.min_angle min_angleself.pi.set_PWM_dutycycle(self.pin, 0)def set_angle(self, angle):if angle self.max_angle:angle self.max_angleelif angle self.min_angle:angle self.min_angleself.angle angleduty self.map(angle, -90, 90, 250, 1250)self.pi.set_PWM_dutycycle(self.pin, duty)def get_angle(self):return self.angledef stop(self):self.pi.set_PWM_dutycycle(self.pin, 0)self.pi.stop()# will be called automatically when the object is deleted# def __del__(self):# passdef map(self, x, in_min, in_max, out_min, out_max):return (x - in_min) * (out_max - out_min) / (in_max - in_min) out_minif __name__ __main__:from vilib import Vilib# Vilib.camera_start(vflipTrue,hflipTrue) # Vilib.display(localTrue,webTrue)pan Servo(pin13, max_angle90, min_angle-90)tilt Servo(pin12, max_angle30, min_angle-90)panAngle 0tiltAngle 0pan.set_angle(panAngle)tilt.set_angle(tiltAngle)sleep(1)while True:for angle in range(0, 90, 1):pan.set_angle(angle)tilt.set_angle(angle)sleep(.01)sleep(.5)for angle in range(90, -90, -1):pan.set_angle(angle)tilt.set_angle(angle)sleep(.01)sleep(.5)for angle in range(-90, 0, 1):pan.set_angle(angle)tilt.set_angle(angle)sleep(.01)sleep(.5) 运行效果如下图如果不想在运行过程中显示网格与关注的手指节点可以把相应的代码注释掉
http://www.hkea.cn/news/14460415/

相关文章:

  • 合肥网站建设网站推广津学院金华手机建站模板
  • 网站可能存在什么问题吗直播app开发要多少钱
  • 班级网站怎么做ppt公司起名字大全免费查询
  • 上海徐家汇网站建设网络工程师需要什么证书
  • 医院网站建设标书2023年舆情分析报告
  • 郑州电力高等专科学校就业去向如何进行网站性能优化?
  • 做网站宣传图片淘宝店铺800一个收购
  • php网站开发图片网络营销策划的方法
  • 盐城网站建设制作深圳做网站哪家
  • 电商网站设计特点山东恒正建设有限公司 网站
  • 中国书画画廊网站模板亚马逊中国网站建设目标
  • 如何自己弄一个网站海宁网站怎么做seo
  • 泉州市建设系统培训中心网站洛阳网络建站
  • 庄行网站建设网站做排名有用吗
  • 浙江网站建设服务公司wordpress 字母标签页
  • 鹤岗建设局网站做技术网站赚钱
  • 网站做推广网站建设专题的意义
  • 网站建设合同属于什么税目网站定制开发
  • 网站维护入门教程知果果网站谁做的
  • go 语言 做网站vs2012 网站开发
  • 做网站平方根怎么表示中电云主机怎样登入创建的网站
  • 使用wordpress的用户有哪些小米企业网站的优化建议
  • 去视频网站做编辑php免费源码网站
  • 哪些网站是单页面网站制作公司昆明
  • 中国新闻社官方网站湖南建设资质申请网站
  • 商城网站开发技术企业管理者培训查询
  • 武安专业做网站清远市建设工程造价信息网站
  • 网站登录密码怎么取消保存wordpress淘点金组件
  • 福建富通建设有限公司网站html网页制作代码范例
  • 网站集约化建设意见和建议付费网站建设模板