#cv2.puttextで書き込んだテキストを更新したい
前提・実現したいこと
ウェブカメラの映像から手のサインを読み取って、'active window left'ウィンドウと'active window right'ウィンドウにcv2.puttextでハンドサイン名を記述するプログラムを書いています。
発生している問題・エラーメッセージ
ハンドサインが切り替わったら、表示するハンドサイン名を上書きしたいのですが、以下のコードでは重ねて表示されてしまいます。 <例> やりたいこと "サムズアップ"と表示→ウィンドウをクリア→"ピース"と表示 実際 "サムズアップ"と表示→"サムズアップ"の上に"ピース"と重ねて表示 どうすれば解決できるか教えていただけないでしょうが。またコードの書き方が汚かったり、バグの危険がある場合は教えていただけたら幸いです。
該当のソースコード
python
1#メインのコード全体 2import cv2 3import mediapipe as mp 4import time 5import numpy as np 6from Lib.self_made import ( 7 handsign_judge, 8 time_mesure, 9 drowing, 10 ) 11 12mp_drawing = mp.solutions.drawing_utils 13mp_hands = mp.solutions.hands 14 15# For webcam input: 16hands = mp_hands.Hands( 17 min_detection_confidence=0.5, min_tracking_confidence=0.5) 18cap = cv2.VideoCapture(0) 19 20 21#オリジナル######################### 22 23font = cv2.FONT_HERSHEY_SIMPLEX #fontのところを元のまま書くと、cv2.FONT~ の.に反応してしまう 24 25##カメラ映像を録画 フレームレートが合わないので直さないといけない 26#fourcc=cv2.VideoWriter_fourcc(*'mp4v') # 書き出すコーデック名 27#out=cv2.VideoWriter('output.mp4',fourcc, 8.0, (640,480))#書き込むファイル 謎 フレームレート 縦横比? 28 29actwin_width=int(500) # 目に表示するウィンドウの大きさ 30actwin_height=int(500) 31ACTWIN_L_NAME='active window left' #ウィンドウの名前 32ACTWIN_R_NAME='active window right' 33 34PUPILLARY_DISTANCE=60.0 #瞳と瞳の距離(PD)[mm] 35VERTEX_DISTANCE=12 #(角膜)頂点間距離{mm} 通常12mmくらい 角膜の頂点とレンズ後方の距離 36DISPLAY_WIDTH=100 #眼鏡に取り付けるディスプレイの横幅[mm] 37#CAMERA_DISTANCE=150 #左右のカメラの距離[mm] 38 39cv2.namedWindow(ACTWIN_L_NAME) # これで一つwindowが開く 特に変数に代入したりする必要はない 40cv2.namedWindow(ACTWIN_R_NAME) 41 42#左右のディスプレイに表示する真っ黒の画像を生成 43BrackImg = np.zeros((actwin_height,actwin_width,3)) 44IMG_LEFT_NAME = 'ImgLeft.png' 45IMG_RIGHT_NAME = 'ImgRight.png' 46cv2.imwrite(IMG_LEFT_NAME,BrackImg) 47cv2.imwrite(IMG_RIGHT_NAME,BrackImg) 48ImgLeft = cv2.imread(IMG_LEFT_NAME) 49ImgRight = cv2.imread(IMG_RIGHT_NAME) 50#ここにアクティブウィンドウのスクショの画像を表示するやつを書く 51 52hoge2=drowing.drowing(BrackImg,ImgLeft,ImgRight,IMG_LEFT_NAME,IMG_RIGHT_NAME) 53 54######################################## 55 56 57while cap.isOpened(): 58 success, image = cap.read() 59 if not success: 60 print("Ignoring empty camera frame.") 61 # If loading a video, use 'break' instead of 'continue'. 62 continue 63 # Flip the image horizontally for a later selfie-view display, and convert 64 # the BGR image to RGB. 65 image = cv2.cvtColor(cv2.flip(image, 1), cv2.COLOR_BGR2RGB) 66 # To improve performance, optionally mark the image as not writeable to 67 # pass by reference. 68 image.flags.writeable = False 69 results = hands.process(image) 70 # Draw the hand annotations on the image. 71 image.flags.writeable = True 72 image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) 73 74 75 if results.multi_hand_landmarks: 76 77 for hand_landmarks in results.multi_hand_landmarks: 78 mp_drawing.draw_landmarks( #これで画像に書き込んでる 79 image, hand_landmarks, mp_hands.HAND_CONNECTIONS) 80 81 82 #オリジナル################################ 83 84 hoge1=handsign_judge.handsign_judge_1() 85 #タプルhanc_landmarks内の辞書型landmarkを取得 86 #辞書型を入れるにはタプル型の方が良い為 またパフォーマンスもタプル型の穂王が良い為 87 #詳細は調べる 88 for idx, landmark in enumerate(hand_landmarks.landmark): 89 # 番号とz座標を標準出力に表示 なんでlandmark[z]じゃダメなのか後で調べる 90 #print(idx,landmark.z) 91 92 hoge1.setting(idx,landmark.x,landmark.y,landmark.z) 93 print(hoge1.result()) 94 #↓defaultの黒い画面になってしまう 95 #cv2.imwrite(IMG_LEFT_NAME,BrackImg) 96 #cv2.imwrite(IMG_RIGHT_NAME,BrackImg) 97 #ImgLeft = cv2.imread(IMG_LEFT_NAME) 98 #ImgRight = cv2.imread(IMG_RIGHT_NAME) 99 hoge2.drowing_3Dview(hoge1.result()) 100 101 102 ############################################## 103 104 105 cv2.imshow('MediaPipe Hands', image) 106 cv2.imshow(ACTWIN_L_NAME,ImgLeft) #winname(ここではACTWIN_L_NAME)にmat(ここではImgLeft)を表示 107 cv2.imshow(ACTWIN_R_NAME,ImgRight) 108 #↓defaultの黒い画面になってしまう 109 #cv2.imwrite(IMG_LEFT_NAME,BrackImg) 110 #cv2.imwrite(IMG_RIGHT_NAME,BrackImg) 111 #ImgLeft = cv2.imread(IMG_LEFT_NAME) 112 #ImgRight = cv2.imread(IMG_RIGHT_NAME) 113 if cv2.waitKey(5) & 0xFF == 27: 114 break 115hands.close() 116cap.release() 117 118#out.release()#オリジナル 録画
python
1#Lib/self_made/drowing.py 2import cv2 3import numpy as np 4import Lib.self_made.handsign_judge #相対パス 5 6class drowing: 7 font = cv2.FONT_HERSHEY_SIMPLEX 8 9 10 def __init__(self,default,Img1=None,Img2=None,Img1_name=None,Img2_name=None): 11 self.default=default 12 self.ImgLeft=Img1#cv2で扱える形にしたもの? 13 self.ImgRight=Img2 14 self.ImgLeft_name=Img2_name#元の形? 15 self.ImgRight_name=Img2_name 16 self.text_kari_backup = None 17 pass 18 19 def Img_reset(self): 20 return #self.Img1,self.Img2 21 22 def drowing_3Dview(self,text_kari): 23 #↓defaultの黒い画面になってしまう 24 #if self.text_kari_backup != text_kari: 25 # #cv2.imwrite(self.ImgLeft_name,self.default) 26 # #cv2.imwrite(self.ImgRight_name,self.default) 27 # self.ImgLeft=cv2.imread(self.default) 28 # self.ImgRight=cv2.imread(self.default) 29 30 # self.text_kari_backup = text_kari 31 32 ##PIL型をopenCV型に変換 PIL型とは? 33 #new_image = np.array(ImgLeft, dtype=np.uint8) 34 #new_image = cv2.cvtColor(new_image, cv2.COLOR_RGB2BGR) 35 cv2.putText(self.ImgLeft,text_kari,(200,40),drowing.font,1,(255,255,255),2) 36 cv2.putText(self.ImgRight,text_kari,(200,40),drowing.font,1,(255,255,255),2)
試したこと
cv2.puttextを行う前に
python
1cv2.imwrite(self.ImgLeft_name,self.default) 2cv2.imwrite(self.ImgRight_name,self.default) 3self.ImgLeft=cv2.imread(self.default) 4self.ImgRight=cv2.imread(self.default)
を記述しました。
しかし今度はウィンドウにtext_kariが表示されず、デフォルトの黒い画面が表示し続けられてしまいます。
補足情報(FW/ツールのバージョンなど)
opencv-python 4.4.0.46
numpy 1.19.3
Python 3.8.5
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。