非常详细的相机标定(五)(相机标定代码讲解)

非常详细的相机标定原理、步骤(一)(世界坐标系与相机坐标系原理与转化)_An efforter的博客-CSDN博客_最详细、最完整的相机标定讲解

非常详细的相机标定原理、步骤(二)(图像坐标系与像素坐标系原理与转化,三维转二维原理与公式等等)_An efforter的博客-CSDN博客

非常详细的相机标定原理(三)(张正友相机标定法初见和单应性矩阵)_An efforter的博客-CSDN博客

非常详细的相机标定原理(四)(张正友相机标定法数学推导求解)_An efforter的博客-CSDN博客

非常详细的相机标定(六)(2维坐标点转为3维坐标点)_An efforter的博客-CSDN博客 

相机标定以及相机畸变矫正代码

代码分布清晰,一看就懂:

import argparse
from argparse import RawTextHelpFormatter
import numpy as np
import cv2 

#寻找焦点
def cam_calib_find_corners(img, rlt_dir, img_idx, col, row):
	#灰度化图片,减少参数的运算
	gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
	#寻找角点
	ret, corners = cv2.findChessboardCorners(gray,(col,row), None)
	#为了得到稍微精确一点的角点坐标,进一步对角点进行亚像素寻找
	corners2 = cv2.cornerSubPix(gray, corners, (5, 5), (-1, -1), (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 10, 0.001)) 
	print(corners)
	if ret == True:
		#保存角点图像
		sav_path = rlt_dir + "\\" + str(img_idx) + "_corner.jpg"
		#绘制角点
		cv2.drawChessboardCorners(img, (col,row), corners2, ret)
		cv2.imwrite(sav_path, img)
		
	return (ret, corners2)
#相机标定
def cam_calib_calibrate(img_dir, rlt_dir, col, row, img_num):
	w = 0
	h = 0
	all_corners = []
	patterns = []
	#标定相机,先搞这么一个假想的板子,标定就是把图像中的板子往假想的板子上靠,靠的过程就是计算参数的过程
	x,y = np.meshgrid(range(col),range(row))
	prod = row * col
	pattern_points=np.hstack((x.reshape(prod,1),y.reshape(prod,1),np.zeros((prod,1)))).astype(np.float32)
	
	for i in range(1,img_num+1):
		img_path = img_dir + "\\" + str(i) + ".jpg"
		print (img_path)
		#读取图像
		img = cv2.imread(img_path)
		(h, w) = img.shape[:2]
		#提取角点
		ret, corners = cam_calib_find_corners(img, rlt_dir, i, col, row)
		
		#合并所有角点
		all_corners.append(corners)
		patterns.append(pattern_points)
   #rms代表返回成功,cameraMatrix代表相机内参,disCoeffs代表畸变,rvecs代表旋转向量,tvecs平移向量,最后两个是相机外参
	rms, cameraMatrix, distCoeffs, rvecs, tvecs = cv2.calibrateCamera(patterns, all_corners, (w, h), None, None)
	print('相机内参',cameraMatrix)
	print('相机外参旋转向量',rvecs)
	print('相机外参平移向量',tvecs)
	return (cameraMatrix, distCoeffs)

def cam_calib_correct_img(crct_img_dir, cameraMatrix, distCoeffs):
	for i in range(1,3):
		crct_img_path = crct_img_dir + "\\" + str(i) + ".jpg"
		print(crct_img_path)
		img = cv2.imread(crct_img_path)
		(h1, w1) = img.shape[:2]
		#对参数做处理,使得最后的输出的矫正图像去表不必要的边缘。
		newcameramtx,roi = cv2.getOptimalNewCameraMatrix(cameraMatrix,distCoeffs,(w1,h1),1,(w1,h1))
		
		#矫正
		dst = cv2.undistort(img, cameraMatrix, distCoeffs, None, newcameramtx)

		# 保存矫正图像
		x,y,w,h = roi
		dst = dst[y:y+h, x:x+w]
		rlt_path = crct_img_dir + "\\rlt\\" + str(i) + "_crct.jpg"
		cv2.imwrite(rlt_path, dst)
	
if __name__ == "__main__":
	parser = argparse.ArgumentParser(description="读取标定的图片并保存结果",formatter_class=RawTextHelpFormatter)
	parser.add_argument("--img_dir",help="标定图片路径",type=str,metavar='', default='H:\\camera_code\\calib_img')
	parser.add_argument("--rlt_dir",help="保存路径",type=str,metavar='',default="H:\\camera_code\\rlt_dir")
	parser.add_argument("--crct_img_dir",help="待矫正图像路径",type=str,metavar='',default="H:\\camera_code\\crct_img")
	parser.add_argument("--row_num",help="每一行有多少个角点,边缘处的不算",type=int,metavar='',default="7")
	parser.add_argument("--col_num",help="每一列有多少个角点,边缘处的不算",type=int,metavar='',default="6")
	parser.add_argument("--img_num",help="多少幅图像",type=int,metavar='',default="21")

	args=parser.parse_args()
	
	# 标定相机
	cameraMatrix, distCoeffs = cam_calib_calibrate(args.img_dir, args.rlt_dir, args.row_num, args.col_num, args.img_num)
	
	#矫正图片
	cam_calib_correct_img(args.crct_img_dir, cameraMatrix, distCoeffs)







