基于棋盘格的单幅标定算法实现与应用

版权申诉
0 下载量 7 浏览量 更新于2024-12-01 收藏 2KB RAR 举报
资源摘要信息:"biaoding.rar_biaoding" 根据提供的文件信息,我们可以提取出以下知识点: 标题知识点: 标题中提到了“biaoding.rar_biaoding”,这个名字暗示了这是一份关于棋盘格标定算法的压缩文件。RAR是一种常见的压缩文件格式,广泛用于文件压缩和归档。而“biaoding”这个词可能是指“标定”(calibration)的拼音。结合标题信息,我们可以推测这是一个与图像处理、计算机视觉相关的标定程序。 描述知识点: 描述中提到的“一种基于单幅棋盘格的标定算法opencv程序”,提供了这个文件功能的核心描述。这里描述的知识点包括: - 棋盘格标定:在计算机视觉中,棋盘格是最常用的标定模式,它允许算法检测角点,通过这些角点的位置计算相机参数。 - 单幅标定:这是一种特殊的标定方法,意味着算法能够仅使用一张棋盘格图像来计算相机的内外参数,这在实际应用中非常方便,因为只需要一次拍摄。 - 外参数和内参数:在相机标定领域,内参数指的是相机镜头的焦距、主点坐标、畸变系数等,它们描述了相机自身的成像特性;外参数则是指相机相对于世界坐标系的位置和方向,也就是相机的旋转和平移信息。 - OpenCV:这是一个开源的计算机视觉和机器学习软件库,提供了大量的图像处理和计算机视觉相关的功能,是当前该领域内使用最广泛的工具之一。 标签知识点: 标签“biaoding”在此处再次出现,与标题中的信息相吻合。标签的使用旨在标识文件内容,方便检索和分类。在IT领域,合理利用标签能够帮助我们快速定位到相关资源。 压缩包子文件的文件名称列表知识点: 文件名称列表中只有一个文件:“biaoding.cpp”。这个文件名透露了文件类型为C++源代码文件。在C++文件的命名中,通常使用.cpp作为后缀,表明这是一个编译型语言的源代码文件。由此我们可以推测,该压缩文件可能包含了用于实现单幅棋盘格标定算法的C++代码。 综上所述,这个“biaoding.rar_biaoding”压缩文件包很可能包含了实现单幅棋盘格标定算法的C++源代码,该算法用于计算相机的内外参数,并且与OpenCV库紧密相关。这份资源对于学习和研究计算机视觉、图像处理、机器人视觉系统的开发人员来说具有重要的价值。通过使用OpenCV库中的函数和类,开发者可以利用这份标定程序来提高相机捕获图像的质量,从而在后续的图像处理任务中获得更准确的结果。

mport cv2 import numpy as np import glob # 找棋盘格角点 # 阈值 criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 30, 0.001) #棋盘格模板规格 w = 9 h = 6 # 世界坐标系中的棋盘格点,例如(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 = [] # 在图像平面的二维点 images = glob.glob('C:/yingxiang/biaoding.png') 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) # 去畸变 img2 = cv2.imread('calib/00169.png') 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] cv2.imwrite('calibresult.png',dst) # 反投影误差 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))这段代码为什么会报错

2023-06-02 上传