前提、発生している問題
Tkinterを使用してPythonでデスクトップアプリを開発しています。
現在、Tkinter上でUSBカメラで撮影している画面を表示するところまで完成しています。
しかし、OpenCVを使用した画像処理のコードとうまく組合わせることができず悩んでいます。
OS:Windows 10
Pythonバージョン:3.5.4(64bit)
開発環境:Pycharm
実現したいこと
下記コードに示したfr.pyの26~50行目の内容をsample.pyと統合したい。
結果的には、カメラ撮影画面の左下に名前が表示される。
該当のソースコード1(sample.py)
Python
1import tkinter as tk 2 3from PIL import Image, ImageTk, ImageDraw, ImageFont 4import cv2 5import numpy as np 6 7root = tk.Tk() 8root.title('sample') 9root.geometry('1000x400+150+10') 10 11f1 = tk.LabelFrame(root, bd=2, relief="ridge", text="camera") 12f1.pack(side='top', anchor='w', padx=20) 13 14camera = tk.Canvas(f1, width=600, height=400, bg="white") 15camera.pack(side='left') 16 17 18def capture(): 19 try: 20 global c, w, h 21 c = cv2.VideoCapture(0) 22 w = c.get(cv2.CAP_PROP_FRAME_WIDTH) 23 h = c.get(cv2.CAP_PROP_FRAME_HEIGHT) 24 pass 25 except: 26 import sys 27 c.release() 28 cv2.destroyAllWindows() 29 30 31def up(): 32 global img 33 ret, frame = c.read() 34 if ret: 35 img = ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))) 36 camera.create_image(w / 2, h / 2, image=img) 37 root.after(1, up) 38 39 40capture() 41up() 42 43root.mainloop()
該当のソースコード2(fr.py)
Python
1from face_recognition import * 2from predict import * 3from create_dataset import * 4 5import cv2 6from PIL import Image, ImageDraw, ImageFont 7import numpy as np 8 9model_path = '../models/20180402-114759' 10pic_path = "../dataset/images" 11dataset_path = '../dataset/emb/faceEmbedding.npy' 12filename = '../dataset/emb/name.txt' 13reload = False 14face_recognition_threshold = 0.85 15 16print("initializing models...") 17face_detect = Facedetection() 18face_net = facenetEmbedding(model_path) 19if reload: 20 print("refreshing face embeddings...") 21 create_face_embedding(model_path, pic_path, dataset_path, filename) 22print("loading embeddings...") 23dataset_emb, names_list = load_dataset(dataset_path, filename) 24 25 26def put_text_japanese(img, text, pos): 27 img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 28 font_size = 25 29 font = ImageFont.truetype('meiryo', font_size, encoding="utf-8") 30 fillColor = (255, 0, 0) # 青(0, 0, 255) 31 draw = ImageDraw.Draw(img_PIL) 32 draw.text((pos[0], pos[1] - font_size - 10), text, font=font, fill=fillColor) 33 img = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR) 34 return img 35 36 37cap = cv2.VideoCapture(0) 38height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) 39while cap.isOpened(): 40 ret, frame = cap.read() 41 if not ret: 42 break 43 result = face_recognition_image_driver(dataset_emb, names_list, face_detect, face_net, frame, 44 face_recognition_threshold) 45 # cv2.putText(frame, result, (0,int(height)-10), 0, 1, (0, 0, 255), 2) 46 frame = put_text_japanese(frame, result, (0, int(height))) 47 cv2.imshow("Frame", frame) 48 # if the `q` key was pressed, break from the loop 49 if cv2.waitKey(1) & 0xFF == ord('q'): 50 break 51
ご回答よろしくお願いいたします。
###以下、再編集
##該当のソースコード3(sample.py(統合後))
Python
1import tkinter as tk 2 3from PIL import Image, ImageTk, ImageDraw, ImageFont 4import cv2 5import numpy as np 6 7from face_recognition import * 8from predict import * 9from create_dataset import * 10 11root = tk.Tk() 12root.title('sample') 13root.geometry('1000x400+150+10') 14 15f1 = tk.LabelFrame(root, bd=2, relief="ridge", text="camera") 16f1.pack(side='top', anchor='w', padx=20) 17 18camera = tk.Canvas(f1, width=600, height=400, bg="white") 19camera.pack(side='left') 20 21model_path = '../models/20180402-114759' 22pic_path = "../dataset/images" 23dataset_path = '../dataset/emb/faceEmbedding.npy' 24filename = '../dataset/emb/name.txt' 25reload = False 26face_recognition_threshold = 0.85 27 28print("initializing models...") 29face_detect = Facedetection() 30face_net = facenetEmbedding(model_path) 31if reload: 32 print("refreshing face embeddings...") 33 create_face_embedding(model_path, pic_path, dataset_path, filename) 34print("loading embeddings...") 35dataset_emb, names_list = load_dataset(dataset_path, filename) 36 37 38def capture(): 39 try: 40 global c, w, h 41 c = cv2.VideoCapture(0) 42 w = c.get(cv2.CAP_PROP_FRAME_WIDTH) 43 h = c.get(cv2.CAP_PROP_FRAME_HEIGHT) 44 pass 45 except: 46 import sys 47 c.release() 48 cv2.destroyAllWindows() 49 50 51def up(): 52 global img 53 ret, frame = c.read() 54 if ret: 55 result = face_recognition_image_driver(dataset_emb, names_list, face_detect, face_net, frame, 56 face_recognition_threshold) 57 58 def put_text_japanese(img, text, pos): 59 img_PIL = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) 60 font_size = 25 61 font = ImageFont.truetype('meiryo', font_size, encoding="utf-8") 62 fillColor = (255, 0, 0) # 青(0, 0, 255) 63 draw = ImageDraw.Draw(img_PIL) 64 draw.text((pos[0], pos[1] - font_size - 10), text, font=font, fill=fillColor) 65 img = cv2.cvtColor(np.asarray(img_PIL), cv2.COLOR_RGB2BGR) 66 return img 67 68 frame = put_text_japanese(frame, result, (0, int(h))) 69 70 img = ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))) 71 camera.create_image(w / 2, h / 2, image=img) 72 root.after(1, up) 73 74 75 root.after(1, up) 76 77 78capture() 79up() 80 81root.mainloop() 82
ご回答よろしくお願いいたします。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。