yolov5测量身高思路

大概思路

​ 我们可以想象一下如果我们利用相同像素的相机进行数据采集,那么我们站在距离摄像机固定远的位置我们所占的像素大小也是基本不变的。

​ 利用这个规律我们可以知道一个人在图像中所占像素大小,并根据所占像素大小来计算这个人的身高。

代码实现

我们首先需要读取摄像头

1
2
3
4
5
6
camera = cv2.VideoCapture(0)  # 读取摄像头,0代表手提电脑自带的摄像头,若改成1,2,3...则可以调用其他摄像头
while True:
k = cv2.waitKey(1)
ret, img0 = camera.read() # 读取当前帧,为图片
cv2.namedWindow('camera')
cv2.imshow('camera', img0)

定义一个测量身高的函数,并测量标准值(需要你站在里摄像头正前方1米处测量自己纵向占多少像素,再用你的身高除以这个像素大小,就可以得到标准值)

1
2
3
4
5
6
7
8
def height_detect(xywh_list, height):
# 将识别到的中心点坐标传入
_, _, _, h = xywh_list[0]
std = '' #你站在里摄像头正前方1米处测量自己纵向占多少像素,再用你的身高除以这个像素大小
# 去归一化
h *= height # height为摄像机获取图像的y轴像素大小
h *= std #std为标准值
return h

然后我们调用yolov5的检测函数进行图像检测,详见[重构yolov5-6-0-detect-py进行目标检测](重构yolov5-6.0 detect.py进行目标检测 | 后花园 (pipi0960.github.io))

最后利用main函数将程序连通起来

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
model, device, half, stride, names, imgsz = get_model()
camera = cv2.VideoCapture(0)

while True:
ret, img0 = camera.read()
if ret:
img0 = np.array(img0)
img0 = cv2.cvtColor(img0, cv2.COLOR_BGRA2BGR)
img, xywh_list = out_img(img0, model, device, half, stride, names, imgsz)
if xywh_list:
print(height_detect(xywh_list, 相机y轴总像素大小))
cv2.imshow('camera', img)
img = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR)
# 展示检测结果
cv2.imshow('窗口名称', img)
# 不加waitKey会卡死
k = cv2.waitKey(1)
# 如果检测到esc建,结束程序
if k % 256 == 27:
exit('程序已结束')

效果展示

37c112e8e9f3933368783990ed122f4