import os
import cv2
from PIL import Image
import json
from tqdm import tqdm
import numpy
import scipy.signal as signal# local_map = {"右上": "RU", "右上/右下": "R", "右下": "RD", "右中": "RM", "中上": "MU", "左下": "LD", "左上": "LU", "左下/右下": "D",
#              "左中": "LM", "右下角": "RD", "中间": "M", "左上/左下/右上/右下": "ALL", "中下": "MD", "右上右下": "R", "右下方": "RD",
#              "右上/左下": "ALL", "左上右上": "U", "左上/右上": "U", "右上方": "RU", "左下/右上": "ALL", "左上左下": "L",
#              "右下/右上": "R", "左下方": "LD", "左下/右下/右上": "ALL"}fps = 25  # 帧率def path_replace(path_ori, file_ori, file_new):""":param path_ori: 需要被替换的路径:param file_ori: 需要被替换的文件夹:param file_new: 新文件夹:return: path_new:新文件夹内结构与原文件夹一样"""path_file_new = ('/'.join(path_ori.split('/')[:-1]).replace(file_ori, file_new))  # 视频文件的路径(没有后缀)print(path_file_new)path_new = '/'.join(path_file_new.split('/')[:-1])  # 上级目录print(path_new)if not os.path.exists(path_new):os.makedirs(path_new)print('{} has been created!'.format(path_new))else:print('{} exsits'.format(path_new))return path_new, path_file_newdef max_bbox(bbox_track):"""功能: 从bbox_track中找到最大的bbox输出: bbox的x_len_max,y_len_maxbbox_track: 存放着视频中所有帧的box"""x_len_max = 0y_len_max = 0for bbox in bbox_track:x_len = bbox[2] - bbox[0]y_len = bbox[3] - bbox[1]if x_len > x_len_max:x_len_max = x_lenif y_len > y_len_max:y_len_max = y_lenreturn int(x_len_max), int(y_len_max)def bbox_re(x_len_max, y_len_max, ratio):# resizex_len_max = int(x_len_max * ratio)y_len_max = int(y_len_max * ratio)return x_len_max, y_len_maxdef middle_fild(x_middle, y_middle):x_middle = numpy.array(x_middle)y_middle = numpy.array(y_middle)resi_x = x_middle[0]resi_y = y_middle[0]x_middle -= resi_xy_middle -= resi_yx_middle = signal.medfilt(x_middle, 51)y_middle = signal.medfilt(y_middle, 51)x_middle += resi_xy_middle += resi_yx_middle = x_middle.tolist()y_middle = y_middle.tolist()return x_middle, y_middledef _bbox_track_re(bbox_track, x_len_max, y_len_max):x_len_max = int(x_len_max / 2)y_len_max = int(y_len_max / 2)x_middle = []y_middle = []for bbox in bbox_track:# 找到中点x_middle.append(int((bbox[2] + bbox[0]) / 2))y_middle.append(int((bbox[3] + bbox[1]) / 2))# 平滑(可以解决跳帧)# x_middle, y_middle = middle_fild(x_middle, y_middle)# 统一重整为最大的框# 这里不能因为浮点数小数位的取舍导致图片大小不统一for bbox, x_i, y_i in zip(bbox_track, x_middle, y_middle):bbox[0] = x_i - x_len_maxbbox[1] = y_i - y_len_maxbbox[2] = x_i + x_len_maxbbox[3] = y_i + y_len_max# 这里检查一下bbox_track是否被修改return bbox_trackdef img_cut(img, bbox):image = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))image = image.crop((bbox[0], bbox[1], bbox[2], bbox[3]))img = cv2.cvtColor(numpy.asarray(image), cv2.COLOR_RGB2BGR)return imgdef _bbox_resize(bbox, ratio):# 输入是bbox和resize比例# 输出是resize后的bbox# xmin, ymin, xmax, ymax = bbox.xmin, bbox.ymin, bbox.xmax, bbox.ymaxxmin, ymin, xmax, ymax = bbox[0], bbox[1], bbox[2], bbox[3]w, h = xmax - xmin, ymax - yminx, y = xmin + w / 2, ymin + h / 2w, h = w * ratio, h * ratioreturn [int(x - w / 2), int(y - h / 2), int(x + w / 2), int(y + h / 2)]def path_change(img_path_all):path_local = '/home/fuxingwen/code2/vql-serving/projects/data_process/data/img_test2/'img_path_change = []for path_i in img_path_all:# print(path_i)img_path = path_local + path_i.split('/')[-1]img_path_change.append(img_path)img_path_all = img_path_changereturn img_path_alldef img_track_cut(img_path_all, bbox_track, ratio, file_ori, file_new, track_id):""":param img_path_all: 是所有图片的路径:param bbox_track: 多个bbox的列表:param ratio: 缩放的比例:param file_ori: 原文件夹的名称:param file_new: 新文件夹的名称:param stage: “右下”之类的状态:return: video_path_cut:切好视频路径"""# 路径替换img_path_all = path_change(img_path_all)  # 需要将原url替换为本地图片的路径# 首先替换文件夹 path_new是图片所在的上层目录,video_path_cut是第一张图片的路径(没有后缀)path_new, video_path_cut = path_replace(img_path_all[0], file_ori, file_new)video_path_cut = video_path_cut + '_' + track_id + '.mp4'  # 再添加‘stage’标记# 获得bbox最大的长和宽x_len_max, y_len_max = max_bbox(bbox_track)# print(x_len_max, y_len_max)# resizex_len_max, y_len_max = bbox_re(x_len_max, y_len_max, ratio)# 统一bbox# print(bbox_track)size = x_len_max, y_len_maxbbox_track = _bbox_track_re(bbox_track, x_len_max, y_len_max)# print(bbox_track)# 按照bbox切video = cv2.VideoWriter(video_path_cut,cv2.VideoWriter_fourcc(*'MP4V'),fps,size,True)i = 0for img_path, bbox in zip(img_path_all, bbox_track):img = cv2.imread(img_path)img = img_cut(img, bbox)cv2.imwrite(path_new + '/' + str(i) + '.jpg', img)i = i + 1# print(img.shape)video.write(img)video.release()cv2.destroyAllWindows()print('track视频合成生成完成啦')return video_path_cutdef img_fix_cut(img_path_all, bbox_fix, ratio, file_ori, file_new, track_id):"""# 输入:# img_path_all 是图片的路径# bbox_fix 是要切的位置,# stage 是“右下”之类的标签,# file_ori 是需要被替换的原文件夹,# file_new 是之后数据保存的新文件夹# 其中:# video_path_cut 是被切后的视频路径"""# 路径替换# 首先替换文件夹 path_new是图片所在的上层目录,video_path_cut是视频的路径(没有后缀)path_new, video_path_cut = path_replace(img_path_all[0], file_ori, file_new)  # 首先替换文件夹(这里我也可以给上层目录)video_path_cut = video_path_cut + '_' + track_id + '.mp4'  # 再添加‘stage’标记# resize# 读取第一张图片获取基本信息bbox = _bbox_resize(bbox_fix, ratio)size = bbox[2] - bbox[0], bbox[3] - bbox[1]  # cv2的shape是宽和高,,而shape[0]是行数(高)# 按照bbox切video = cv2.VideoWriter(video_path_cut,cv2.VideoWriter_fourcc(*'MP4V'),fps,size,True)# i = 0for img_path in img_path_all:img = cv2.imread(img_path)img = img_cut(img, bbox)# cv2.imwrite(path_new + '/' + str(i) + '.jpg', img)# i = i + 1video.write(img)video.release()cv2.destroyAllWindows()print('fix视频合成生成完成啦')return video_path_cutdef img_process(json_ori_path, json_new_path, bbox_ratio, file_ori, file_track, file_smooth, file_fix):""":param json_ori_path: 原json文件的路径:param json_new_path: 新json文件的路径:param bbox_ratio: bbox resize的比例:param file_ori: 原文件夹的名字:param file_track: 新文件夹的名字(track):param file_smooth: 新文件夹的名字(smooth):param file_fix: 新文件夹的名字(fix):return:"""data = json.load(open(json_ori_path))for d in tqdm(data):video_track = img_track_cut(img_path_all=d['img_path_all'],bbox_track=d['bbox_track'],track_id='30',ratio=bbox_ratio,file_ori=file_ori,file_new=file_track,)# video_smooth = img_track_cut(#     img_path_all=d['path_exit'],#     bbox_track=d['bbox_track_smooth'],#     track_id=d['track_id'],#     ratio=bbox_ratio,#     file_ori=file_ori,#     file_new=file_smooth,# )# video_fix = img_fix_cut(#     img_path_all=d['img_path_all'],#     bbox_fix=d['bbox_fix'],#     track_id=d['track_id'],#     ratio=bbox_ratio,#     file_ori=file_ori,#     file_new=file_fix,# )d['video_track'] = video_track# d['video_smooth'] = video_smooth# d['video_fix'] = video_fixwith open(json_new_path, 'w', encoding='utf-8') as f:json.dump(data, f, indent=2, ensure_ascii=False)# 按间距中的绿色按钮以运行脚本。
if __name__ == '__main__':img_process(json_ori_path='/home/fuxingwen/code2/vql-serving/projects/ByteTrack/data/clips2.json',json_new_path='milktea_position.json',bbox_ratio=1,file_ori='data',file_track='data_track_test',file_smooth='data_track_smooth',file_fix='data_fix')

