CSK.Blog--个人原创Weblog

« 基于AVR的室外太阳能气象站一年工作情况报告自制低成本3D激光扫描测距仪(3D激光雷达),第二部分 »

自制低成本3D激光扫描测距仪(3D激光雷达),第一部分

本文介绍我从今年十一假期开始制作的激光3D扫描测距仪的相关原理和制作细节。对于先前提到的激光键盘制作将会在后续文章中详细介绍,不过他们的核心原理是相同的。
这是本系列的第一部分,第二部分请访问
自制低成本3D激光扫描测距仪(3D激光雷达),第二部分
http://www.csksoft.net/blog/post/lowcost_3d_laser_ranger_2.html

版权信息:

本文采用CreativeCommons2.5授权许可,欢迎转载,但请保留原始作者信息以及原文链接。

在开始介绍原理前,先给出一些扫描得到的3D模型以及演示视频,给大家一个直观的认识。

相关的图片:

 

扫描得到的房间一角(点击查看原始尺寸)

扫描的我(点击查看原始尺寸)

扫描仪实物图

扫描仪实物

 

本文结构

  1. 简单介绍了激光雷达产品的现状
  2. 激光三角测距原理
  3. 线状激光进行截面测距原理
  4. 3D激光扫描仪的制作考虑
  5. 参考文献

简介-激光扫描仪/雷达

这里所说的激光扫描测距仪的实质就是3D激光雷达。如上面视频中展现的那样,扫描仪可以获取各转角情况下目标物体扫描截面到扫描仪的距离,由于这类数据在可视化后看起来像是由很多小点组成的云团,因此常被称之为:点云(Point Clould)。

在获得扫描的点云后,可以在计算机中重现扫描物体/场景的三维信息。

这类设备往往用于如下几个方面:

1) 机器人定位导航

目前机器人的SLAM算法中最理想的设备仍旧是激光雷达(虽然目前可以使用kinect,但他无法再室外使用且精度相对较低)。机器人通过激光扫描得到的所处环境的2D/3D点云,从而可以进行诸如SLAM等定位算法。确定自身在环境当中的位置以及同时创建出所处环境的地图。这也是我制作他的主要目 的之一。

2) 零部件和物体的3D模型重建

3) 地图测绘

现状

目前市面上单点的激光测距仪已经比较常见,并且价格也相对低廉。但是它只能测量目标上特定点的距离。当然,如果将这类测距仪安装在一个旋转平台上,旋转扫描一周,就变成了2D激光雷达 (LIDAR)。相比激光测距仪,市面上激光雷达产品的价格就要高许多:

图片: Hokuyo 2D激光雷达

上图为Hokuyo这家公司生产的2D激光雷达产品,这类产品的售价都是上万元的水平。其昂贵的原因之一在于他们往往采用了高速的光学振镜进行大角度范围(180-270)的激光扫描,并且测距使用了计算发射/反射激光束相位差的手段进行。当然他们的性能也是很强的,一般扫描的频率都在10Hz以上,精度也在几个毫米的级别。

2D激光雷达使用单束点状激光进行扫描,因此只能采集一个截面的距离信息。如果要测量3D的数据 ,就需要使用如下2种方式进行扩充:

  1. 采用线状激光器
  2. 使用一个2D激光雷达扫描,同时在另一个轴进行旋转。从而扫描出3D信息。

第一种方式是改变激光器的输出模式,由原先的一个点变成一条线型光。扫描仪通过测量这束线型光在待测目标物体上的反射从而一次性获得一个扫描截面的数据。这样做的好处是扫描速度可以很快 ,精度也比较高。但缺点是由于激光变成了一条线段,其亮度(强度)将随着距离大幅衰减,因此测距范围很有限。对于近距离(<10m)的测距扫描而言,这种方式还是很有效并且极具性价比的,本文介绍的激光雷达也使用这种方式,

图:一字线红色激光器

 

对于第二种方式,优点是可以很容易用2D激光雷达进行改造,相对第一种做法来说,他在相同的激光器输出功率下扫描距离更远。当然,由于需要控制额外自由度的转轴,其误差可能较大,同时扫描速度也略低。

这类激光雷达产品目前在各类实验室、工业应用场景中出现的比较多,但对于个人爱好着或者家用 设备中,他们的价格实在是太高了。当然,目前也有了一个替代方案,那就是kinect,不过他的成像 分辨率和测距精度相比激光雷达而言低了不少,同时无法在室外使用。

低成本的方案

造成激光雷达设备高成本的因素为

  1. 使用测量激光相位差/传播时间差测距
  2. 高速振镜的高成本
  3. 矫正算法和矫正人工成本

对于个人DIY而言,第三个因素可以排除,所谓知识就是力量这里就能体现了:-) 对于前2个因素,如果要实现完全一样的精度和性能,那恐怕成本是无法降低的。但是,如果我们对精度、性能要求稍 微降低,那么成本将可以大幅的下降。

首先要明确的是投入的物料成本与能达成的性能之间并非线型比例的关系,当对性能要求下降到一 定水平后,成本将大幅下降。对于第一个因素,可以使用本文将介绍的三角测距方式来进行。而对于 扫锚用振镜,则可以使用普通的电机机构驱动激光器来替代。

本文介绍的低成本3D激光扫描仪实现了如下的成本/性能:

成本:~¥150

测量范围:最远6m

测量精度:(测量距离与实际距离的误差)最远6m出最大80mm误差,近距离(<1m),误差水平在 5mm以内

扫描范围:180度

扫描速度:30 samples/sec (比如以1度角度增量扫描180度,耗时6秒)

对于精度而言,这个低成本方案足以超过kinect,不过扫描速度比较慢,但是对于一般业余用途而言已经足够。不过,该扫描速度是很容易提升的,本文将在分析其制约因素后介绍提高扫描速度的方 法。

原理和算法

这里先介绍测量目标上一个点所涉及的算法。3D扫描将采用类似的方式进行扩充。

使用单点激光进行三角测距

 

除了使用相位差和时间差进行TOF测距外,另一种测距方式就是三角测距。这也是实现低成本激光测距的关键,因为这种方式不需要具备其他测距方式所要求的特殊硬件。并且,在一定距离范围内, 三角测距也可以达到与TOF测距媲美的测量精度和分辨率。

图片(来源自[3]): 激光三角测距原理

目前有不少爱好者[1][2]基于激光三角测距制作了激光雷达或者测距仪,本制作也采用了这个方式。除了本文外,参考论文[3]也给出了较多的细节。(该论文的作者所在的公司正是将低成本激光雷达用于家用机器人XV-11的开发商,这里就不扯开了:-)

这里摘录了论文中的示意图,要进行激光三角测距,所需的设备很简单: 点状激光器、摄像头。因此,能做到多少的成本大家现在应该比较清楚了。

图中展现了测量对象Object距离激光器的距离d的示意图。图中的Imager部分是对摄 像头的一种抽象表达(针孔摄像机模型)。标有s的线段实际可以是一个固定摄像头和激光器的平面。摄像头成像平面与该固定平面平行,而激光器发出的射线与该平面夹角beta仅存在于图中的视图中。

要测量距离d,首先要求激光射线射到了Object上,他的反射光在摄像头的感光平面上成像。对于不同远近的物体,当被测距激光照射后,摄像头上的成像光点的x值将变化。这里涉及到如下几个参数

Beta:激光器夹角

s:激光器中心与摄像头中心点距离

f:摄像头的焦距

如果这些参数在测距设备安装后不再改变(固定)且数值已知,则物体距离激光器距离可由如下公式求得:

q=fs/x        .... (1)

d=q/sin(beta) .... (2)

其中,x是测量中唯一需要获得的变量。它的含义是待测物体上激光光点在摄像头感光元件(如CMOS)上的成像到一侧边缘的距离。该距离可以通过在摄像头画面中查找并计算激光点中心位置的像素坐标来求得。对于示意图

