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

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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