视频按照bbox切割算法相关推荐

  1. 视频操作_02视频追踪:meanshift算法+Camshift算法

    1.meanshift 1.1原理 meanshift算法的原理很简单.假设你有一堆点集,还有一个小的窗口,这个窗口可能是圆形的,现在你可能要移动这个窗口到点集密度最大的区域当中. 如下图: 最开始的 ...

  2. 红外视频图像行人检测算法综述

    http://www.doc88.com/p-1137822192539.html 2018年西安邮电大学学报 <改进的YOLOv3红外视频图像行人检测算法> 对于红外视频图像行人检测算法 ...

  3. 墙面也能变镜子,只看影子就能还原视频,MIT新算法让摄像头无死角

    边策 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 你在看电影,墙上的影子也在动.如果只让你看到这样一段视频,你能猜出来屏幕上播放的是什么吗? 最近MIT人工智能实验室(CSAIL)开发 ...

  4. 视频异常行为检测算法MPN,在多个数据库上达到SOTA

    分享一篇CVPT 2021 视频异常行为检测的论文:Learning Normal Dynamics in Videos with Meta Prototype Network, 作者:吕辉, 陈宸, ...

  5. 只看影子就能还原视频,MIT新算法让摄像头无死角

    点击我爱计算机视觉标星,更快获取CVML新技术 边策 十三 发自 凹非寺 量子位 报道 | 公众号 QbitAI 你在看电影,墙上的影子也在动.如果只让你看到这样一段视频,你能猜出来屏幕上播放的是什么 ...

  6. matlab光流lk,Matlab数字视频处理 光流LK算法

    Matlab数字视频处理 光流LK算法 Matlab数字视频处理 光流LK算法 正在学习数字视频处理,老师给了一些资料 拿出来给大家分享! function [u, v] = LucasKanade( ...

  7. 使用cocos2dx实现碎片炸裂 P2(凹多边形的三角切割算法)(修订1)

    上一章虽然已经能够将纹理碎片化,但是固定一条边,然后依次匹配第三个顶点的作法是无法适用于凹多边形的. 作为一个阿里眼里的菜逼,之前想着这个算法应该很简单,结果网上的各种转载也没找到个说清楚的文章,所以 ...

  8. 基于OpenCV的电影视频人像景别分类算法(源码&教程)

    1.研究背景 近年来,随着多媒体技术的高速发展,视频数据也呈现出爆炸性的增长.基于内容的视频检索已成为当前的迫切需求.特别在电影视频领域,单纯的播放已经无法满足用户日益增长的需要.如何准确快速地按照用 ...

  9. HoloLens MRTK模型切割算法解析

    HoloLens MRTK模型切割算法解析 脚本解析 算法实现 修改shader实现不同的功能 修改Clipping Plane裁剪的范围 修改模型透明度 多个ClippingPrimitive对同一 ...

最新文章

  1. 大话android 进程通信之AIDL
  2. ext store 数据修改_Ext 修改Store初始化加载完后修改record属性。
  3. elasticsearch 客户端工具_万字长文:详解 Spring Boot 中操作 ElasticSearch
  4. SpringMVC 全局异常处理,返回json
  5. VMM2012应用指南之1-实验环境概述与准备
  6. thinkphp仿素材火教程_国外都用古风效果图获奖了,为什么你连素材都没有?
  7. 浅谈 Kubernetes 服务发现
  8. 【FLink】Flink SQL代码生成与UDF重复调用的优化
  9. 为什么阿里巴巴的市值比京东高,世界500排名比京东靠后?
  10. 智能一代云平台(三十四):后端架构一些总结
  11. Typora入门(中文版)
  12. 反编译,修改jar文件
  13. C++代码示例2 ~ 求立方体的面积和体积并求出两个立方体是否相等
  14. java编写监听器步骤_IT兄弟连 JavaWeb教程 监听器1
  15. qpython 3h_QPython 3H
  16. 华为机试 - HJ10 字符个数统计
  17. wincc服务器不能创建项目,wincc不能创建和打开项目
  18. web浏览器下载文件没响应不报错
  19. Jquery colorbox不错的遮罩
  20. 2013-2-22 ACM-第三次月赛 1001 铺地毯

热门文章

  1. JXTA promotion, 2 install Demo Application
  2. html设置http缓存代码
  3. php friend_Model/Friend.php · 跳跳虎1986/cwj - Gitee.com
  4. java 微信模板_java开发微信模板消息推送
  5. c语言中国象棋ai算法,【中国象棋】AI算法中的棋子价值是怎么衡定的?
  6. 推荐 :如何通过数据分析选品(以新零售为例)
  7. 【嵌入式10】stm32CubeMX+Keil使用HAL库点灯,并使用逻辑分析仪观察周期
  8. 华为服务器租赁协议,华为云服务器租赁合同
  9. 免费下载Xcode的各个版本
  10. Rogue Signs: Deceiving Traffic Sign Recognition with Malicious Ads and Logos