You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

182 lines
4.1 KiB
Python

import os
import cv2
def get_path_list(file):
retutn_list = []
if os.path.isdir(file):
video_ext = [".mp4", ".avi",".MP4",'.jpg']
for maindir, subdir, file_name_list in os.walk(file):
for filename in file_name_list:
apath = os.path.join(maindir, filename)
ext = os.path.splitext(apath)[1]
if ext in video_ext:
retutn_list.append(apath)
else:
retutn_list.append(file)
return retutn_list
# 获得字典中所有values值这个值是列表)
def get_dict_values(lst):
"""
获取列表中所有字典的 values 如果值是列表
参数:
lst: 包含字典的列表
返回值:
values: 包含所有字典的 values 值的列表如果值是列表
"""
return [value for dictionary in lst for value in dictionary.values() if isinstance(value, list)]
# 解析检测后的结果,为检测后的结果排序
def img_cut(frame,bbox):
frame_target = frame[int(bbox[1]):int(bbox[3]), int(bbox[0]):int(bbox[2])]
return frame_target
def img_write(frame,img_file,id_num,save_file):
filename = os.path.basename(img_file).split('.')[0] +'_'+ f"person_{id_num}.jpg"
person_image_path = os.path.join(save_file, filename)
cv2.imwrite(person_image_path, frame)
return person_image_path
def change_bbox(bbox_person,bbox_hand):
'''
将小图上手的坐标转换到原图大图的坐标
'''
bbox_xmin = bbox_hand[0] + bbox_person[0]
bbox_xmax = bbox_hand[2] + bbox_person[0]
bbox_ymin = bbox_hand[1] + bbox_person[1]
bbox_ymax = bbox_hand[3] + bbox_person[1]
bbox = [bbox_xmin,bbox_ymin,bbox_xmax,bbox_ymax]
return bbox
def select_list(result_list):
'''
筛选列表中的空列表
'''
if result_list:
result_only = []
for result in result_list:
if result == None:
pass
else:
result_only.append(result)
return result_only
def para_list_correction(images_size, bbox_list, dertpara):
updata_result_list = []
for bbox in bbox_list:
updata_bbox = para_correction(images_size, bbox, dertpara)
size = [(updata_bbox[2] - updata_bbox[0]),
(updata_bbox[3] - updata_bbox[1])]
if determine_zero(size):
if check_bbox(size):
updata_result_list.append(updata_bbox)
return updata_result_list
def para_correction(images_size, bbox, dertpara):
'''
修正检测后标注框过小的情况,如果有修正参数则使用修正参数如果没有就按照坐标值扩大两倍
'''
# if dertpara == 0:
# pass
# else:
w = (bbox[2] - bbox[0]) / int(dertpara)
h = (bbox[3] - bbox[1]) / int(dertpara)
bbox_extand_list_x = [bbox[0] - w, bbox[2] + w]
bbox_extand_list_y = [bbox[1] - h, bbox[3] + h]
bbox_list_x = contrast(
size=images_size[1], bbox_extand_list=bbox_extand_list_x)
bbox_list_y = contrast(
size=images_size[0], bbox_extand_list=bbox_extand_list_y)
bbox_list = [bbox_list_x[0], bbox_list_y[0],
bbox_list_x[1], bbox_list_y[1]]
return bbox_list
def contrast(size, bbox_extand_list):
'''
对比数值是否在这个范围内
'''
# print('bbox_extand_list:',bbox_extand_list)
# print('size:',size)
bbox_list = []
for x in bbox_extand_list:
# print('size:',size)
if 0 <= int(x) <= int(size):
# print('in:',x,size)
bbox_list.append(x)
if int(x) > int(size):
# print('>:',x,size)
bbox_list.append(size)
if int(x) < 0:
# print('<:',x,size)
bbox_list.append(0)
# print('bbox_list:',bbox_list)
return bbox_list
def determine_zero(num_list):
for num in num_list:
if num == 0:
return False
return True
def check_bbox(size):
ratio = size[0]/size[1]
if ratio >= 5:
return False
if ratio <= 1/5:
return False
else:
return True