式(1)求出了目标物体与摄像头-激光器平面的垂直距离(实际上对于大尺度测距,该值可以近似认为是实际距离)。这一步就是三角测距的所有内容了,非常简单。

 

不过,在实际操作中,上述公式仍旧需要扩充。首先时对于变量x的求解,假设我们已经通过算法求出了画面中激光光点的像素坐标(px,py),要求出公式中需要的x,首先需要将像素单位的坐标变换到实际的距离值。为了计算方便,在安装时,可以令摄像头画面的一个坐标轴与上图线 段s平行,这样做的好处是我们只需要通过光点像素坐标中的一个参量(px或者py)来求出实际投影距离 x。这里假设我们只用到了px。

那么,变量x可以由如下公式计算:

x=PixelSize*px+offset .... (3)

式(3)由引入了两个参数,PixelSize以及offset。其中PixelSize是摄像头感光部件上单个像素感光单元的尺寸,offset是通过像素点计算的投影距离和实际投影距离x的偏差量。这个偏 差量是由如下2个因素引入的:

  1. x变量的原点(示意图中与激光射线平息的虚线和成像平面焦点)的位置未必在成像感光阵列的第一列(或排)上(实际上在第一排的概率非常低)
  2. 通过摄像头主光轴的光线在画面中的像素坐标未必是画面中点。

对于PixelSize,可以通过摄像头感光元件手册来确定其数值。对于offset,要在安 装上消除offset或者直接测量,在业余条件下几乎是不可能的,因此,需要通过后面介绍的矫正步骤求出。

到这里,我们得出了通过激光点像素坐标(pX)来求出对应光点实际距离的公式:

d=fs/(PixelSize*px+offset)/sin(beta) .... (4)

 

接下来的问题就是如何确定这些参数了。不过,实际操作中,还需要考虑性能指标问题:要达到某种精度要求,究竟需要怎样的摄像头,上述各类参数如何选择呢?

决定单点激光测距性能的因素

有公式(3)可知,参数px是一个离散量(虽然有算法可以求出连续的px,后文将介绍) 。因此,得到的距离数值也将会发生一定的跳变。该跳变的程度反映了测距的分辨率以及精度。

如果将式(1)改写为x=fs/q并按q进行求导,可以得出:dx/dq=-fs/(q^2),或者写为 :

dq/dx=-q^2/fs .... (5)

式(5)的含义是,变量x每发生一次跳变,通过我们三角测距公式求出的距离值q跳变大小与当前实际待测距离的关系。可以看出,当待测距离边远后,从摄像机获得的像素点每移动一个单位距离,求出的距离值得跳变会大幅增大。也就是说:三角测距的精度和分辨率均随着距 离增加而变差

因此,要决定我们希望实现的指标,只需要明确:

希望测距的最大距离

在最大距离下,分辨率(式(5))的数值

在论文[3]中给出了他的选取规则,这里直接给出一个结论,具体过程就不重复了:

假设对于激光光点定位能做到0.1个次像素单位,单位像素尺寸为6um。并要求在6m处分辨率(dq/dx)<=30mm。则要求:

fs>=700

在我们制作过程中,这个要求还是很容易做到的。另外目前的CMOS摄像头往往具有更小的单位像素尺寸(在同样大小的芯片上做出了更高的分辨率),因此实际fs的取值下限可以更低 。

而对于摄像头分辨率、激光器夹角beta,则决定了测距的范围(最近/最远距离)。 这里也同样不再重复了,可以参考[3]。对于使用pX进行测距的摄像头,其分辨率480x640即可做出比较好的效果,更高的分辨率更好(当然后文会提到缺点)。beta一般在83deg左右。

 

2D激光雷达的原理和性能制约因素

在实现了单点激光测距后,进行2D激光扫描就非常容易:进行旋转。这里讨论的他的性能问题:扫描速度。

对于采用三角测距的方式,从摄像头画面上识别出激光点到计算出实际距离对于目前的桌面计算机而言,几乎可以认为不需要时间。那么,制约扫描速度的因素就在于摄像头的祯率了 。对于目前市面常见的usb摄像头,其工作在640x480分辨率的模式下最高帧率都在30fps,那么,扫描速度就是30samples/sec。换言之就是每秒钟进行30次的测距计算。

对于一个180度范围的激光雷达,如果按照每1度进行一次测距计算,最短需要6秒。

如果要提高扫描速度,很自然的就是提高祯率。对于usb摄像头,有PS eye摄像头可 以做到60fps。但这也只能实现3秒180度扫描。需要更加高的速率,也就意味着更快的传输速度,对于USB2.0而言,保证640x480的分辨率,fps很难有所提升。在论文[3]中,他们采用了高速摄像芯片+DSP 的方式实现了1200fps的帧率。

由于本制作不需要很高的扫描速度,因此我仍旧采用了30fps的摄像头。

3D激光扫描的原理

由前文已经指出,这里采用了线状激光器一次对一条线而非单点的目标物体进行扫描测距。将扫描器进行旋转,从而可以实现3D扫描。下图展示了他的工作画面和捕获到的摄像头画面 :

图:本制作早期使用的红色一字线激光器的工作画面

图:采用红色一字线激光器捕捉到的画面

对于线状激光器进行测距的问题,可以将它转化为前面单点激光测距的计算问题。 对于上图中的激光线条,算法将按照Y轴依次计算出当前Y轴高度下,激光光斑的X坐标值pX。并尝试通过先前的算法求处该点的距离。

为了简化问题,我们先考虑对于一个与摄像头感光面平行的平面上激光光斑各点的 距离问题:

图:激光线条光斑在平行平面上各点的距离问题抽象

如上图所示,远处平面为目标待测平面,上面有一条紫色的激光光斑。近处的平面 是摄像头的感光成像平面,经过了翻折后,他可以看作是目标平面到摄像头成像中心点组成的棱锥的一个截面。

图中的P1点位于摄像头投影画面高度的中点,按照针孔摄像机的定义,该点在画面上的投影P1'距离摄像头中心Camera Center的距离应当为摄像头的焦距F。因此,对于P1,可以直接带入式(4)求出实际距离

现在的问题是,对于其他高度上的点,如P2,是否可以通过式(4)求得?

图:3D测距的原理

答案自然是肯定的,不过这里涉及到了额外的参数。如上图所示,设P2的投影点P2' 到摄像头中心距离为f',则P2到baseline垂线距离d'可由如下公式得到:

d'=f'baseline/x .... (6)

而很容易知道,f'可以通过f求出:

f'=f/cos(arctan((P2'.y-P1'.y)/f)) .... (7)

其中的P2'.y以及P1'.y分别是点P2',P1'在成像元件上的实际高度,他们可由各自点像素坐标pY乘以像素高度求出。

在求出了垂线距离d'后,需要转化成实际的距离D,此时需要 知道P2-RotationCenter以及Baseline组成的夹角theta。该角度可以由立体几何知识通过激光器与 Baseline的夹角beta求出。具体的求解公式可以参考本制作配套源代码的计算部分。

在求出了平行平面上激光光斑任意点的坐标后,可以将问题一 般化,对于3D空间任意激光投影点,可以先构造出该点所在的一个平行平面,然后利用上述算法求解 。

对于每次测距采样,上述算法将产生一个数组dist[n]。其中 dist[i]为对应画面不同高度像素坐标i下激光点的距离。对于采用640x480分辨率的摄像头,n的取值 为480。

如果进行180度,步进为1度的3D扫描,则可得到分辨率为 180x480的点云阵列。
如果采用0.3度步进,扫描180度,则得到600x480的点云阵列

激光光点像素坐标确定和求解

这里讨论如何从摄像头画面中计算出光点的坐标信息,具体来说,要解决如下几个 问题:

  1. 识别并确定激光光点,排除干扰
  2. 确定光点中心的精确位置

