关于单目相机标定的代码错误

有没有专业人士看一看为什么把路径改了之后就有这个问题了,求球了
NameError: name 'gray' is not defined


#coding:utf-8
import cv2
import os
import numpy as np
import glob
 
# 找棋盘格角点
# 阈值
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001)
#棋盘格模板规格
w = 11
h = 8
# 世界坐标系中的棋盘格点,例如(0,0,0), (1,0,0), (2,0,0) ....,(8,5,0),去掉Z坐标,记为二维矩阵
objp = np.zeros((w*h,3), np.float32)
objp[:,:2] = np.mgrid[0:w,0:h].T.reshape(-1,2)
# 储存棋盘格角点的世界坐标和图像坐标对
objpoints = [] # 在世界坐标系中的三维点
imgpoints = [] # 在图像平面的二维点
img_save = r'C1-calibration-picture'
if not os.path.exists(img_save):
    os.makedirs(img_save)
images = glob.glob(r'Desktop/Multi Camera/software/C1-picture/*.jpg')
for fname in images:
    img = cv2.imread(fname)
    gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
    # 找到棋盘格角点
    ret, corners = cv2.findChessboardCorners(gray, (w,h),None)
    # 如果找到足够点对,将其存储起来
    if ret == True:
        cv2.cornerSubPix(gray,corners,(11,11),(-1,-1),criteria)
        objpoints.append(objp)
        imgpoints.append(corners)
        # 将角点在图像上显示
        cv2.drawChessboardCorners(img, (w,h), corners, ret)
        cv2.imshow('findCorners',img)
        cv2.waitKey(1)
cv2.destroyAllWindows()
 
# 标定
ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
 
# 去畸变
images = glob.glob(r'Desktop/Multi Camera/software/C1-picture/*.jpg')
for fname in images:
    img2 = cv2.imread(fname)
    img_name = fname.split('\\')[-1]
    h,w = img2.shape[:2]
    newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h)) # 自由比例参数
    dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
    # 根据前面ROI区域裁剪图片
    x,y,w,h = roi
    dst = dst[y:y+h, x:x+w]
    store_name = img_save + '\calibresult_' + img_name
    cv2.imwrite(store_name,dst)
    
# print("ret:",ret)   
print("mtx_内参:\n",mtx)                     # 内参数矩阵
print("dist畸变值:\n",dist)              # 畸变系数   distortion cofficients = (k_1,k_2,p_1,p_2,k_3)
# print("rvecs旋转(向量)外参:\n",rvecs)    # 旋转向量  # 外参数
# print("tvecs平移(向量)外参:\n",tvecs)    # 平移向量  # 外参数
# print('newcameramtx外参',newcameramtx)

# 反投影误差
total_error = 0
for i in range(len(objpoints)):
    imgpoints2, _ = cv2.projectPoints(objpoints[i], rvecs[i], tvecs[i], mtx, dist)
    error = cv2.norm(imgpoints[i],imgpoints2, cv2.NORM_L2)/len(imgpoints2)
    total_error += error
print("total error: ", total_error/len(objpoints))
Traceback (most recent call last):
  File "F:\python-xmu\duomuxiangji\paizhao\test1.py", line 40, in 
    ret, mtx, dist, rvecs, tvecs = cv2.calibrateCamera(objpoints, imgpoints, gray.shape[::-1], None, None)
NameError: name 'gray' is not defined

以下内容部分参考ChatGPT模型:


问题原因是在标定阶段使用了变量gray,但是在去畸变阶段没有定义gray变量导致报错。需要在去畸变的for循环中定义gray变量。

解决思路:
在去畸变的for循环中添加定义gray变量的代码即可解决问题。

# 去畸变
images = glob.glob(r'Desktop/Multi Camera/software/C1-picture/*.jpg')
for fname in images:
    img2 = cv2.imread(fname)
    gray = cv2.cvtColor(img2,cv2.COLOR_BGR2GRAY)  # 添加定义gray变量的代码
    img_name = fname.split('\\')[-1]
    h,w = img2.shape[:2]
    newcameramtx, roi=cv2.getOptimalNewCameraMatrix(mtx,dist,(w,h),0,(w,h)) # 自由比例参数
    dst = cv2.undistort(img2, mtx, dist, None, newcameramtx)
    # 根据前面ROI区域裁剪图片
    x,y,w,h = roi
    dst = dst[y:y+h, x:x+w]
    store_name = img_save + '\calibresult_' + img_name
    cv2.imwrite(store_name,dst)

如果我的建议对您有帮助、请点击采纳、祝您生活愉快