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

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

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

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

Q&A

解決済

1回答

234閲覧

pythonでfor文を使ってインスタンスの作成をしたいのです。

dendendenjirou

総合スコア40

Python 3.x

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

1グッド

0クリップ

投稿2018/06/03 21:45

pythonでfor文を用いてインスタンスの作成をしようとしているのですが

lang

1# coding: UTF-8 2import cv2 3import numpy as np 4 5class Roi(): 6 def __init__(self): 7 pass 8 9 def rect(self,roi,col,img): 10 11 x1 = roi[0] 12 y1 = roi[1] 13 x2 = roi[2] 14 y2 = roi[3] 15 cv2.rectangle(img, (x1, y1), (x2, y2), col, 2) 16 17#クリックイベントのコード省略 18 19def web_cam(): 20 while True: 21 ret, frame = cap.read() 22 img = frame 23 cv2.waitKey(100) 24 wname = 'Web Cam Image' 25 cv2.imshow(wname, img) 26 27 name.rect(a[0:4:1], (0, 255, 0),img) 28 ver.rect(a[4:8:1], (255, 0, 0),img) 29 lat.rect(a[8:12:1], (255, 255, 0),img) 30 long.rect(a[12:16:1], (0, 0, 255),img) 31 32 33if __name__ == '__main__': 34 cap = cv2.VideoCapture(0) 35 a=[] 36 37 roi_name = ['name','ver','lat','long'] 38 for i in roi_name: 39 i = Roi() 40 41 ret, frame = cap.read() 42 img = frame 43 wname = "select area" 44 45 cv2.imshow(wname, img) 46 cv2.setMouseCallback(wname, onMouse, [wname, img]) 47 48 while cv2.waitKey(0) == 27: 49 break 50

上記コードのfor文を使ってインスタンス作成を試みているのですが
その後、インスタンス使用時 web_camの関数内で

lang

1NameError: name 'name' is not defined

のエラーが出てしまいます。
どなたか、ご教授願えないでしょうか。
まだ、作成半ばですので上記質問部分以外にも、おかしなコードがあるかもしれませんがよろしくお願いいたします。

set0gut1👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

python

1roi_name = ['name','ver','lat','long'] 2for i in roi_name: 3 i = Roi()

↑この記述ですが、

i = 'name' i = Roi()

みたいな代入を4回繰り返す処理であり、インスタンスがnameではなくiに格納されて、nameという変数自体は未定義になっているのが原因です。

python

1exec('%s = Roi()' % i)

とすれば name = Roi() を実行して変数nameにインスタンスを格納することができますが、怪しいのでおすすめしません。
見た感じ、矩形がどんどん増えていくものではなさそうなので、for文を使わず素朴に書くのが良いと思います。

python

1name = Roi() 2ver = Roi() 3lat = Roi() 4long = Roi()

投稿2018/06/03 21:59

編集2018/06/03 22:00
set0gut1

総合スコア2413

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

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

dendendenjirou

2018/06/03 22:47

早速の回答ありがとうございます。 アドバイス通り素朴にコードを書くことにしました。 また、exec('%s = Roi()' % i)のコード勉強になりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問