先来看问题一,这个问题看似简单,不过实际会有很多问题,比如下面的几幅实际操作中遇到的画面:

 

图:不同环境和配置下摄像头捕获的画面

 

上面3幅图像分别是在使用红色激光器摄像头所拍摄到的。(a)的图像比较理想,在于画面中除了激光光点外没有别的内容,虽然可以看到上方有光电发射发出的干扰点,但激光光点仍旧可以通过求出画面中最亮点的方式获取。

(b)画面中出现了日光灯,由于日光灯亮度也较高,从画面上看与激光点中心亮度一致(均为纯白),对于这个图像,一种办法是同时判断临近像素的色彩,红色激光点的外围均为红色。

(c)画面中,除了激光点外,出现了其他的红色物体,并且部分高光区域也在图像中表现为纯白,此时,上述通过色彩判断的算法也将失效。因此需要有另外的办法。

完美的激光提取算法几乎是不存在的,一个例子就是当画面中出现了2个类似的激光点(另一个来自别的测距仪或者激光笔),此时单从一副图像上很难做出判断哪个才是正确的光点。

同时,较准确的识别光点也需要硬件设备以及光学设备的合作,具体的细节超过了本文的范畴。这里列举几种可行的办法:

1. 加装滤光片

在文献[3]和文献[4]中均提及使用滤光片的做法,仅保留激光器发射波长的光线进入,从而可以一定程度的避免光线干扰。

2. 调整摄像头曝光时间

调整摄像机曝光率也可以有效去除画面的干扰,例如上图(b)和(c),对于5mW的激光器,一定距离内其单位光照强度仍旧比日光强[3](人肉眼可以在室外识别出激光笔照射在地面的光点) ,因此,只要将摄像头曝光率调整的足够短,完全由可能将画面中除了激光点之外的内容剔除。

3. 采用非可见光激光器

例如使用红外激光器,这个做法与遥控器使用红外LED理由一样,在人造环境中少有红外光干扰。配合红外滤光片,可以有效滤除来自诸如日光灯等的干扰。但是,对于日光和白炽灯, 其中也含有足够强的红外光,无法单纯采用此法。

4. 增加激光器功率

配合曝光率控制,增加激光器发射功率也足以使得画面中仅保留光点,但这样也有危险性,尤其采用点状激光时。

本制作采用了上述的所有方法,将在后文具体介绍。

 

对于问题(2),最简单的做法是直接找出光电中最亮的像素的坐标。但是由于前面公式得知,这样的得到的pX值是整数,计算得到的q将会有比较大的跳变。因此这里介绍如何将pX变为更 加精确的"次像素"级别。

对于这个问题,学术界已有不少的研究,这里推荐参考论文[5],其中介绍了几种次像素激光光点定位算法的介绍以及分析了他们的优劣。这里也不再重复了。

简单来说,可以认为激光光点的亮度是一个二维的Gauss函数经过了一次采样得到了画面上的激光点。那么,可以通过拟合或者简单的线性插值/求质心的手段,估计出光点的中心。

本制作使用了简单的质心法求取次像素的激光中心点。

图:采用滤光片后,从白色日光灯画面(右上图)中识别并计算出激光光点中心坐 标

可能有人会问这样的估算精确有效吗?一般而言,精确到0.1个像素单位是比较可靠的,也有文献指出他们做到了0.01个像素的可靠定位。

对于线状激光器的求解过程与点状激光类似,区别在于将按照图像的每行(或者每列)分别找出激光光斑的中心。可参考文献[6],文献[7]给出了一个针对线状激光 更优的光点中心提取算法。

摄像头校正

进行激光测距的基本原理非常简单,但在实现中却有很多制约因素。除了前文提到的进行三角测距求解公式中的那些参数需要确定之外,校正摄像头从而得到理想的针孔摄像机模型下的图像也是很重要的环节。

首先要回答的一个问题是:为何要校正摄像头?校正什么参数?

校正的主要理由是实际上目前使用的摄像头并非是前文所提到的针孔摄像机模型。 所谓针孔摄像机,简单说原理就和小孔成像类似:光线通过一个小孔后再背后的感光部件上成像。但大家知道,现实的摄像机都是采用光学透镜聚光成像的,并且所用的透镜并非是抛物面的(很难加工 ),同时,感光芯片也透镜之间也非严格平行[8]。总之,现实就是产生的画面实际上存在扭曲和偏移 的。如果直接使用原始摄像机的画面进行测距,势必造成误差。因此需要进行相机的校正,通过校正 后获取消除上述画面扭曲和偏移的图像,再用来进行激光测距的相关操作。

图: 摄像头原始画面和经过相机校正后的修正画面

上图左侧图片是一种摄像头拍摄到的原始画面,可以明显看出图像存在着扭曲,对相机校正后,我们可以校正后的参数修正扭曲的画面,得到右侧图像的效果。

对于摄像机校正的具体原理、算法和过程超过了本文的介绍范围,具体信息可以参考如下的文献和教程:[8][9][10]。在本文后续的制作部分,也会介绍本次制作的校正过程和结果。

校正和求解三角测距所用参数

前文介绍的三角测距公式中涉及了如下的参数:

Beta:激光器夹角

s:激光器中心与摄像头中心点距离

f:摄像头的焦距

pixelSize:感光部件单位像素尺寸

offset:激光点成像位置补偿值

这些参数有些很难通过实际测量求出,有些很难再安装时就控制好精度。他们数值 的精确度会对测距精度有着非常大的影响。例如pixelSize一般都是微米级别的数值,很小的误差即可导致最终测距的偏差。

对于他们的求解,我们将在测距仪制作完成后进行的校正环节求出。这里的校正, 实际过程是在实现测量好的距离下采集出测距公式中用到的pX数值。然后通过曲线拟合的方式确定参 数。

这部分的具体操作将在后文的制作/校正过程中具体介绍。

 

制作低成本的3D激光雷达

这部分的内容请访问

自制低成本3D激光扫描测距仪(3D激光雷达),第二部分

http://www.csksoft.net/blog/post/lowcost_3d_laser_ranger_2.html
 

参考文献

[1] Details of the Laser Range finder

http://www.eng.buffalo.edu/ubr/ff03laser.php

 

[2] Webcam Based DIY Laser Rangefinder

http://sites.google.com/site/todddanko/home/webcam_laser_ranger

 

[3] K. Konolige, J. Augenbraun, N. Donaldson, C. Fiebig, and P. Shah. A low-cost laser distance sensor. In Int. Conference on Robotics and Automation (ICRA), 2008.

 

[4] Kenneth Maxon. A Real-time Laser Range Finding Vision System

http://www.seattlerobotics.org/encoder/200110/vision.htm

 

[5] Fisher, R. B. and D. K. Naidu. A Comparison of Algorithms for Subpixel Peak Detection. Springer-Verlag, Heidelberg, 1996.

 

[6] Mertz, C., J. Kozar, J.R. Miller, and C. Thorpe. Eye-safe Laser Line Striper for Outside Use. Intelligent Vehicle Symposium, 2002.

 

[7] J. Forest, J. Salvi, E. Cabruja, C. Pous, Laser stripe peak detector for 3D scanners. A FIR filter approach, in: International Conference on Pattern Recognition, Cambridge, August 2004, pp. 646–649

 

[8] Learning OpenCV: Computer Vision with OpenCV Library, Gary Bradski and Adrian Kachlev, first edition , 2008 O’Reilly, ISBN 978-0-569-51613.

 

[9] 分享一些OpenCV实现立体视觉的经验
http://blog.csdn.net/scyscyao/article/details/5443341

 

