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

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

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

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

Python 3.x

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

Python

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

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

2507閲覧

エラー:UnboundLocalError: local variable 'gray' referenced before assignment を解決したいです。

cherei

総合スコア12

NumPy

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

Python 3.x

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

Python

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2019/12/08 09:30

編集2019/12/08 13:38

以下のエラーの改善がわかりません。
UnboundLocalError: local variable 'gray' referenced before assignment

test2というフォルダにチェスボードを撮影した画像を10枚いれています。
最近始めたばかりでわからないことが多いのでご教授いただきたいです。よろしくお願いします。

以下のサイトは見ましたがよくわかりませんでした。
[https://teratail.com/questions/149453
]

python

1import numpy as np 2import cv2 3import glob 4 5def Calibration(path): 6 # termination criteria 7 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) 8 9 # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0) 10 objp = np.zeros((6 * 8, 3), np.float32) 11 objp[:, :2] = np.mgrid[0:8, 0:6].T.reshape(-1, 2) 12 13 # Arrays to store object points and image points from all the images. 14 objpoints = [] # 3d point in real world space 15 imgpoints = [] # 2d points in image plane. 16 17 images = sorted(glob.glob(path + '*.jpg')) 18 19 i = 1 20 for fname in images: 21 img = cv2.imread(fname) 22 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 23 24 # Find the chess board corners 25 ret, corners = cv2.findChessboardCorners(gray, (8, 6), flags=cv2.CALIB_CB_FAST_CHECK) 26 print(ret) 27 # If found, add object points, image points (after refining them) 28 if ret == True: 29 objpoints.append(objp) 30 31 corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria) 32 imgpoints.append(corners2) 33 34 # Draw and display the corners 35 img = cv2.drawChessboardCorners(img, (8, 6), corners2, ret) 36 height = img.shape[0] 37 width = img.shape[1] 38 # cv2.imshow('img',img) 39 40 cv2.waitKey(500) 41 i = i + 1 42 cv2.destroyAllWindows() 43 44 ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) 45 i = 0 46 for fname in images: 47 img = cv2.imread(fname) 48 h, w = img.shape[:2] 49 newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h)) 50 # undistort 51 52 dst = cv2.undistort(img, mtx, dist, None, newcameramtx) 53 # crop the image 54 x, y, w, h = roi 55 dst = dst[y:y + h, x:x + w] 56 cv2.imwrite('calibration_result/calibresult' + str(i)+ '.jpg', dst) 57 i = i + 1 58 print("A=\n{0}".format(newcameramtx)) 59 print("R=\n{0}".format(rvecs[0])) 60 print("t=\n{0}".format(tvecs[0])) 61 R_t = np.hstack((rvecs, tvecs)) 62 print("[R|t]={0}".format(R_t)) 63 64 65 np.save('camera_data/camera_matrix', newcameramtx) 66 np.save('camera_data/distCoeffs', dist) 67 np.save('camera_data/roi',roi) 68 69 return newcameramtx 70 71def video_split(path): 72 i = 0 73 cap = cv2.VideoCapture(path) 74 while (cap.isOpened()): 75 flag, frame = cap.read() # Capture frame-by-frame 76 if flag == False: # Is a frame left? 77 break 78 if i % 50 ==0: 79 cv2.imwrite("calb_test/test2/" + str(i) + ".jpg", frame) # Save a frame 80 print("test" + str(i) + ".jpg") 81 i += 1 82 83 cap.release() # When everything done, release the capture 84# 85if __name__ == '__main__': 86 # video_split('calb_test/test.mov') 87 A = Calibration('calb_test/test2/') 88 print(A)
Traceback (most recent call last): File "C:/Users/tampa/PycharmProjects/camera-calib/Camera_Calibration.py", line 134, in <module> A = Calibration('calb_test/test2/') File "C:/Users/tampa/PycharmProjects/camera-calib/Camera_Calibration.py", line 91, in Calibration ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) UnboundLocalError: local variable 'gray' referenced before assignment

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

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

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

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

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

hayataka2049

2019/12/08 10:17

エラーメッセージ全文を追記してください(tracebackの先頭から)。
cherei

2019/12/08 13:06

Traceback (most recent call last): File "C:/Users/tampa/PycharmProjects/camera-calib/Camera_Calibration.py", line 134, in <module> A = Calibration('calb_test/test2/') File "C:/Users/tampa/PycharmProjects/camera-calib/Camera_Calibration.py", line 91, in Calibration ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None) UnboundLocalError: local variable 'gray' referenced before assignment
cherei

2019/12/08 13:07

返信遅れてすみません。上記の通りになります。よろしくお願いいたします。
hayataka2049

2019/12/08 13:08

質問文を編集して追記してください(この欄に書かれても見え辛いため)
hayataka2049

2019/12/08 13:08

エラーもコードブロックにてお願いします。
cherei

2019/12/08 13:31

コードブロックというのがわかりません。すみません。これでよろしいですか。
guest

回答1

0

ベストアンサー

UnboundLocalErrorという例外は、対象のローカル変数に対して代入が行われる前に参照が行われた……ということを意味しています。

python

1 for fname in images: 2 img = cv2.imread(fname) 3 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

の部分(22行目)で変数grayに対しては代入が行われているはずですが、forループが一回も実行されなければ質問文の状況になるかと思います。さしあたってはimagesがどうなっているのかを確認すると良いのではないでしょうか。

投稿2019/12/08 13:43

hayataka2049

総合スコア30933

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

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

cherei

2019/12/08 13:49

if __name__ == '__main__': A = Calibration('calb_test/test2/') 最後のここの部分でpathを通していると思っているのですが、それは間違いですか
cherei

2019/12/08 13:51

間の部分をコメントアウトして実行してみました。imagesには何も入っていないらしいです。
hayataka2049

2019/12/08 13:57

一般的に「pathを通す」と言われる操作とは無関係です。質問文のコードで得られているimagesは、glob.glob("calb_test/test2/*.jpg")を実行した結果のはずですが、この結果が空のリストになることは十分ありえます(その動作を望まないのであれば修正する必要がありますが、どのように修正したら良いのかは私にはわかりません。情報が限られていて、お答えできません。ヒントになり得ることを書いておくと、一般的なファイル探索は実行時カレントディレクトリ基準の相対パスになるので、これに関連して何かが間違っている可能性はあるでしょう。絶対パスにすればこの部分に関しては上手くいく可能性は蓋然的には高いです)。
cherei

2019/12/08 14:19 編集

参照するファイル名が間違っていました。。。申し訳ありません。 上のエラーは消えましたが、また違ったエラーが出てきたのでまずは自分で考えてみます。 ありがとうございました。
cherei

2019/12/08 14:35

出来ました!!!!!ご丁寧にありがとうございます!!!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問