项目文件结构: 

 

 想要整体代码与资料的,请联系我。

  • 4
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 双目相机标定是用来确定相机内外参数的一种常见方法。相机内参数包括主点坐标、像素宽高比、焦距和畸变系数等,而相机外参数包括旋转矩阵和平移向量。双目相机标定代码c的主要目的是通过一系列图像来计算这些参数。 在双目相机标定代码c中,一般需要使用棋盘格或者标定板来进行标定。首先,需要用棋盘格或者标定板拍摄多张不同位置的图像。然后,通过对这些图像进行处理,可以得到每张图像上棋盘格或标定板角点的像素坐标。 接下来,需要将每张图像的角点像素坐标和实际世界坐标进行对应。实际世界坐标一般可以通过标定板的大小和格子之间的间隔得到。通过这些对应关系,可以计算相机内参数和外参数。 相机内参数通常使用标定矩阵来表示,其中包括焦距、主点坐标 和像素宽高比等信息。而畸变系数则可以用一组参数来描述相机镜头的畸变特性,比如径向和切向畸变等。 相机外参数则表示相机在世界坐标系中的位置和姿态。通过双目相机标定代码c可以计算得到旋转矩阵和平移向量,用来描述相机坐标系相对于世界坐标系的变换关系。 通过双目相机标定可以得到相机内外参数,从而在后续的双目视觉应用中进行立体匹配和三维重建等任务。双目相机标定代码c提供了一种自动计算相机参数的方法,减少了手动操作的复杂性和错误。 总之,双目相机标定代码c可以帮助我们准确计算相机的内外参数,以便在后续的双目视觉应用中有效地进行图像处理和计算。 ### 回答2: 双目相机标定是一种常用的技术,旨在通过对双目相机的参数进行精确测量和校正,来获取两个相机之间的相对位置和方向关系,实现双目视觉的准确测量和三维重建等应用。 双目相机标定代码(C)通常包括以下几个步骤: 1. 准备标定板:首先需要准备一个已知尺寸的标定板,在两个相机的视野范围内进行放置和拍摄。标定板可以是平面的,上面有特殊的几何图案。 2. 拍摄图像:使用双目相机分别对标定板拍摄一组图像,确保拍摄过程中相机的位置和方向保持稳定。拍摄图像时,需要保证标定板在不同位置、角度和距离上都有充分的覆盖,以获取更好的标定结果。 3. 提取角点:对拍摄的图像进行角点提取,使用角点检测算法寻找标定板上的角点位置。角点提取可以使用OpenCV中的函数,如cv::findChessboardCorners()。 4. 标定计算:根据提取的角点位置数据,使用双目标定算法计算相机的内参矩阵、畸变系数、外参矩阵等相机参数。常用的标定算法包括Tsai算法、Zhang算法等。 5. 评估标定结果:完成标定计算后,需要对标定结果进行评估,通常使用重投影误差来评估标定的精度和准确性。重投影误差是指标定结果与实际角点位置之间的差异。 6. 应用标定结果:标定完成后,可以使用所得到的相机参数来进行双目视觉应用,如深度估计、三维重建、立体匹配等。校正双目图像是其中的一个重要应用,通过校正可以将两个相机的图像对齐,方便后续的立体匹配和深度计算。 双目相机标定代码(C)的实现可以使用OpenCV等图像处理库进行开发,这些库提供了丰富的函数和工具,用于在图像、角点、相机参数等之间进行转换和计算。标定结果的准确性和精度受到标定板的选择、角点提取的精度和标定算法的选择等因素的影响,因此,在实际应用中需要综合考虑各种因素,并进行必要的优化和调整。 ### 回答3: 双目相机标定是指通过对双目相机进行特定的数据收集和处理,以确定相机的内外参数,以及两个相机之间的相对位置和朝向关系,在三维定位和测量中起到重要的作用。 双目相机标定代码C语言实现的步骤主要包括以下几个方面: 1. 定义标定板:首先需要定义一个标定板,一般使用黑白相间的棋盘格,通过编写C代码来定义标定板的大小和格子的尺寸。 2. 采集标定图像:将标定板放置在不同位置和角度下,使用双目相机来采集标定图像,将图像保存为文件。 3. 检测角点:对标定图像进行处理,使用角点检测算法(如OpenCV库中的函数)来检测标定板上的角点位置。 4. 生成标定图像点对:将检测到的角点坐标与实际标定板上的角点坐标进行对应,并保存这些点对。 5. 生成内参数矩阵:根据标定图像点对,利用内参数标定方法(如高斯-牛顿法)来求解相机的内参数矩阵。 6. 生成外参数矩阵:利用内参数矩阵和标定图像点对,通过三维-二维坐标变换方法(如张正友标定法)来求解相机的外参数矩阵。 7. 标定结果输出:将求解得到的内外参数矩阵输出到文件中,以便后续使用。 以上就是使用C语言实现双目相机标定代码的基本步骤,根据具体需求,还可以添加一些其他的功能,如畸变矫正等。使用C语言编写标定代码需要熟悉相机模型、线性代数、图像处理等知识,同时需要利用图像处理库(如OpenCV)来实现相关的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值