[10] Camera Calibration Toolbox for Matlab
http://www.vision.caltech.edu/bouguetj/calib_doc/

  • 相关文章:
  • quote 1.zjucyp
  • 楼主,我对你的技术很有兴趣;
    我有两个问题相请教一下:
    1)如果在户外阳光下,这个激光技术还有效吗?如果我想测20-50米的距离,应该选什么样的线性激光器呢?
    2)如果想同时得到距离和RGB图像,是不是不加红外滤片就可以了?
    csk 于 11/30/2011 11:01:02 PM 回复
    第一个问题答案是可以,前提是:
    1. 提高激光器功率
    2. 进一步缩短快门(曝光时间)。
    在本文的参考文献[6]他们就采用5mW的线激光器在室外进行测距

    要有RGB数据就不能加滤光片,不过这样识别算法要复杂些
    zjucyp 于 12/7/2011 7:12:07 AM 回复
    谢谢您的回复,我再学习学习,如果有行人,5mw激光器对着行人是不是不允许的吧?
  • 12/7/2011 7:12:07 AM 回复该留言
  • quote 2.lkj
  • 谢谢博主无私的精神,正在阅读。。。。非常强大~~~
  • 12/2/2011 2:15:58 AM 回复该留言
  • quote 3.hardegg
  • 不太理解这个:
    “其中,x是测量中唯一需要获得的变量。它的含义是待测物体上激光光点在摄像头感 光元件(如CMOS)上的成像到一侧边缘的距离。”
    为什么不这么计算:
    x = dx + f/tan(Beta)
    其中dx是像素点到光心点的距离
  • 12/3/2011 6:32:05 PM 回复该留言
  • quote 4.csk
  • f/tan(Beta)是常量,
    dx=(px - offsetCenter)*PixelSize
    因此你的公式就是式(3) x=PixelSize*px+offset .... (3)
    但是,如果按你公式计算,需要另外矫正出offsetCenter
  • 12/3/2011 6:48:58 PM 回复该留言
  • quote 5.Fuzee
  • 实用性不大,很多应用软件都能做到了吧,现在那个照片建模云计算就比这厉害!直接发照片就行!贴图都上好了!
    拓荒 于 1/3/2012 1:02:41 AM 回复
    同学,已经验证过您所说的照片3D建模了,那个所谓的建模跟这个压根儿就不是一个概念,那个所谓的建模仅仅就是生成一个能够立体观看的flash而已,而我们这里需要的是要能在3DMax里调用的数据!
  • 1/3/2012 1:02:41 AM 回复该留言
  • quote 6.csk
  • @zjucyp 5mW是ClassI激光,还是允许的
    zjucyp 于 12/8/2011 2:04:27 AM 回复
    非常感谢,我现在正在研读您提供的文献,您的博客让我学到很多东西!
  • 12/8/2011 2:04:27 AM 回复该留言
  • quote 7.wen135
  • 很好。比david软件实用。
    有没有可能做成david软件形式,摄象头旋转控制只要能输出相应脉冲即可。这样会带动更多爱好者使用和实验。
  • 12/14/2011 12:01:34 AM 回复该留言
  • quote 8.csk
  • 这个是很好做得,毕竟旋转这块只是控制角度,用Arduino也很容易实现
    wen135 于 12/21/2011 6:07:12 AM 回复
    期待推出做成david软件形式的实用软件。
  • 12/21/2011 6:07:13 AM 回复该留言
  • quote 9.Lemonade
  • P1'到成像孔的距离并不是焦距f,而是另外一个值,只是那个值对计算结果没有影响不需要计算;
    csk 于 1/8/2012 6:59:57 PM 回复
    本来就不是f,文章已经写明。但这个值对结果影响很大
  • 1/8/2012 6:59:57 PM 回复该留言
  • quote 10.px601
  • 感谢csk的帮助,做成了3D激光扫描,虽然精度不好。大体样子有了。
    水民BUAA 于 3/2/2013 7:48:30 PM 回复
    做这个得用多久啊。==
    我本科毕设老师也让做这个东西,自动化本科,没学过光学,没接触过摄像头和激光,用51单片机还可以。不知道两个月能不能搞出来呢?
    水民BUAA 于 3/2/2013 7:49:31 PM 回复
    请问我本科自动化,没接触过摄像头和激光器,用过51单片机,要是做这个本科毕设能做出来不= =
    行的 于 7/4/2014 10:45:04 AM 回复
    用室内手持激光测距的木工激光尺,改造,单片机,与电脑数据连接,代替摄像头和玩具激光,是不是更好
  • 7/4/2014 10:45:04 AM 回复该留言
  • quote 12.xxq2055
  • 楼主:您好!我是专业做激光器的,有个问题,是不是一字线激光器均匀性的好坏也影响成像效果。
  • 4/11/2012 1:28:14 AM 回复该留言
  • quote 14.johns
  • 能和楼主沟通下吗?QQ26521436,我也做激光三维扫描仪
  • 4/16/2012 12:35:27 AM 回复该留言
  • quote 15.edwardelric
  • 我也希望能够做一个激光3D扫描仪,电子部分打算用步进电机和51单片机做。但是关于怎样在电脑观察云点,就不太了解应该怎样做。期望博主可以告诉我应该学些什么去处理在电脑成像的问题,例如学什么软件之类的,谢谢!
    1274960716@qq.com
  • 6/16/2012 8:27:07 PM 回复该留言
  • quote 16.edwardelric
  • 些希望你能告诉要在电脑产生云点的文件应该如何做,要看哪些相关的书
  • 6/16/2012 8:33:05 PM 回复该留言
  • quote 17.yelanneu
  • 谢谢博主分享。我毕业设计也是做这个。想知道 由点云生成片面数据的算法,学习相关的知识需要看些什么书??我的邮箱是348564983@qq.com 谢谢啦
  • 7/31/2012 7:10:44 PM 回复该留言
  • quote 18.angelo
  • very good work! I made a scanner similar to yours, have a look at my site where three types of 3D scanners are discussed, in particular a very powerful scanner based on triangulation that uses a CMUcam. Please google "3d scanner diy cmucam3" to find the age on google. Good luck!
  • 9/7/2012 4:50:42 PM 回复该留言
  • quote 19.edward
  • 有一个激光点(线)检测方法不知道是不是可行。不断开关激光,拍摄同一角度的两张画面,判断不同的线状区域。望指点
    csk 于 9/25/2012 6:21:58 PM 回复
    可行,这其实就是做背景消除,不过需要专门的相机来实现帧同步
  • 9/25/2012 6:21:58 PM 回复该留言
  • quote 20.flywhc
  • 假如使用一排n束平行的激光,应该就能使扫描速度提高n倍,因为发射光是平行的,反射光也肯定是平行的,不会交叉。光束的最大密度决定于摄像头的分辨率(还有倾斜角以及矫正精度等)

    假如用一组光栅棱镜分光,或许可以把一束线激光分成若干束平行激光,因为光栅是平行的,假如只用一个透镜能让线激光变成三角柱状激光,因为摄像头分辨率不高,激光亮度有限,我们的光栅条纹数量有限,可以通过微微的摇头提高分辨率。

    不知道kinect是怎么做的,看介绍说用编码后的激光,我理解是特殊的光栅可以让激光产生条纹,而且这个条纹是快速变化的,通过比对条纹形状的变换可以算出发光图样和反射图样的映射关系从而立刻算出整个反射面的距离。

    我在想这个光栅怎么做呢?是不是可以用35MM黑白照相机胶片制作?这年头不知道能不能买得到。条纹编码么,可能用电机旋转或者平移做到?

    john 于 9/6/2013 8:40:05 PM 回复
    kinect 1代的是利用特别的透镜,这个透镜可使激光在不同深度上打出的斑点的形状不同,这个是primesense的专利。以前做的有用条纹、随机码、频域上的条纹变化等等,感觉可能没有prim他们的精度高。
    Kinect 2 的是TOF。
    john 于 9/6/2013 8:44:00 PM 回复
    你这个光栅棱镜后来又进展吗?我也找过类似东西,没找到合适的。光栅都稀疏,也没发现哪有卖合适的。
  • 9/6/2013 8:44:00 PM 回复该留言
  • quote 21.edwardelric
  • csk你好,我正在制作你之前制作的3Dscaner,希望真正学点东西,所以我是自己写算法的不打算复制你的程序,但是编程思想是用你介绍内容。我想请教以下问题:
    (1)用matlab工具标定摄像头时,所用的图片是否一定要黑白,彩色图片可以吗?
    (2)请问matlab标定后得到的参数(包括摄像机矩阵,畸变向量)应该如何正确被 opencv的程序读入或转化为xml文件。
    以下是我写的程序:
    (作用是读入matlab标定参数,之后打算替代opencv第十一章例子标定部分的程序,我认为要正确读入参数就是要选择需要的参数并写成,摄像机矩阵和畸变矩阵,读完上面关于标定的的参考文献后,我大概知道参数意义,但不知是否有理解错)
    (校正参数是用你当时得出的参数,但是写出来的xml内容和你的xml不一样)
  • 2/1/2013 7:42:43 AM 回复该留言
  • quote 22.edwardelric

  • #include "stdafx.h"
    #include "stdio.h"
    #include "cv.h"
    #include "highgui.h"
    #include "stdlib.h"
    #include "cxcore.h"

    int main(int argc, char* argv[])
    {

    //camera matrix
    float data[9]={ 935.44200, 0 , 149.00014,
    0 , 929.73860, 233.25474,
    0 , 0, 1
    };

    CvMat intrinsic_matrix;

    cvInitMatHeader(&intrinsic_matrix,3,3,CV_32FC1,data);

    cvSave("intrinsic.xml",&intrinsic_matrix);

    printf("intrinsic_matrix mat 2 xmal finish\n");


    //Distortion
    float data2[5]={-0.13196,-0.05787,-0.00358,-0.01149,0.00000};

    CvMat distortion_coeffs;

    cvInitMatHeader(&distortion_coeffs,1,5,CV_32FC1,data2);

    cvSave("distortion.xml",&distortion_coeffs);

    printf("distortion mat 2 xmal finish\n");

    }
  • 2/1/2013 7:43:55 AM 回复该留言
  • quote 23.edwardelric

  • 你的标定参数
    Calibration results (with uncertainties):

    Focal Length: fc = [ 935.44200 929.73860 ] ? [ 11.29945 10.64268 ]
    Principal point: cc = [ 149.00014 233.25474 ] ? [ 17.13538 11.11605 ]
    Skew: alpha_c = [ 0.00000 ] ? [ 0.00000 ] => angle of pixel axes = 90.00000 ? 0.00000 degrees
    Distortion: kc = [ -0.13196 -0.05787 -0.00358 -0.01149 0.00000 ] ? [ 0.04542 0.12717 0.00195 0.00565 0.00000 ]
    Pixel error: err = [ 0.24198 0.25338 ]

    Note: The numerical errors are approximately three times the standard deviations (for reference).
  • 2/1/2013 7:45:08 AM 回复该留言
  • quote 24.edwardelric
  • 我和你的xml不同之处在(另外xml中我们的文件名字不一样,我觉得这个不是重点)

    对于camera matrix 有关的xml
    你的内容:<dt>d</dt>
    <data>935.44200 0. 149.00014 0. 929.73860 233.25474 0. 0. 1.</data>
    我的内容: <dt>f</dt> (中间字母不一样)
    <data>935.44201660 0. 149.00013733 0. 929.73858643 233.25474548 0. 0. 1.</data> (小数部分有几位和你不一样,会多了几位)

    对于和畸变矩阵有关的xml,我地内容和你完全不一样
    你的内容:<dt>d</dt>
    <data>-0.079176 -0.034722 -0.002148 -0.01149 0.00000</data>

    我的内容:<dt>f</dt> (中间字母不一样)
    <data>-0.13196000 -0.05787000 -3.58000002e-003 -0.01149000 0.</data>
    (数据完全不一样)

    希望你能告诉我我的代码应该如何修改才可以得到和你一样的xml,万分感谢!
  • 2/1/2013 7:45:45 AM 回复该留言
  • quote 25.csk
  • 校正用图片可以用RGB的,但这对角点提取没有额外好处,算法往往还会转换成灰度进行
    intrinsic matrix小数位不一致是因为float (32bit)表示小数精度损失所导致的,可以使用double类型,但其实这不影响算法
    distortion数据完全不一致不是你的问题,是我xml文件与文章中给出的matlab定标结果不一致产生的。你的代码无误
    edwardelric 于 2/3/2013 11:11:18 PM 回复
    非常感谢你的回复,祝工作顺利,新春愉快!
  • 2/3/2013 11:11:18 PM 回复该留言
  • quote 26.edwardelric
  • 看完参考文献【3】,也看过你的代码
    请问:
    (1)尽管你在文章中说摄像头单个像素尺寸可以在摄像头的手册上可以找到,我看见你在代码中也是用0.6um和参考文献【3】中的一样,请问你是不是直接使用0.6um这个数值?
    (2)我觉得很难确定单个像素的大小,现在买摄像头在淘宝上也没有这个参数看,而且问店家,店家也不知道。请问有方法确定摄像头单个像素的尺寸吗(我用的摄像头是别人送的没有说明书)?(很多摄像头粗制滥造,是不会给这些普通用户不关心的参数)
    (3)另外我有另外一个摄像头包装上写着:“sensor size:4386x3.64mm”这个数值我实在看不懂,请问你知道是什么意思吗?(可能是山寨货,数据不排除乱印或印错)
    (4)请问你提出的激光器角度83是不是直接用参考文献【3】的公式的结果?
    你的sensor(你是使用640*480)x方向的像素个数的一半是320,文献中sensor x方向的像素个数的一半是376,当然我不知道你焦距是多少,也有可能真是算出83°。

    期待你的回复,万分感谢!
  • 2/13/2013 11:17:17 PM 回复该留言
  • quote 28.csk
  • 1. 我代码中使用6um应该是校正后恰好得到的数值。这个问题文章中也有提到,如果无法通过手册得知摄像头的真实像素尺寸,也可以用校正得到
    2. 4386x3.64mm应当属于标错,我也不清楚这是什么意思
    3. 这里提到的83度和[3]的确有一点关系,不过这个数据没有太多讲究,基本上在实现过程中都会发现在80-85度范围的夹角是比较合适的,具体数值是需要经过校正确定的。但这与X轴像素值还是焦距都无关
    edwardelric 于 2/14/2013 5:55:50 AM 回复
    谢谢你的回复!
  • 2/14/2013 5:55:50 AM 回复该留言
  • quote 29.edwardelric
  • 你好!我又有问题想请教,不好意思打扰了。期待你的回复,谢谢!
    初次使用舵机。根据自己找到的资料:舵机是用pwm控制转动的,转动角度为0°~180°,脉冲宽度在0.5ms~2.5ms
    若在向舵机输入的,总长为20ms的脉冲信号中
    高电平占0.5ms则舵机输出转角位0° ;高电平占1ms则舵机输出转角位45°;
    高电平占1.5ms则舵机输出转角位90°;高电平占2ms则舵机输出转角位135°;
    高电平占2.5ms则舵机输出转角位180°;
    请问:
    我把0°~180°(绝对位置)以顺时针方向看,即从180°向0°方向转称为逆时针转,0°向180°方向转称为顺时针转。假设我的舵机现在处于0°,如果我输入一个脉冲:高电平占2.5ms,低电平占(20ms-2.5ms=17.5ms)则舵机顺时针转动到180°,之后我再输入另外一个脉冲高电平占1.5ms,低电平占(20ms-1.5ms=18.5ms),舵机会逆时针转90° 。
    请问:(1)上述我描述的情况是否与真实的舵机控制相符?
    (2)若与事实不符,希望描述一下上述操作应该得出的效果,希望可以再说明一下如何让舵机逆时针转?
    (3)输入不同宽度的脉冲所产生的舵机输出转角,到底是指转到绝对位置,还是指输出一个转角的增量?
    谢谢!!
  • 2/14/2013 10:47:18 PM 回复该留言
  • quote 30.edwardelric
  • 上述问题我放在百度知道很久了,但都没人回答,自己也焊接了电路并在理解舵机控制的基础上,用网上的舵机控制程序(程序我自己都仔细看过)实验过但是依然不能成功驱动舵机,所以最后才来请求你的解答。

    另外我还有一个问题请教:
    我自己焊接了一个stc89c52的最小系统,之后把网上找到的按键控制舵机程序(我觉得已经是很简短的程序了)按照程序中的IO口定义去接线,其实就只需要把程序中定义的PWM口(即是输出脉冲的IO口)接上舵机的信号输入线,之后查看程序中定义,与按键有关的IO口的编号(即是例如P3^7、P1^2之类),以及按键激活条件(一般条件都是那个IO口为0(低电平)时舵机转动).
    在试验时我用线(可插排针的线)把与按键有关的IO口与GND相接,但是舵机毫无反应,舵机只会在最小系统通电时动一下(动的幅度很小)。我的最小系统测试过是正常的,PO口也加了上拉电阻。
    我试过3个从网上下载的舵机控制程序,编译时也注意到芯片的选择,但是依然无法控制舵机正反转,舵机根本不动。

    请问您是否知道这是什么原因?期待你的回复,谢谢!
  • 2/14/2013 11:11:54 PM 回复该留言
  • quote 31.csk
  • 舵机控制并不是你输出一个脉冲,他就会转到一个角度。所以你的实现会发现不工作。
    舵机的角度是时刻与你输入信号的占空比相关的,即你要维持舵机保持特定角度,你就必须不停地输出脉冲,但占空比不变。如果需要改变角度,则调节占空比。
    edwardelric 于 2/15/2013 5:53:30 AM 回复
    看了你的回复之后才知道,原来我理解错了资料的意思,非常感谢你解答了我的疑问,非常感谢您的回复,谢谢!
  • 2/15/2013 5:53:30 AM 回复该留言
  • quote 32.edwardelric
  • 我想请教一下:
    (1)为什么不直接用三角测量原理图中的q作为测得的距离,而用物体与激光器的距离d作为测得距离? 请问用d在测量或处理上更有优势吗?
    (2)我自己也拆开了摄像头,发现有红外截止滤光片,情况跟你给出的图片差不多,但是滤光片好像很难拆除(好像是先固定在一块塑料片上再用胶水把塑料片粘住透镜后面的圆筒),请问您当时是怎样拆除滤光片的?

    谢谢!
    edwardelric 于 2/18/2013 9:53:54 PM 回复
    补充一下:好像粘得很紧,几乎没有空位用东西撬开,硬来的话似乎很容易把摄像头弄坏。
    但如果不拆,试过就算200mW的808nm激光器在较远的地方(3m左右)衰减得比较厉害,输出光比较微弱。
  • 2/18/2013 9:53:54 PM 回复该留言
  • quote 33.csk
  • q和d是不同的量,直接测得的是q,因为容易求,但最终结果按照定义就是要有个d,这不是有什么好处的问题

    滤光片的确用胶水黏着,可以尝试加热让胶水融化,不然就暴力拆解
    edwardelric 于 2/19/2013 2:12:42 AM 回复
    我会小心而又暴力地拆解,非常感谢你的回复,谢谢!
    edwardelric 于 2/19/2013 2:22:46 AM 回复
    我看过参考文献【3】,虽然写文章的人很专业也很权威。我也查了一下光学测量的书。
    我觉得扫描的话,不是应该以转轴为中心去求距离(也就是q)吗?
    如果用d的话,参考点(激光器的位置)岂不是在一个圆周上不停改变,测到的距离令我觉得有点不真实?
    (其实我不会在这个问题上钻牛角尖,只是想跟您交流一下,听听您的看法,谢谢!)
  • 2/19/2013 2:22:46 AM 回复该留言
  • quote 34.edwardelric
  • 我看过参考文献【3】,虽然写文章的人很专业也很权威。我也查了一下光学测量的书。
    我觉得扫描的话,不是应该以转轴为中心去求距离(也就是q)吗?
    如果用d的话,参考点(激光器的位置)岂不是在一个圆周上不停改变,测到的距离令我觉得有点不真实?
    (其实我不会在这个问题上钻牛角尖,只是想跟您交流一下,听听您的看法,谢谢!)
  • 2/19/2013 2:23:54 AM 回复该留言
  • quote 35.csk
  • 的确是以转轴为中心去求距离,这点你说的没错。但是图中的q并不是转轴为中心到物体距离,而是转轴所在直线到物体的距离(高)。
    而实际测距的数据其实也不能用d(这里我前面说错了),而是用D(大写),这才是转轴中心到物体的距离。D的定义在[3]的示意图中没有,是在图:3D测距的原理定义的
    edwardelric 于 2/19/2013 7:09:02 AM 回复
    哦,原来这样,谢谢你的回复,我继续看看。
  • 2/19/2013 7:09:02 AM 回复该留言
  • quote 36.edwardelric
  • 您好,我看完你计算距离的函数了,我有以下问题请教:
    (以下用到的线段标识与你的程序一致,希望我没有理解错每个标号的意义,我会在标号后说明我对其的理解)
    (1)这段代码我看不懂“float yaw_angle = PI/2 - acos((rotation_r*rotation_r + real_center_distance*real_center_distance-laser_to_center_pt*laser_to_center_pt)/2.0f/rotation_r/real_center_distance);”
    但是我猜这个yaw angle 应该是real_center_distance(即目标点在baseline所在水平面上的投影点与rotation_center的连线) 与baseline的垂线(即摄像头光轴方向)的夹角,请问是这样吗?
    若是这样,我认为这样算比较简单:
    laser_to_dis_pt(激光器到center_distance的距离)
    center_distance(底面三角形的高也就是,解释三角测量图中的q)
    rotation_r(旋转轴的一半,即baseline的一半)
    (laser_to_dis_pt—rotation_r);center_distance;real_center_distance;三者构成直角三角形

    yaw angle = PI/2 — arctan(center_distance/(laser_to_dis_pt—rotation_r))
    我这样算对吗?
  • 2/20/2013 8:23:50 PM 回复该留言
  • quote 37.edwardelric
  • (2)请问:“result-&amp;gt;pitch = pitch_angle -18.0*PI/180.0f;”后面的“-18.0*PI/180.0f”是测距定标时所产生的修正量吗?

    (3)在测距定标时所测的实际距离应该是测:转动中心到光点的距离,是这样吧?

    (4)代码中的“const float d = -40.88;”是什么?感觉是标定求出的补偿量,但是程序又没有用上。

    (5)从“float pitch_angle = atan(((y - img_height/2)*c)/(focal));”来看你处理图像时,图像坐标原点应该是设在左下角吧(我知道opencv中图像坐标有2种位置)?

    期待你的回复,谢谢!
    水民BUAA 于 3/2/2013 7:56:10 PM 回复
    童鞋,你是本科僧还是研究僧,我毕设也做这个,两个月的时间,不知道能不能做出来啊==你做了多久了,到哪一步了啊?
    rockbud 于 7/3/2013 8:59:49 PM 回复
    ==============================================================
    (2)请问:“result->pitch = pitch_angle -18.0*PI/180.0f;”后面的“-18.0*PI/180.0f”是测距定标时所产生的修正量吗?
    ==============================================================

    这个角不是直接可以用 result->pitch= acos(real_center_distance/real_distance) 来得到吗?为何要标定修正啊?


  • 7/3/2013 8:59:49 PM 回复该留言
  • quote 38.csk
  • (1)的分析没错,也可以用atan来算,但需要考虑三角函数的奇点问题
    (2)没错
    (3)可以这样做
    (4) d是校正的补偿量,修补测得距离的系统误差,计算时不需要,且每个人校正算法不同也未必会有这个。可以不用理会
    (5)原点坐标在这里不重要,即使颠倒了后期会修正。计算机中默认都是按左上角算的
    edwardelric 于 2/21/2013 7:06:40 AM 回复
    非常感谢您的回复,谢谢!
    仲夏 于 3/14/2016 3:31:12 AM 回复
    你好程序里面a代表啥,center_distance = a/(b-c*x)这是怎么的得到的希望能得到您的回答
    仲夏 于 3/14/2016 3:32:04 AM 回复
    你好,里面的a是啥?center_distance = a/(b-c*x);这是怎么得来的期待您解答
  • 3/14/2016 3:32:04 AM 回复该留言
  • quote 39.edwardelric
  • 你好,我有问题请教。
    (1)请问你用的激光器是不是200mW的808nm激光器(文中前面说50mw后面说是200mw)?
    (2)请问您用的滤光片是不是800-1000高透滤光片?
    (3)我是用200mw的808nm激光器,和800-1000高透滤光片,但是可能是因为功率过大,射中的物体在摄像头中(已经除去红外截止滤光片)出现比较厉害的反光情况,在镜头中看见一条比较粗大的光柱(可能是由于物体反光使激光变粗),和文中“5. 图像处理和渲染”中给出的“Raw Input很不一样”周围的事物也被照亮了尽管房间是全黑的,无法得到如Raw Input中背景全黑只剩下光柱的情况),请问您当时是怎样的情况可以做到你给出的Raw Input那样?
    edwardelric 于 3/8/2013 8:53:49 AM 回复
    (4)请问您的(5. 图像处理和渲染中的)rectified &amp;amp; result画面除了利用标定参数进行矫正,还做了什么样的处理,因为颜色、线条状态跟raw input有些不一样。
    edwardelric 于 3/8/2013 6:16:01 PM 回复
    (5)请问你的找激光光点函数中,是不是设了一个最小功率值,返回信号小于这个值,相关的点就会被认为是不存在(如视频中房间的门口)?
    edwardelric 于 3/9/2013 6:50:34 PM 回复
    (6)我按照网上的资料用matlab进行拟合y=a/(b-c*x),(我是用cftool中的构造型自定义函数拟合的)拟合了几次都不成功,我怀疑是没有设定各个待拟合参数的范围,但又不知道应该设为多少,或是拟合方法不对。希望你能告诉我应该怎样拟合才能成功,谢谢!
  • 3/9/2013 6:50:34 PM 回复该留言
  • quote 41.edwardelric
  • 我给激光器加了可调电阻,基本解决了问题。但是效果仍不如你的Raw Input理想,但是依然像知道上述问题的答案,继续期待你的回复,谢谢!
  • 3/8/2013 8:47:27 AM 回复该留言
  • quote 42.csk
  • 回复如下:
    1.最终用了200mW的,50mW为笔误
    2.不是这个,但也无所谓
    3.这个问题我也是存在的,不影响
    edwardelric 于 3/12/2013 6:11:56 PM 回复
    谢谢您的解答!
    拟合的问题我自己解决了,原来是startpoint没设置正确。
  • 3/12/2013 6:11:56 PM 回复该留言
  • quote 43.edwardelric
  • 你好,我想请教一下关于扫描时图片采集的问题,谢谢!
    请问你是怎样处理采集图像与电机转动的关系?我想到2种方式,请问你是怎样处理?
    第一种
    电脑采集一幅图像并完成数据处理写入文件后,通过串口通知单片机可以使能步进电机旋转一个步进角度,旋转完成后电机停下,再采集下一幅图像,如此类推直到旋转完180°。(对于这个方法我认为,摄像头帧率是无意义,并且距离变远时会出现信息的空缺,原因从几何上容易理解,限于篇幅先不写)

    第二种
    电脑给出指令给单片机,要求以一定的步进角度以固定的速度一直转到180°
    与此同时,电脑尽可能快地采集图像并处理数据,直到转到180°时停止采集。之后以180°除以图像数量,得出每一幅图像的数据所对应的角度。之后再计算距离。
    请问你用什么方式处理,期待你的回复,谢谢!

    Kolya 于 1/10/2014 8:52:56 AM 回复
    edwardelric, 扫描时图片采集方法 你最终采用了哪一种??
    Kolya 于 1/10/2014 8:53:29 AM 回复
    edwardelric 扫描时图片采集问题 你最终采用了哪一种?
  • 1/10/2014 8:53:29 AM 回复该留言
  • quote 44.edwardelric
  • 请问您是如何做到采集速度达到30fps?
    我用opencv写最简单的采集并显示图像程序(其实是opencv关于摄像头的例程),在全黑环境下采集线状激光的图像,最多也只是8fps,尽管摄像头说明书写着30fps。期待您的回复,谢谢!
  • 3/26/2013 3:54:44 AM 回复该留言
  • quote 45.王加兴
  • 你的标定参数
    Calibration results (with uncertainties):

    Focal Length: fc = [ 935.44200 929.73860 ] ? [ 11.29945 10.64268 ]
    Principal point: cc = [ 149.00014 233.25474 ] ? [ 17.13538 11.11605 ]
    Skew: alpha_c = [ 0.00000 ] ? [ 0.00000 ] =&gt; angle of pixel axes = 90.00000 ? 0.00000 degrees
    Distortion: kc = [ -0.13196 -0.05787 -0.00358 -0.01149 0.00000 ] ? [ 0.04542 0.12717 0.00195 0.00565 0.00000 ]
    Pixel error: err = [ 0.24198 0.25338 ]

    Note: The numerical errors are approximately three times the standard deviations (for reference).

    这是您的intrinsics_distort.xml,选用的数据
    &lt;data&gt;
    -0.079176 -0.034722 -0.002148 -0.01149 0.00000
    &lt;/data&gt;&lt;/instrinsics_distort&gt;
    内参数矩阵我懂,但是这个畸变系数的xml文件请问你是怎么产生的,和您的Distortion: kc = [ -0.13196 -0.05787 -0.00358 -0.01149 0.00000 ] ? [ 0.04542 0.12717 0.00195 0.00565 0.00000 ]
    这个只有最后一个相同啊,其他的都不知道怎么来的,不是直接复制过来的么,还有什么换算?请博主指点一下,不胜感激
    hanhan 于 4/25/2014 5:54:34 AM 回复
    请问您,摄像头变动后的焦距单位是毫米吗?还是其他的?
  • 4/25/2014 5:54:34 AM 回复该留言
  • quote 46.lxc
  • 博主您好,我想请问下最后获得了三维的数据后(txt文件下三列x,y,z),如何在matlab中显示图像呢?实时显示还要完成哪些工作呢?希望得到您的解答
  • 5/20/2013 11:55:38 PM 回复该留言
  • quote 47.andy
  • 博主您好,我正在学习这方面的知识,您的文章对我帮助很大,我想问一下程序里面:“result-&gt;pitch = pitch_angle -18.0*PI/180.0f;”后面的“-18.0*PI/180.0f”是怎么得到的?为什么要加这个?
    非常感谢您的回答!
    Again 于 5/12/2014 11:10:58 AM 回复
    弧度
  • 5/12/2014 11:10:58 AM 回复该留言
  • quote 48.3Dloser
  • 博主,我完全是个门外汉。请问你是如何采集点云数据的,是利用激光器照射然后经过三角测距的算法么?期待您的回答,谢谢
  • 3/22/2014 2:15:53 AM 回复该留言
  • quote 49.mm
  • csk您好 我想买这个测距仪 愿意的话 加我qq详谈,1028907583.。多谢。
  • 4/7/2014 6:43:04 AM 回复该留言
  • quote 50.hanhan
  • 请问博主,您的摄像头标定完后的焦距是 935.44200 929.73860,单位是什么,毫米吗
    Again 于 5/12/2014 11:12:45 AM 回复
    看zhang zhengyou 的论文
  • 5/12/2014 11:12:45 AM 回复该留言
  • quote 51.hanhan
  • 您好,我想问一下,距离和x的关系不是x越大,距离越小的吗,为什么在后面的校正环节得到的距离和x值是成正比例的呢,即x越大,距离越大
  • 6/4/2014 12:13:06 AM 回复该留言
  • quote 52.交流学习
  • 你好,CSK,我对你自制的3D激光扫描仪很感兴趣,可否提供点详细制作资料呢,谢谢!
  • 7/17/2014 6:46:07 AM 回复该留言
  • quote 53.疑问
  • CSK,你好,你这个可以扫描出物体的立体模型,是否还可以测出实际物体的尺寸呢?可以用于测量吗?
  • 7/18/2014 12:18:16 AM 回复该留言
  • quote 54.3D
  • CSK,你好,请问这个式子 f'=f/cos(arctan((P2'.y-P1'.y)/f)) 怎样去理解呀,f'与f的关系怎样确立,这个不知道怎样理解?
  • 9/11/2014 7:35:59 PM 回复该留言
  • quote 55.Tom
  • 请问作者baseline就是前文中提到的摄像头中心到激光头中心的距离"s"吗?
  • 2/9/2015 11:51:42 PM 回复该留言
  • quote 56.jpt
  • 请问csk,SLAM算法该如何利用3D激光雷达所的的数据???
  • 3/9/2015 5:30:22 AM 回复该留言
  • quote 57.单点激光测据疑问
  • 我想请问下楼主,使用单点激光进行三角测距原理介绍的图中,x变量在原理图中到底指的是哪里到哪里的距离?这一点让我很疑惑,你得到式(1)的是q=fs/x是利用两个三角形相似得到的吗?不知道能麻烦下楼主能否把那个图中的距离标注地更明确一些嘛,多谢啦
    普天同庆 于 8/12/2015 1:38:52 AM 回复
    [/QUOTE]感谢csk的帮助,做成了3D激光扫描,虽然精度不好。大体样子有了。水民BUAA 于 3/2/2013 7:48:30 PM 回复做这个得用多久啊。==
    我本科毕设老师也让做这个东西,自动化本科,没学过光学,没接触过摄像头和激光,用51单片机还可以。不知道两个月能不能搞出来呢?水民BUAA 于 3/2/2013 7:49:31 PM 回复请问我本科自动化,没接触过摄像头和激光器,用过51单片机,要是做这个本科毕设能做出来不= = 行的 于 7/4/2014 10:45:04 AM 回复用室内手持激光测距的木工激光尺,改造,单片机,与电脑数据连接,代替摄像头和玩具激光,是不是更好]px601[QUOTE=
  • 8/12/2015 1:38:52 AM 回复该留言
  • quote 58.XS30
  • 博主,您好,请问您的一字激光器和带通滤光片是在同一个波段上吗,还有就是50mw的功率会不会有点大,对于您的激光键盘这个问题来说。
  • 9/18/2015 3:28:30 AM 回复该留言
  • quote 59.陈佳腾
  • 您好,看到您说这个激光扫描可以应用到扫描物体得到全局点云。我试了一下,就是激光不动,物体旋转,可是为什么得到的点云数据,不管物体本身是什么形状,显示后都是一个圆呢,是不是算法的那个角度有问题呢?
    pch 于 10/21/2017 7:25:49 AM 回复
    您好,现在代码的链接不能用了,您能提供一下代码吗?QQ邮箱:1650211040@qq.com,可以有偿,望回复
    pch 于 10/21/2017 7:27:14 AM 回复
    您能提供一下代码吗?之前的链接不行了,QQ邮箱:1650211040@qq.com可以有偿,万分感谢
    pch 于 10/21/2017 7:27:39 AM 回复
    您能提供一下代码吗?之前的链接不行了,QQ邮箱:1650211040@qq.com可以有偿,万分感谢
  • 10/21/2017 7:27:39 AM 回复该留言
  • quote 61.张鑫
  • 请问您的代码能托管到github上么,google各种访问不了。。。
    pch 于 10/21/2017 7:34:31 AM 回复
    您好,现在代码的链接不能用了,您能提供一下代码吗?QQ邮箱:1650211040@qq.com,可以有偿,望回复
  • 10/21/2017 7:34:32 AM 回复该留言
  • quote 63.pclnathanbj
  • 楼主你好!3D室内扫描的数据能否直接用在OpenGL建模上?效果类似手动建模出的3维场景?
  • 7/24/2016 6:42:35 PM 回复该留言
  • quote 64.三扫
  • 楼主你好!
    我正在探索线光源3D扫描建模,十分佩服你的技术,能否麻烦你总结一下影响测量精度的其中因素?
  • 8/23/2016 3:30:47 AM 回复该留言
  • quote 65.123
  • p2的投影点P2' 到摄像头中心距离不应该也是焦距么,因为焦平面上的点到摄像头中心的距离不应该都是焦距么,求博主回答
    pch 于 10/21/2017 7:33:03 AM 回复
    您好,现在代码的链接不能用了,您能提供一下代码吗?QQ邮箱:1650211040@qq.com,可以有偿,望回复pch 于 10/21/2017 7:27:14 AM 回复您能提供一下代码吗?之前的链接不行了,QQ邮箱:1650211040@qq.com可以有偿,万分感谢[/QUOTE]
  • 10/21/2017 7:33:03 AM 回复该留言
  • quote 66.理工小菜鸡
  • 楼主你好,我想请问下如果激光点打在曲面上,反射光到不了摄像头怎么办
    pch 于 10/21/2017 7:33:55 AM 回复
    您好,现在代码的链接不能用了,您能提供一下代码吗?QQ邮箱:1650211040@qq.com,可以有偿,望回复
  • 10/21/2017 7:33:55 AM 回复该留言
  • quote 67.创投小菜鸟
  • 楼主好!

    想请问一下能加个微信不?我是做VC的在看机器人视觉方面的项目;但是经管背景出身不太懂,现在在学习过程中,希望能就激光雷达这方面的技术问题请教请教您。多谢

    我微信My1-stery
  • 3/22/2017 2:35:52 AM 回复该留言
  • quote 68.hahaha
  • 请问,为什么不能直接进行360度的成像 而是180度呢
  • 7/18/2017 8:32:40 AM 回复该留言
  • quote 69.烟台天棋
  • 您好!我想开发一个激光检测工具,精度0.1um,有意联系沟通一下,我的微信18653582612
  • 8/9/2017 7:21:28 PM 回复该留言
  • quote 70.小多
  • 请问博主,demo中的asc文件中后三位数据各代表什么意思?是x、y、z轴数据吗?
  • 12/29/2017 8:03:53 PM 回复该留言
  • quote 71.nuaalyh
  • const float a = 698.1;
    const float b = 4.354;
    const float c = 0.006912;
    const float d = -40.88;
    博主您好,请问a,b,c,d这四个数值是怎么来的,都是什么含义。
    float center_distance = a/(b-c*x);
    这行代码又作何解。
  • 5/4/2018 11:43:33 PM 回复该留言
  • quote 72.microwave
  • Hi博主,我从其他论坛追来的,我在做3D激光测距,能聊聊合作吗?
    wechat:microwavelee_lee
  • 8/14/2018 10:37:39 PM 回复该留言

发表评论:

注意:为了有效防止SPAM,任何含有http://字样的消息会被阻止发布同时,本站仅供技术交流,请不要讨论任何政治敏感话题或者低级趣味问题。

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Copyright Shikai Chen 2000-2012. Powered By Z-Blog(CSK Modified)