質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

1929閲覧

opencvによる映像処理後のウィンドウが「応答なし」となって閉じれず、その後の処理が実行できません。

muts

総合スコア2

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2022/06/13 10:14

問題

映像から表情認識を行うプログラムを使いたいのですが、表情認識自体はできているものの、映像が最後までいくと、出力された映像のウィンドウが「応答なし」となり、その後の処理を実行できません。

映像の途中であれば、キーボードからの入力によりウィンドウを閉じることはできます。
映像が最後までいっても「応答なし」の状態にならずにその後の処理を実行できるようにするにはどうしたらよいのか教えてください。

下記に、プログラムを記載します。

Python

1import os 2os.environ["OMP_NUM_THREADS"] = "2" 3import glob 4import json 5import cv2 6import numpy as np 7import torch 8from torchvision.transforms import transforms 9from models import densenet121, resmasking_dropout1 10import time 11import pandas as pd 12 13 14 15def ensure_color(image): 16 if len(image.shape) == 2: 17 return np.dstack([image] * 3) 18 elif image.shape[2] == 1: 19 return np.dstack([image] * 3) 20 return image 21 22 23net = cv2.dnn.readNetFromCaffe( 24 "deploy.prototxt.txt", "res10_300x300_ssd_iter_140000.caffemodel" 25) 26 27 28transform = transforms.Compose([transforms.ToPILImage(), transforms.ToTensor()]) 29 30 31FER_2013_EMO_DICT = { 32 0: "angry", 33 1: "disgust", 34 2: "fear", 35 3: "happy", 36 4: "sad", 37 5: "surprise", 38 6: "neutral", 39} 40 41#Time = [] 42#emo = [] 43 44 45def main(): 46 # load configs and set random seed 47 configs = json.load(open("./configs/fer2013_config.json")) 48 image_size = (configs["image_size"], configs["image_size"]) 49 50 # model = densenet121(in_channels=3, num_classes=7) 51 model = resmasking_dropout1(in_channels=3, num_classes=7) 52 model.cuda() 53 54 # state = torch.load('./saved/checkpoints/densenet121_rot30_2019Nov11_14.23') 55 # state = torch.load('./saved/checkpoints/resmasking_dropout1_rot30_2019Nov17_14.33') 56 state = torch.load( 57 "./saved/checkpoints/Z_resmasking_dropout1_rot30_2019Nov30_13.32" 58 ) 59 model.load_state_dict(state["net"]) 60 model.eval() 61 62 vid = cv2.VideoCapture('NWH2_exported.mp4') 63 64 65 # cv2.namedWindow('disp') 66 # cv2.resizeWindow('disp', width=800) 67 68 with torch.no_grad(): 69 #start_time = time.time() 70 while True: 71 ret, frame = vid.read() 72 if frame is None or ret is not True: 73 continue 74 75 try: 76 frame = np.fliplr(frame).astype(np.uint8) 77 # frame += 50 78 h, w = frame.shape[:2] 79 gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) 80 # gray = frame 81 82 blob = cv2.dnn.blobFromImage( 83 cv2.resize(frame, (300, 300)), 84 1.0, 85 (300, 300), 86 (104.0, 177.0, 123.0), 87 ) 88 net.setInput(blob) 89 faces = net.forward() 90 91 for i in range(0, faces.shape[2]): 92 confidence = faces[0, 0, i, 2] 93 if confidence < 0.5: 94 continue 95 box = faces[0, 0, i, 3:7] * np.array([w, h, w, h]) 96 start_x, start_y, end_x, end_y = box.astype("int") 97 98 # covnert to square images 99 center_x, center_y = (start_x + end_x) // 2, (start_y + end_y) // 2 100 square_length = ((end_x - start_x) + (end_y - start_y)) // 2 // 2 101 102 square_length *= 1.1 103 104 start_x = int(center_x - square_length) 105 start_y = int(center_y - square_length) 106 end_x = int(center_x + square_length) 107 end_y = int(center_y + square_length) 108 109 cv2.rectangle( 110 frame, (start_x, start_y), (end_x, end_y), (179, 255, 179), 2 111 ) 112 # cv2.rectangle(frame , (x, y), (x + w, y + h), (179, 255, 179), 2) 113 114 # face = gray[y:y + h, x:x + w] 115 face = gray[start_y:end_y, start_x:end_x] 116 117 face = ensure_color(face) 118 119 face = cv2.resize(face, image_size) 120 face = transform(face).cuda() 121 face = torch.unsqueeze(face, dim=0) 122 123 output = torch.squeeze(model(face), 0) 124 proba = torch.softmax(output, 0) 125 """ 126 now_time = time.time() 127 delta_time = now_time - start_time 128 Time.append(delta_time) 129 """ 130 # emo_idx = torch.argmax(proba, dim=0).item() 131 emo_proba, emo_idx = torch.max(proba, dim=0) 132 emo_idx = emo_idx.item() 133 emo_proba = emo_proba.item() 134 135 emo_label = FER_2013_EMO_DICT[emo_idx] 136 #emo.append(emo_label) 137 138 label_size, base_line = cv2.getTextSize( 139 "{}: 000".format(emo_label), cv2.FONT_HERSHEY_SIMPLEX, 0.8, 2 140 ) 141 142 cv2.rectangle( 143 frame, 144 (end_x, start_y + 1 - label_size[1]), 145 (end_x + label_size[0], start_y + 1 + base_line), 146 (223, 128, 255), 147 cv2.FILLED, 148 ) 149 cv2.putText( 150 frame, 151 "{} {}".format(emo_label, int(emo_proba * 100)), 152 (end_x, start_y + 1), 153 cv2.FONT_HERSHEY_SIMPLEX, 154 0.8, 155 (0, 0, 0), 156 2, 157 ) 158 159 cv2.imshow("disp", frame) 160 # cv2.imshow('disp', np.concatenate((gray ), axis=1)) 161 #print(emo_label,emo_proba) 162 163 164 if cv2.waitKey(1) & 0xFF == ord("q"): 165 break 166 167 except: 168 continue 169 vid.release() 170 cv2.destroyAllWindows() 171 172""" 173 data = {"Time": Time, 174 "Emotion": emo 175 } 176 177 fixed_emo = pd.DataFrame(data) 178 fixed_emo.to_csv('demo_emotions_2.csv', index=False) 179""" 180if __name__ == "__main__": 181 main() 182

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

映像が最後までいくと、出力された映像のウィンドウが「応答なし」となり、その後の処理を実行できません。

if frame ~にてcontinueしており、無限ループに陥っているからではないでしょうか。
breakして抜けると、そのあとの処理が実行されます。

投稿2022/06/14 01:09

can110

総合スコア38262

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

muts

2022/06/14 09:50

ありがとうございます。無事解決しました。cv2.destroyAllWindows()にばかり目が行っていて気づけませんでした。コードを上からしっかり読み解いていくように意識して勉強していきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問