From 54181353c6e2fb5e2011e369f7aed296038a979a Mon Sep 17 00:00:00 2001 From: "ken.shirakawa" Date: Tue, 8 Feb 2022 12:15:38 +0900 Subject: [PATCH 1/5] update_movie_stype --- bdpy/fig/draw_group_movie_set.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/bdpy/fig/draw_group_movie_set.py b/bdpy/fig/draw_group_movie_set.py index 566ea474..398a4ce0 100644 --- a/bdpy/fig/draw_group_movie_set.py +++ b/bdpy/fig/draw_group_movie_set.py @@ -54,7 +54,7 @@ def save_video(vid, save_name, save_intermidiate_path, bgr=False, fr_rate = 30, FONT_PATH ="/usr/share/fonts/truetype/freefont/FreeSans.ttf" def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_dir=None, insert_first_num=5, insert_last_num=0, fr_rate=16, background_color = (255, 255, 255), - image_size = (160, 160), image_margin = (1, 1, 0, 0), group_margin = (20, 0, 20, 0), max_column_size = 13, + image_size = (160, 160), image_margin = (1, 1, 0, 0), group_margin = (20, 0, 120, 0), max_column_size = 13, title_fontsize = 20, title_top_padding = 70, title_left_padding = 15, font_family_path = FONT_PATH, id_show = False, id_fontcolor = "black", id_fontsize = 18, image_id_list = []): @@ -97,6 +97,22 @@ def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_d This list is required when `id_show` is True. """ + image_pram_dict = { + "background_color": background_color, + "image_size": image_size, + "image_margin": image_margin, + "group_margin": group_margin, + "max_column_size": max_column_size, + "title_fontsize": title_fontsize, + "title_top_padding": title_top_padding, + "title_left_padding": title_left_padding, + "font_family_path": font_family_path, + "id_show": id_show, + "id_fontcolor": id_fontcolor, + "id_fontsize": id_fontsize, + "image_id_list": image_id_list + } + num_fr = len(movie_condition_list[0]['image_filepath_list'][0]) + insert_first_num + insert_last_num @@ -118,7 +134,7 @@ def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_d #create image - frame = draw_group_image_set(show_frame_list, id_show=id_show, image_id_list=image_id_list, font_family_path=font_family_path) + frame = draw_group_image_set(show_frame_list, **image_pram_dict) #save image frame.save(os.path.join(save_frame_dir,save_frame_name)) #save video from their frame From 8267d43f9f578a4bad6635914e2d420fe91b74fc Mon Sep 17 00:00:00 2001 From: "ken.shirakawa" Date: Thu, 10 Feb 2022 11:35:06 +0900 Subject: [PATCH 2/5] support to save gif --- bdpy/fig/draw_group_movie_set.py | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/bdpy/fig/draw_group_movie_set.py b/bdpy/fig/draw_group_movie_set.py index 398a4ce0..ab577941 100644 --- a/bdpy/fig/draw_group_movie_set.py +++ b/bdpy/fig/draw_group_movie_set.py @@ -51,12 +51,22 @@ def save_video(vid, save_name, save_intermidiate_path, bgr=False, fr_rate = 30, writer.write(frame.astype(np.uint8)) writer.release() +def save_gif(vid, save_name, save_intermidiate_path, bgr='False', fr_rate= 30): + gif_list = [] + for frame in vid: + if bgr == True: + gif_list.append(Image.fromarray(frame[...,[2,1,0]].astype(np.uint8))) + else: + gif_list.append(Image.fromarray(frame.astype(np.uint8))) + gif_list[0].save(os.path.join(save_intermidiate_path, save_name), save_all=True, + append_images=gif_list[1:], loop=0, duration=fr_rate) + FONT_PATH ="/usr/share/fonts/truetype/freefont/FreeSans.ttf" def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_dir=None, insert_first_num=5, insert_last_num=0, fr_rate=16, background_color = (255, 255, 255), image_size = (160, 160), image_margin = (1, 1, 0, 0), group_margin = (20, 0, 120, 0), max_column_size = 13, title_fontsize = 20, title_top_padding = 70, title_left_padding = 15, font_family_path = FONT_PATH, - id_show = False, id_fontcolor = "black", id_fontsize = 18, image_id_list = []): + id_show = False, id_fontcolor = "black", id_fontsize = 18, image_id_list = [], saving_gif=True): """ condition_list : list @@ -149,6 +159,8 @@ def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_d save_video(merge_list,save_name, save_dir, bgr=False, fr_rate=fr_rate) + if saving_gif: + save_gif(merge_list,save_name.split('.')[0] + '.gif', save_dir, bgr=False, fr_rate=fr_rate) print(save_name +'done') From 152dfee84d1576154c4bac26742edd2d8cb247ca Mon Sep 17 00:00:00 2001 From: Shuntaro Aoki Date: Sun, 13 Feb 2022 22:40:04 +0900 Subject: [PATCH 3/5] Recommit on fig --- bdpy/fig/__init__.py | 5 +++++ bdpy/fig/draw_group_image_set.py | 15 +++++++++++---- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/bdpy/fig/__init__.py b/bdpy/fig/__init__.py index e5f4f045..a52569ce 100644 --- a/bdpy/fig/__init__.py +++ b/bdpy/fig/__init__.py @@ -7,3 +7,8 @@ from .tile_images import tile_images from .draw_group_image_set import draw_group_image_set from .makeplots import makeplots +try: + #need to import cv2 + from .draw_group_movie_set import draw_group_movie_set, load_video, save_video +except: + pass diff --git a/bdpy/fig/draw_group_image_set.py b/bdpy/fig/draw_group_image_set.py index ee0fc218..c7014d1b 100644 --- a/bdpy/fig/draw_group_image_set.py +++ b/bdpy/fig/draw_group_image_set.py @@ -6,9 +6,12 @@ import PIL.ImageFont import matplotlib +FONT_PATH ="/usr/share/fonts/truetype/freefont/FreeSans.ttf" + + def draw_group_image_set(condition_list, background_color = (255, 255, 255), image_size = (160, 160), image_margin = (1, 1, 0, 0), group_margin = (20, 0, 20, 0), max_column_size = 13, - title_fontsize = 20, title_top_padding = 70, title_left_padding = 15, font_family_path = None, + title_fontsize = 20, title_top_padding = 70, title_left_padding = 15, font_family_path = FONT_PATH, id_show = False, id_fontcolor = "black", id_fontsize = 18, image_id_list = []): """ condition_list : list @@ -77,7 +80,11 @@ def draw_group_image_set(condition_list, background_color = (255, 255, 255), image_filepath = image_filepath_list[tind] if image_filepath is None: continue; - image_obj = PIL.Image.open(image_filepath) + if type(image_filepath).__module__ == "numpy": + # convert PIL module from numpy + image_obj = PIL.Image.fromarray(image_filepath) + else: + image_obj = PIL.Image.open(image_filepath) image_obj = image_obj.resize((image_size[0], image_size[1]), PIL.Image.LANCZOS) # Calc image position @@ -103,8 +110,8 @@ def draw_group_image_set(condition_list, background_color = (255, 255, 255), draw.font = PIL.ImageFont.truetype(font=system_fonts[0], size=title_fontsize) else: draw.font = PIL.ImageFont.truetype(font=font_family_path, size=title_fontsize) - - #------------------------------------ + + #--------- --------------------------- # Draw title name #------------------------------------ for cind, condition in enumerate(condition_list): From 440ed1d2f1a81a89dd82eb716576496ad4db68b2 Mon Sep 17 00:00:00 2001 From: Shuntaro Aoki Date: Wed, 2 Mar 2022 10:15:18 +0900 Subject: [PATCH 4/5] [fix] fix import --- bdpy/fig/__init__.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/bdpy/fig/__init__.py b/bdpy/fig/__init__.py index a52569ce..90671598 100644 --- a/bdpy/fig/__init__.py +++ b/bdpy/fig/__init__.py @@ -7,8 +7,4 @@ from .tile_images import tile_images from .draw_group_image_set import draw_group_image_set from .makeplots import makeplots -try: - #need to import cv2 - from .draw_group_movie_set import draw_group_movie_set, load_video, save_video -except: - pass +from .draw_group_movie_set import draw_group_movie_set, load_video, save_video From 0d92468bca097c0df38bd56bc588e686bb54c1aa Mon Sep 17 00:00:00 2001 From: Shuntaro Aoki Date: Wed, 2 Mar 2022 10:21:28 +0900 Subject: [PATCH 5/5] [fix][style] style fix, import fix, use isinstance https://github.com/KamitaniLab/bdpy/pull/26 --- bdpy/fig/draw_group_image_set.py | 2 +- bdpy/fig/draw_group_movie_set.py | 38 ++++++++++++++------------------ 2 files changed, 18 insertions(+), 22 deletions(-) diff --git a/bdpy/fig/draw_group_image_set.py b/bdpy/fig/draw_group_image_set.py index 26e9a971..bfa185f3 100644 --- a/bdpy/fig/draw_group_image_set.py +++ b/bdpy/fig/draw_group_image_set.py @@ -80,7 +80,7 @@ def draw_group_image_set(condition_list, background_color = (255, 255, 255), image_filepath = image_filepath_list[tind] if image_filepath is None: continue; - if type(image_filepath).__module__ == "numpy": + if isinstance(image_filepath, np.ndarray): # convert PIL module from numpy image_obj = PIL.Image.fromarray(image_filepath) else: diff --git a/bdpy/fig/draw_group_movie_set.py b/bdpy/fig/draw_group_movie_set.py index ab577941..2b045e06 100644 --- a/bdpy/fig/draw_group_movie_set.py +++ b/bdpy/fig/draw_group_movie_set.py @@ -3,9 +3,9 @@ import cv2 import copy from PIL import Image -#from .draw_group_image_set import draw_group_image_set from . import draw_group_image_set + def load_video(file_path,ret_type='float32', bgr=False, height=224,width=224, interpolation=cv2.INTER_LINEAR): """ ret_type select return as float32 float64, or uint8 @@ -13,30 +13,31 @@ def load_video(file_path,ret_type='float32', bgr=False, height=224,width=224, in """ cap = cv2.VideoCapture(file_path) vid = [] - + while True: - + ret, img = cap.read() - + if not ret: break - - # torchvision model allow RGB image , range of [0,1] and normalised + + # torchvision model allow RGB image , range of [0,1] and normalised if bgr: img = cv2.resize(img, (height, width), interpolation=interpolation) else: img = cv2.resize(cv2.cvtColor(img , cv2.COLOR_BGR2RGB), (height, width), interpolation=interpolation) - + if ret_type == 'float32': img = img.astype(np.float32) elif ret_type== 'float': img = img.astype(np.float) - + vid.append(img) return np.array(vid) + def save_video(vid, save_name, save_intermidiate_path, bgr=False, fr_rate = 30, codec=None): fr, height, width, ch = vid.shape fourcc = cv2.VideoWriter_fourcc(*'MJPG') @@ -63,8 +64,8 @@ def save_gif(vid, save_name, save_intermidiate_path, bgr='False', fr_rate= 30): FONT_PATH ="/usr/share/fonts/truetype/freefont/FreeSans.ttf" -def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_dir=None, insert_first_num=5, insert_last_num=0, fr_rate=16, background_color = (255, 255, 255), - image_size = (160, 160), image_margin = (1, 1, 0, 0), group_margin = (20, 0, 120, 0), max_column_size = 13, +def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_dir=None, insert_first_num=5, insert_last_num=0, fr_rate=16, background_color = (255, 255, 255), + image_size = (160, 160), image_margin = (1, 1, 0, 0), group_margin = (20, 0, 120, 0), max_column_size = 13, title_fontsize = 20, title_top_padding = 70, title_left_padding = 15, font_family_path = FONT_PATH, id_show = False, id_fontcolor = "black", id_fontsize = 18, image_id_list = [], saving_gif=True): @@ -74,7 +75,7 @@ def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_d ``` condition = { "title" : string, # Title name - "title_fontcolor" : string or list, # HTML color name or RGB value list + "title_fontcolor" : string or list, # HTML color name or RGB value list "image_filepath_list": array, # movie array list : [Note]movie filepath (e.g. .avi) is not supported yet } ``` @@ -90,9 +91,9 @@ def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_d Maximum number of images arranged horizontally. title_fontsize : int The font size of titles. - title_top_padding : + title_top_padding : Top margin of the title letter. - title_left_padding : + title_left_padding : Left margin of the title letter. font_family_path : string or None Font file path. @@ -123,12 +124,10 @@ def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_d "image_id_list": image_id_list } - - num_fr = len(movie_condition_list[0]['image_filepath_list'][0]) + insert_first_num + insert_last_num for fr in range(num_fr): - + save_frame_name = f'{fr}.jpg' if save_frame_dir == None: save_frame_dir = os.path.join(save_dir, 'frame') @@ -142,13 +141,12 @@ def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_d else: show_frame_list = create_frame_condition_list(movie_condition_list, fr - insert_first_num) - - #create image + #create image frame = draw_group_image_set(show_frame_list, **image_pram_dict) #save image frame.save(os.path.join(save_frame_dir,save_frame_name)) #save video from their frame - + merge_list = [] for t in range(num_fr): file_path = str(t)+ '.jpg' @@ -164,8 +162,6 @@ def draw_group_movie_set(movie_condition_list, save_name, save_dir, save_frame_d print(save_name +'done') - - def create_frame_condition_list(movie_condition_list, fr): return_list = copy.deepcopy(movie_condition_list)#.copy() for j, condition_dict in enumerate(movie_condition_list):