"Digital Photo Slide view"なる物を作っていますが、
スライドビューで下記のサイトで凄く気に入ったので
利用したいと思い実装を考えました。
それはcv2.imshowで表示するのですが、
制御する為のframe(コントロール)を利用したCanvasに乗せれないと
サイト調べで理解しました。
そこでframe(コントロール)とcv2.imshowを横並びで表示して、
コントロールで制御と考えますが、
この方法は妥当でしょうか?
妥当として上記を進める場合、exit_buttonで、動画を止めて、cv2.imshowを
cv2.destroyWindow("Slide")と思っていますが、
試行錯誤を試みましたが、正解を見出せないでいます。
どなたか、知恵を貸して頂ければ思います。宜しくお願い致します
自分初心者程度の知識しか有りませんので、
コードを提示して頂ければ助かります。
又利用コードが複雑なため、全コードを提示します。
スライドビューの元サイト Create a Moving Photo Slideshow with Weighted Transitions in OpenCV
https://www.learnpythonwithrune.org/create-a-moving-photo-slideshow-with-weighted-transitions-in-opencv/
関連する前回質疑:https://teratail.com/questions/342676
11.jpg
12.jpg
14.jpg
15.jpg
black.jpg
python
1import tkinter as tk 2from tkinter import ttk 3import tkinter 4import os 5from PIL import Image, ImageTk 6import cv2 7import glob 8import random 9import threading 10 11class Application(tk.Frame): 12 def __init__(self, master): 13 super().__init__(master) 14 master.title("Digital Photo Slide view") 15 master.geometry("125x480+70+70") 16 ttk.Style().configure("TP.TFrame", background="gainsboro") 17 self.main_frame = ttk.Frame(master=master, style="TP.TFrame", width=125, height=480) 18 self.main_frame.pack() 19 20 # load_button 21 self.load_btn = tk.Button(self.main_frame, text="load_button", font=("", 12), bg="green", fg="white", relief=tk.FLAT) 22 self.load_btn.place(x=10, y=150) 23 24 # exit_button 25 self.exit_btn = tk.Button(self.main_frame, text="exit_button", font=("", 12), bg="green", fg="white", relief=tk.FLAT) 26 self.exit_btn.place(x=10, y=250) 27 28 # top_button 29 self.top_btn = tk.Button(self.main_frame, text="top_button", font=("", 12), bg="green", fg="white", relief=tk.FLAT) 30 self.top_btn.place(x=10, y=350) 31 32 def PhotoView(self): 33 self.filelist=['./photo\11.jpg', './photo\12.jpg', './photo\14.JPG', './photo\15.JPG'] 34 # Cl:class 35 self.Cl = PhotoImageStack(self.filelist) 36 self.preImage = self.Cl.get_image() 37 self.Cl.add_image() 38 self.nowImage = self.Cl.get_image() 39 self.Cl.add_image() 40 41# ????????????????????????????????????????????????????????????????????????? 42 self.update_timer = self.preImage 43 self.roop_image() 44 45 46 def roop_image(self): 47 load_nextimage = threading.Thread(target=self.Cl.add_image) 48 # print(load_nextimage) 49 if (load_nextimage): 50 for i in range(100): #100回繰り返す 重なりタイム 51 alpha = i/100 52 beta = 1.0 - alpha 53 # 画像を重ね合わせる cv2.addWeighted(src1, alpha, src2, beta, gamma) 54 dst = cv2.addWeighted(self.nowImage.get_frame(), alpha, self.preImage.get_frame(), beta, 0.0) 55 self.update_timer =cv2.imshow("Slide", dst) 56 cv2.moveWindow("Slide", 195, 70) # Window表示位置指定 57 cv2.waitKey(10) 58 59 for _ in range(300): #300回繰り返す 表示タイム 60 self.update_timer =cv2.imshow("Slide", self.nowImage.get_frame()) 61 cv2.waitKey(10) 62 63 self.preImage = self.nowImage 64 self.nowImage = self.Cl.get_image() 65 load_nextimage = threading.Thread(target=self.Cl.add_image) 66 # load_nextimage.start() 67 self.update_timer = load_nextimage.start() 68 self.roop_image() 69 70 else: 71 print("else") 72 self.update_timer = None 73 def stop(self): 74 print("stop") 75 # if self.update_timer(): 76 # self.update_timer = None 77 # cv2.destroyWindow("Slide") 78 79# ///// 元ソース ///////////////////////////////////////////////////////// 80# 81# while True: 82# for i in range(100): #100回繰り返す 重なりタイム 83# alpha = i/100 84# beta = 1.0 - alpha 85# # 画像を重ね合わせる cv2.addWeighted(src1, alpha, src2, beta, gamma) 86# dst = cv2.addWeighted(self.nowImage.get_frame(), alpha, self.preImage.get_frame(), beta, 0.0) 87# cv2.imshow("Slide", dst) 88# cv2.moveWindow("Slide", 180, 70) # Window表示位置指定 89# if cv2.waitKey(10) == ord('q'): #Esc key 90# return 91# 92# for _ in range(300): #300回繰り返す 表示タイム 93# cv2.imshow("Slide", self.nowImage.get_frame()) 94# cv2.imshow("Slide", self.nowImage.get_frame()) 95# if cv2.waitKey(10) == ord('q'): #Esc key 96# return 97# 98# self.preImage = self.nowImage 99# self.nowImage = self.Cl.get_image() 100# load_nextimage = threading.Thread(target=self.Cl.add_image) 101# load_nextimage.start() 102# print(load_nextimage) 103# 104# ////////////////////////////////////////////////////////////////////////////// 105 106 107class PhotoImage(): 108 def __init__(self, filename): 109 size = 480 110 time = 500 111 self.filename = filename 112 self.shifted = 0.0 113 img = cv2.imread(filename) 114 # OpenCVで画像の縦と横のサイズを求める 115 height, width, _ = img.shape 116 if width < height: 117 n_height = int(height*size/width) 118 o_width = size 119 self.img = cv2.resize(img, (o_width, n_height)) 120 self.shift = n_height - size 121 self.shift_height = True 122 else: 123 n_width = int(width*size/height) 124 o_height = size 125 self.shift = n_width - size 126 self.img = cv2.resize(img, (n_width, o_height)) 127 self.shift_height = False 128 self.delta_shift = self.shift/time 129 130 131 def get_frame(self): 132 size = 480 133 if self.shift_height: 134 roi = self.img[int(self.shifted):int(self.shifted) + size, :, :] 135 else: 136 roi = self.img[:, int(self.shifted):int(self.shifted) + size, :] 137 self.shifted += self.delta_shift 138 if self.shifted > self.shift: 139 self.shifted = self.shift 140 if self.shifted < 0: 141 self.shifted = 0 142 return roi 143 144 145class PhotoImageStack: 146 def __init__(self, filelist, size=3): 147 self.stack = [] 148 self.cnt = (len(filelist)) 149 150 # 降順配列のまま 151 self.ar_file = filelist 152 153 # 配列先頭にblack.jpgを挿入する 154 self.ar_file.insert(0, './photo/black.jpg') 155 156 self.i = 0 157 filename = self.ar_file[self.i] 158 self.i += 1 159 if self.i == self.cnt +1 : self.i = 0 160 self.stack.append((filename, PhotoImage(filename))) 161 # Lock used for accessing the stack 162 self.stack_lock = threading.Lock() 163 self.add_image_lock = threading.Lock() 164 165 def get_image(self): 166 self.stack_lock.acquire() 167 filename, img = self.stack.pop() 168 print(f"Get image {filename} (stack size:{len(self.stack)})") 169 self.stack_lock.release() 170 return img 171 172 def add_image(self): 173 self.add_image_lock.acquire() 174 filename = self.ar_file[self.i] 175 self.i += 1 176 if self.i == self.cnt +1 : self.i = 0 177 178 self.stack_lock.acquire() 179 while any(item[0] == filename for item in self.stack): 180 filename = self.ar_file[self.i] 181 self.i += 1 182 if self.i == self.cnt +1 : self.i = 0 183 184 self.stack_lock.release() 185 img = PhotoImage(filename) 186 self.stack_lock.acquire() 187 self.stack.append((filename, img)) 188 print(f"Add image {filename} (stack size: {len(self.stack)})") 189 self.stack_lock.release() 190 self.add_image_lock.release() 191 192def main(): 193 root = tk.Tk() 194 app = Application(master=root) 195 196# ?????????????????????????????????????? 197 def exit_close(): # 全て閉じる 198 print("exit_close") 199 cv2.destroyWindow("Slide") 200 # app.stop() 201 202 def exit_top(): # Topへ 回答対象外 203 print("exit_top") 204 cv2.destroyWindow("Slide") 205 # app.stop() 206# ?????????????????????????????????????? 207 208 app.load_btn.config(command=app.PhotoView) 209 app.exit_btn.config(command=exit_close) 210 app.top_btn.config(command=exit_top) 211 212 root.mainloop() 213 214if __name__ == '__main__': 215 main()
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/06/24 13:21
2021/06/25 03:09 編集
2021/06/25 03:09 編集
2021/06/25 01:37 編集
2021/06/25 04:06