线激光扫描重建中的坐标转换问题

线激光扫描重建中的坐标转换问题

1.张氏标定

相机标定的目的:获取摄像机的内参、外参矩阵以及畸变系数。其中内参是指相机的内在参数,从相机坐标系到像素坐标系之间的关系;外参是指相机模型相对于标定板,即相机坐标系相对于世界坐标系的旋转矩阵和平移矩阵;对之后相机拍摄的图像就进行矫正,得到畸变相对很小的图像。
在这里插入图片描述
注意:这里的Zc为缩放因子,也写作s,是为了使得像素坐标能够齐次进行矩阵运算,缩放因子s的值与相机坐标系中的Zc的值相同。

缩放因子的推导
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

2.线激光平面的标定

在线激光平面的标定中,选择相机坐标系作为参考坐标系(重建也选用此坐标系),故我们需要将采集到的不同位姿情况下的线激光条纹上像素点都转换到相机坐标系下进行平面拟合。

2.1从像素坐标系到世界坐标系

注意:此时从像素坐标系转换到世界坐标系时,不同的像素点对应的缩放因子都不同(即每个像素点对应Zc都不同),故需要先求出每个像素点的缩放因子,再得到每个点的世界坐标。C++代码如下:

cv::Point3f getWorldPoints_copy(cv::Point2f inPoints, cv::Mat rvec, cv::Mat tvec, cv::Mat cameraMatrix)//获取实际世界坐标(像素坐标,旋转向量,平移向量,内参)
{
	//initialize parameter
	cv::Mat rotationMatrix;//定义3*3的旋转矩阵
	Rodrigues(rvec, rotationMatrix);//将旋转向量转化为旋转为矩阵
	double zConst = 0;//世界坐标系z的固定值0
	double s;

	//获取图像坐标
	cv::Mat imagePoint = (cv::Mat_<double>(3, 1) << double(inPoints.x), double(inPoints.y), 1);//将像素二维坐标inpoints进行一个三行一列的赋值imagepoint


	//计算比例参数S

	cv::Mat tempMat, tempMat2;
	tempMat = rotationMatrix.inv() * cameraMatrix.inv() * imagePoint;//等式左边
	tempMat2 = rotationMatrix.inv() * tvec;//等式右边
	s = zConst + tempMat2.at<double>(2, 0);
	s /= tempMat.at<double>(2, 0);//s为缩放因子,都由等式左边和右边的矩阵的第三行相等求得
	

	//计算世界坐标
	cv::Mat wcPoint = rotationMatrix.inv() * (s * cameraMatrix.inv() * imagePoint - tvec);//利用像素坐标计算世界坐标
	cv::Point3f worldPoint(wcPoint.at<double>(0, 0), wcPoint.at<double>(1, 0), wcPoint.at<double>(2, 0));
	//cout << "【输出世界坐标点】" << endl << worldPoint << endl;
	return worldPoint;

	
	//计算世界坐标
	cv::Mat wcPoint = rotationMatrix.inv() * (s * cameraMatrix.inv() * imagePoint - tvec);//利用像素坐标计算世界坐标
	cv::Point3f worldPoint(wcPoint.at<double>(0, 0), wcPoint.at<double>(1, 0), wcPoint.at<double>(2, 0));
	//cout << "【输出世界坐标点】" << endl << worldPoint << endl;
	return worldPoint;
}

2.2从世界坐标系到相机坐标系

获取得到世界坐标系下的坐标后,因为每个线激光条纹都打在标定板上,可以利用相机外参进行坐标转换得到相机坐标系下的坐标。
或者也可以求出缩放因子s后,直接利用相机内参矩阵的逆进行求取得到相机坐标系下的坐标。

3.重建过程中三维点的求取

重建扫描时,我们需要将重建采集的每一帧的激光条纹上的中心线像素点转换到相机坐标系下,此时需要利用前面获取的线激光平面的参数。

3.1条纹像素点在相机坐标系下的坐标

此时选取一张标定板标定得到的相机内外参,可以通过2中的转换求取得到像素坐标在相机坐标下的坐标,由于张氏标定的定义可以知道,此时得到的相机坐标系下的坐标永远都存在于标定板表面(因为张氏标定定义世界坐标系下坐标点z=0)。此时得到并不是真实的坐标点,只是一种投影点(相当于这个真实三维点此时永远投影存在标定板上)。
为了获取真实的坐标点,需要将光心发出过此点的射线与平面进行联立求解。

3.2相机坐标系下真实三维点的坐标

线激光平面的方程:AX+BY+C*Z+D=0;
射线:(0,0,0)与(Xc,Yc,Zc)两个点构成;
联立射线与平面方程即可求出真实的三维点,即射线穿过激光平面的那个点。

注意:此时求解时,可以不必求出缩放因子,因为无论缩放因子为多少,这个坐标点都在过光心的射线上,只是位置不同而已。
即:
在这里插入图片描述
此处就将缩放因子是设置为了单位1,图中包含的内参和平面方程仅为举例。

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 我可以回答您的问题。要获取图标上像素点的坐标代码,您需要使用计算机编程语言来编写程序进行图像处理。您可以使用Python等语言的图像处理库,例如OpenCV或Pillow,来读取图像并获取像素点的坐标代码。具体的代码实现会因为不同的编程语言和库而有所不同。 ### 回答2: 识别图标上像素点坐标的代码可以使用图像处理的库来实现,如OpenCV或PIL库。下面是使用OpenCV库的一个示例代码: ```python import cv2 # 读取图像文件 image = cv2.imread('image.png') # 获取图像的宽度和高度 height, width = image.shape[:2] # 遍历图像的像素点 for y in range(height): for x in range(width): # 获取像素点的颜色值 color = image[y, x] # 判断像素点的颜色是否和目标颜色相似 # 这里可以根据实际需求来设置判断条件 if color[0] > 200 and color[1] > 200 and color[2] > 200: # 输出符合条件的像素点坐标 print('像素点坐标:', x, y) ``` 以上代码,首先使用cv2.imread函数读取图像文件,然后使用image.shape[:2]获取图像的宽度和高度。接着通过两个嵌套的for循环遍历图像的每一个像素点,并使用image[y, x]获取每个像素点的颜色值。最后判断颜色值是否符合条件(在示例判断颜色是否较接近白色),如果符合条件,则输出像素点的坐标。 ### 回答3: 要识别图标上像素点的坐标,可以通过编写代码来实现。下面是一个简单的例子: 假设有一张图标图片,保存为icon.png,并且我们已经加载了该图片。我们可以使用Python编写以下代码来识别图标上像素点的坐标: ```python import cv2 # 加载图标图片 icon = cv2.imread('icon.png') # 获取图标图片的宽度和高度 width, height, _ = icon.shape # 遍历图标图片的每个像素点 for x in range(width): for y in range(height): # 获取当前像素点的颜色信息 color = icon[x, y] # 判断当前像素点是否为我们想要的颜色(假设为红色) if color[2] > 200 and color[1] < 100 and color[0] < 100: # 输出符合条件的像素点坐标 print(f'符合条件的像素点坐标:({x}, {y})') ``` 以上代码使用OpenCV库读取图标图片,并使用双重循环遍历图标图片的每个像素点。通过判断像素点的颜色信息,可以筛选出我们想要的像素点,并输出其坐标信息。 在上述代码,假设我们想要识别红色像素点,因此判断条件为:红色(R通道值大于200)、绿色(G通道值小于100)、蓝色(B通道值小于100)。 当然,具体的识别条件和目标颜色可能需要根据实际情况进行调整。这只是一个简单的示例以帮助你理解识别图标上像素点坐标的原理和过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值