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

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

ただいまの
回答率

87.48%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 6,283

score 12

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

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

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

import numpy as np
import cv2
import glob

def Calibration(path):
    # termination criteria
    criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)

    # prepare object points, like (0,0,0), (1,0,0), (2,0,0) ....,(6,5,0)
    objp = np.zeros((6 * 8, 3), np.float32)
    objp[:, :2] = np.mgrid[0:8, 0:6].T.reshape(-1, 2)

    # Arrays to store object points and image points from all the images.
    objpoints = []  # 3d point in real world space
    imgpoints = []  # 2d points in image plane.

    images = sorted(glob.glob(path + '*.jpg'))

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

        # Find the chess board corners
        ret, corners = cv2.findChessboardCorners(gray, (8, 6), flags=cv2.CALIB_CB_FAST_CHECK)
        print(ret)
        # If found, add object points, image points (after refining them)
        if ret == True:
            objpoints.append(objp)

            corners2 = cv2.cornerSubPix(gray, corners, (11, 11), (-1, -1), criteria)
            imgpoints.append(corners2)

            # Draw and display the corners
            img = cv2.drawChessboardCorners(img, (8, 6), corners2, ret)
            height = img.shape[0]
            width = img.shape[1]
            # cv2.imshow('img',img)

            cv2.waitKey(500)
        i = i + 1
    cv2.destroyAllWindows()

    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
    i = 0
    for fname in images:
        img = cv2.imread(fname)
        h, w = img.shape[:2]
        newcameramtx, roi = cv2.getOptimalNewCameraMatrix(mtx, dist, (w, h), 1, (w, h))
        # undistort

        dst = cv2.undistort(img, mtx, dist, None, newcameramtx)
        # crop the image
        x, y, w, h = roi
        dst = dst[y:y + h, x:x + w]
        cv2.imwrite('calibration_result/calibresult' + str(i)+ '.jpg', dst)
        i = i + 1
    print("A=\n{0}".format(newcameramtx))
    print("R=\n{0}".format(rvecs[0]))
    print("t=\n{0}".format(tvecs[0]))
    R_t = np.hstack((rvecs, tvecs))
    print("[R|t]={0}".format(R_t))


    np.save('camera_data/camera_matrix', newcameramtx)
    np.save('camera_data/distCoeffs', dist)
    np.save('camera_data/roi',roi)

    return newcameramtx

def video_split(path):
    i = 0
    cap = cv2.VideoCapture(path)
    while (cap.isOpened()):
        flag, frame = cap.read()  # Capture frame-by-frame
        if flag == False:  # Is a frame left?
            break
        if i % 50 ==0:
            cv2.imwrite("calb_test/test2/" + str(i) + ".jpg", frame)  # Save a frame
            print("test" + str(i) + ".jpg")
        i += 1

    cap.release()  # When everything done, release the capture
#
if __name__ == '__main__':
    # video_split('calb_test/test.mov')
    A = Calibration('calb_test/test2/')
    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
  • 気になる質問をクリップする

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2019/12/08 22:08

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

    キャンセル

  • hayataka2049

    2019/12/08 22:08

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

    キャンセル

  • cherei

    2019/12/08 22:31

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

    キャンセル

回答 1

checkベストアンサー

+2

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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/12/08 22:57

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

    キャンセル

  • 2019/12/08 23:18 編集

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

    キャンセル

  • 2019/12/08 23:35

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

    キャンセル

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

  • ただいまの回答率 87.48%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

閲覧数の多いPythonの質問