前提・実現したいこと
pythonでリンゴを認識し、ガイドを表示するシステムを作成しています。
画像のオーバーレイを実装中に以下のエラーメッセージが発生しました。
発生している問題・エラーメッセージ
Traceback (most recent call last): File "c:/Users/Owner/Documents/anaconda_vs/appale_project/camera-test.py", line 161, in <module> frame = window_fullscreen(frame) File "c:/Users/Owner/Documents/anaconda_vs/appale_project/camera-test.py", line 98, in window_fullscreen frame = np.copy(noncover) NameError: name 'noncover' is not defined
該当のソースコード
python
1#カメラでテスト 2import cv2 3import numpy as np 4from keras.models import load_model 5import os 6import time 7import datetime 8from PIL import ImageFont, ImageDraw, Image 9 10 11#カテゴリ名 12category = ['maru', 13 'half', 14 '1/4', 15 '1/8', 16 'cutcore', 17 'complete'] 18 19#読み込むモデル 20in_model = 'appale_model_15.h5' 21 22#画像サイズ 23image_size = 60 24 25try: 26 model = load_model('./' + in_model) 27except OSError: 28 print('エラー:./' + in_model + 'が見つかりません。') 29 exit() 30 31#オーバーレイ関数 32def overlayImage(src, ovly, location): 33 ovly_height, ovly_width = ovly.shape[:2] 34 35 #背景をPILに変換 36 src = cv2.cvtColor(src, cv2.COLOR_BGR2RGB) 37 pil_src = Image.fromarray(src) 38 pil_src = pil_src.convert('RGBA') 39 40 #オーバーレイをPILに変換 41 ovly = cv2.cvtColor(ovly, cv2.COLOR_BGRA2RGBA) 42 pil_ovly = Image.fromarray(ovly) 43 pil_ovly = pil_ovly.convert('RGBA') 44 45 #画像を合成 46 pil_tmp = Image.new('RGBA', pil_src.size, (255, 255, 255, 0)) 47 pil_tmp.paste(pil_ovly, location, pil_ovly) 48 result_image = Image.alpha_composite(pil_src, pil_tmp) 49 50 #opencv形式に変換 51 return cv2.cvtColor(np.asarray(result_image), cv2.COLOR_RGBA2BGRA) 52 53 54#カメラを開始 55cap = cv2.VideoCapture(0) 56 57#分類機の指定 58cascade = cv2.CascadeClassifier(r'C:\Users\Owner\Documents\anaconda_vs\appale_project\cascadeMAX.xml') 59 60def window_fullscreen(frame): 61 cv2.namedWindow('screen', cv2.WINDOW_NORMAL) 62 cv2.setWindowProperty('screen', cv2.WND_PROP_FULLSCREEN, cv2.WINDOW_FULLSCREEN) 63 cv2.imshow('screen', frame) 64 global noncover 65 frame = np.copy(noncover) 66 return frame 67 68def detect_which(apple_image): 69 #結果を格納 70 result = model.predict(apple_image)[0] 71 #一番可能性の高い配列の添え字を返す 72 predicted = result.argmax() 73 percentage = int(result[predicted] * 100) 74 #カテゴリ名と確率を表示 75 print('{0} {1}%'.format(category[predicted], percentage)) 76 77 return category[predicted] 78 79#繰り返しカメラ画像を確認 80while cap.isOpened(): 81 ok, frame = cap.read() 82 if not ok: break 83 #画像の反転 84 frame = cv2.flip(frame, 1) 85 86 apple_list = cascade.detectMultiScale(frame, scaleFactor=1.2, minNeighbors=2, minSize=(100, 100)) 87 #リンゴが検出された 88 if len(apple_list) > 0: 89 #リンゴの数だけループ 90 for rect in apple_list: 91 x, y, width, height = rect 92 93 apple_image = frame[rect[1]:rect[1]+rect[3], rect[0]:rect[0]+rect[2]] 94 if frame.shape[0] < 400: 95 continue 96 97 apple_image = cv2.resize(apple_image, (image_size, image_size)) 98 apple_image = np.expand_dims(apple_image, axis= 0) 99 name = detect_which(apple_image) 100 101 cv2.rectangle(frame, tuple(rect[0:2]), tuple(rect[0:2] + rect[2:4]), (0, 0, 255), thickness = 3) 102 cv2.putText(frame, name, (x, y + height + 20), cv2.FONT_HERSHEY_DUPLEX, 1, (0, 0, 255), 2) 103 104 #重ねる画像の読み込み 105 img_kasane = cv2.imread(r'C:\Users\Owner\Documents\anaconda_vs\00032.jpg', cv2.IMREAD_UNCHANGED) 106 107 noncover = np.copy(frame) 108 #画像のオーバーレイ 109 frame = overlayImage(frame, img_kasane, (45, 45)) 110 111 frame = window_fullscreen(frame) 112 113 if cv2.waitKey(1) == 27: break 114 115cap.release() 116cv2.destroyAllWindows()
試したこと
Numpy配列のコピーの仕方をいくつか試した(np.copy, frame[:]など)
コピーした(つもり)次の行でNumpy配列の中身確認-->同様のエラー
補足情報(FW/ツールのバージョンなど)
・keras2.3.1
・matplotlib3.3.4
・opencv3.3.1
・python3.6,13
・anaconda3
・tensorflow2.1.0
回答2件
あなたの回答
tips
プレビュー