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

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

新規登録して質問してみよう
ただいま回答率
85.48%
多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1077閲覧

NumPy配列のコピーが出来ない

keita_kkk

総合スコア17

多次元配列

1次元配列内にさらに配列を格納している配列を、多次元配列と呼びます。

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

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

コピー

元のオブジェクトを破壊することなく、オブジェクトの複製を生成することをコピーと呼びます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/08/25 11:47

前提・実現したいこと

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

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

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

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

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

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

meg_

2021/08/25 11:56

globalを使わなければならない理由がなければ引数として渡した方が分かりやすいのではないですか?
keita_kkk

2021/08/25 12:59 編集

そのまま渡してしまうとオーバーレイをしたことで配列の中身が増えてしまいエラーがでてしまいます。 なので、globalを使っています。
meg_

2021/08/25 12:54

よく分かりませんが引数としては渡せない理由があるのですね。了解しました。
guest

回答2

0

ベストアンサー

エラーメッセージが表示される原因は、グローバル変数noncoverが定義されていない状態で、関数window_fullscreenが実行されるためです。

グローバル変数noncoverは、コードを見ると、

Python

1while cap.isOpened(): 2 () 3 if len(apple_list) > 0: 4 for rect in apple_list: 5 () 6 noncover = np.copy(frame) 7 () 8 frame = window_fullscreen(frame) 9 ()

のように、if文のブロックの中でしか定義されていないので、whileループを開始して、if文の条件が成立しないままwindow_fullscreenが呼び出されると、件のエラーメッセージが発生します。

while文より前など、必ず実行される位置でnoncoverを定義してやればいいのでは。それで、質問者の想定通りの処理が行なわれるかは分かりませんが。

投稿2021/08/25 14:59

編集2021/08/25 15:00
Daregada

総合スコア11990

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

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

keita_kkk

2021/08/26 01:03

なるほど。変数のスコープの問題だったのですね。改善したところ、エラーは出なくなりました。 ありがとうごさいます!
guest

0

NameError: name 'noncover' is not defined

noncoverという変数は定義されていません。

というエラーなので、コピーの方法がどうであってもエラーは出るでしょう。

どこかでnoncoverを定義するのを忘れているか、考え違いをしているかでしょう。

投稿2021/08/25 12:17

ppaul

総合スコア24666

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

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

keita_kkk

2021/08/25 12:47

そうなんですね... よろしければ、どの辺が問題か教えていただけますか?
ppaul

2021/08/25 14:31

frame = np.copy(noncover) という文で、いったい何をしたいのかが分かりません。 なぜ、ここにnoncoverというものが出てくるのかを説明していただければ、なにか指摘できるかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問