网站推广指标包括,做企业网站推广多少钱,民间it网站建设,有什么做家常菜的网站背景
基于人体/动物#xff0c;骨骼点数据#xff0c;计算关节角度
1. 原理
计算两个向量的夹角#xff0c;我们已三个点为例#xff0c;BA 向量和BC向量#xff0c;求 B 的角度。若为四个点#xff0c;延长交叉即可。
2. 效果
效果图如下 3. 核心代码
def comput…背景
基于人体/动物骨骼点数据计算关节角度
1. 原理
计算两个向量的夹角我们已三个点为例BA 向量和BC向量求 B 的角度。若为四个点延长交叉即可。
2. 效果
效果图如下 3. 核心代码
def compute_vector_angle(a, b, c):计算两个向量 ba 和 bc 向量的夹角params a , 点 aparams b , 点 bparams c , 点 c# 我这里为了好理解使用三个点数据也可以用四个点triangle_data [a, b, c]# 向量夹角ba_angle math.atan2(a[1] - b[1], a[0] - b[0]) * 180 / math.pibc_angle math.atan2(c[1] - b[1], c[0] - b[0]) * 180 / math.pib_angle 0if ba_angle * bc_angle 0:# 第1,4象限b_angle abs(ba_angle - bc_angle)else:# 第2,3象限b_angle abs(ba_angle) abs(bc_angle)if b_angle 180:b_angle 360 - b_angleprint(\nba_angle:, ba_angle, bc_angle:, bc_angle, angle:, b_angle)start_angle ba_angleend_angle bc_anglereturn start_angle, end_angle, b_angle, triangle_data
4. 可视化
图像可视化坐标和圆的坐标系如下
坐标系相反圆坐标系逆时针如图所示
5. 全部代码
实现 Python 代码可直接执行C 同理实现
#!/usr/bin/env python
# -*- encoding: utf-8 -*-
Create : 2024/01/09 15:03:33
Author : Yuan Mingzhuo
import numpy as np
import cv2
import mathdef compute_vector_angle(a, b, c):计算两个向量 ba 和 bc 向量的夹角params a , 点 aparams b , 点 bparams c , 点 c# 我这里为了好理解使用三个点数据也可以用四个点triangle_data [a, b, c]# 向量夹角ba_angle math.atan2(a[1] - b[1], a[0] - b[0]) * 180 / math.pibc_angle math.atan2(c[1] - b[1], c[0] - b[0]) * 180 / math.pib_angle 0if ba_angle * bc_angle 0:# 第1,4象限b_angle abs(ba_angle - bc_angle)else:# 第2,3象限b_angle abs(ba_angle) abs(bc_angle)if b_angle 180:b_angle 360 - b_angleprint(\nba_angle:, ba_angle, bc_angle:, bc_angle, angle:, b_angle)start_angle ba_angleend_angle bc_anglereturn start_angle, end_angle, b_angle, triangle_datadef draw_image_vector_angle(image, triangle_data, start_angle, end_angle, angle):可视化显示params image , 图params triangle_data , 向量点数据start_angle , ba 向量角度end_angle , bc 向量角度angle , ba 与 bc 向量夹角# 点point_a (int(triangle_data[0][0]), int(triangle_data[0][1]))point_b (int(triangle_data[1][0]), int(triangle_data[1][1]))point_c (int(triangle_data[2][0]), int(triangle_data[2][1]))for point in triangle_data:cv2.circle(imgimage,center(int(point[0]), int(point[1])),radius2,color(255, 255, 255),thickness1,lineTypecv2.LINE_AA,)# 线lines [(point_b, point_a), (point_b, point_c), (point_a, point_c)]for line in lines:cv2.line(imgimage,pt1line[0],pt2line[1],color(0, 0, 255),thickness1,lineTypecv2.LINE_AA,)# 弧线startAngle start_angleendAngle end_angleif start_angle * end_angle 0:angle_data abs(start_angle) abs(end_angle)if angle_data 180:# 取反弧度结束角if end_angle 0:endAngle end_angle - 360else:endAngle end_angle 360print(DRAW : , startAngle, startAngle, endAngle, endAngle)cv2.ellipse(imgimage,centerpoint_b,axes(16, 16),angle360,startAnglestartAngle,endAngleendAngle,color(255, 255, 255),thickness1,lineTypecv2.LINE_AA,)# 角 Bangle_b_point [int(((point_a[0] point_b[0] point_c[0]) / 3)),int(((point_a[1] point_b[1] point_c[1]) / 3)),]cv2.putText(imgimage,textf{int(abs(angle))},organgle_b_point,fontFacecv2.FONT_HERSHEY_SIMPLEX,fontScale0.3,color(200, 200, 200),thickness1,lineTypecv2.LINE_AA,)return imageif __name__ __main__:可视化测试# 测试点a, b, c (70, 100), (100, 150), (170, 70)# 图像image np.full((300, 300, 3), 0, dtypenp.uint8)# 计算start_angle, end_angle, angle, triangle_data compute_vector_angle(a, b, c)# 绘制image draw_image_vector_angle(imageimage,triangle_datatriangle_data,start_anglestart_angle,end_angleend_angle,angleangle,)# 显示cv2.imshow(test, image)cv2.waitKey(3000)
6. 应用
骨骼点角度计算和可视化