有没有专业人士看一看为什么把路径改了之后就有这个问题了,求球了
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
问题原因是在标定阶段使用了变量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)