1.一种基于平面表面高动态范围图像的真实点光源位置测算方法,其特征在于:采用彩色数码相机与三角架相连,彩色数码相机与计算机相连,计算机中存有若干即62个圆,并将其编号dt记为1,2,3,...,62的半径为10mm大正圆随机分布,做为随机点云标定模板,将随机点云标定模板印刷于210mm*297mm纯白色表面光滑不透光pvc板上,记作随机点云标记板;
具体的测算步骤如下:
步骤1、将三角架调至适当高度,并调整三脚架的云台部分,使得通过彩色数码相机具体步骤如下的取景器目镜能够看到随机点云标记板的全部,将彩色数码相机调至M档,拍摄五张仅曝光时间不同的标记板照片,分别记为Pic0、Pic1、Pic2、Pic3、Pic4,对应的曝光时间依次记为Ev0、Ev1、Ev2、Ev3、Ev4,五张标记板照片的图像分辨率均为pix1*pix2;
步骤2、使用MALAB R2012b中的makehdr函数和Ev0、Ev1、Ev2、Ev3、Ev4,将Pic0、Pic1、Pic2、Pic3、Pic4合成为一张随机点云标记板高动态范围图像,记为HDRI,存储于计算机4中;
步骤3、在随机点云标记板上建立以随机点云标记板的几何中心为原点O、沿纸面向上为Z轴正方向的右手坐标系,记为世界坐标系;
步骤4、使用MALAB R2012b将HDRI上所有像素点的luminance值存储到pix1*pix2的数组中,记为lum,其中lum(i,j)表示HDRI上坐标为(i,j)像素点的luminance值,在HDRI中随机点云标记板区域内的白色部分任意选取五个像素点,依次分别记为point0、point1、point2、point3、point4,并记它们在HDRI中的像素坐标依次分别为 ,
同时,易获取point0、point1、point2、point3、point4所对应的luminance值,依次分别记为 ;
步骤5、使用OpenCV1.0中的cvThreshold函数,对随机点云标定模板进行二值化;使用OpenCV1.0中的cvFindContours函数,在二值化后的HDRI中找出各图形的轮廓的点集;使用OpenCV1.0中的cvCvtSeqToArray函数,依次将每一个图形的轮廓的点集转换为一维数组,一维数组中元素的类型都为CvPoint;最后,使用OpenCV1.0中的cvFindContours函数,对每个一维数组进行圆拟合,得到每个圆的圆心坐标,记为 ,
并从rotatedrect数据结构中提取出每个圆的二次曲线方程记为:
其中 分别为编号为
dt的圆二次曲线方程的多项式系数,令
,
并将 归一化记为 ;
步骤6、将随机点云标定模板中的每一个圆的 (后文称做“中心圆”)与其最近的4个圆的 (后文称做“邻近圆”)构成一个按照中心圆编号为次序的PN*5矩阵,记为YU,其中YU[dt][0]记录中心圆的 ,YU[dt][ii]记录其最近4个圆的,ii=0,1,2,3,如图4所示为一组,计算出每个中心圆曲线与其邻近圆曲线间的做为边长,其中 ;
根据余弦定理计算方法如下:
将每个中心圆的四个余弦值存储为62*4的数组,记为YXJ1,其中YXJ1(dt,0)、YXJ1(dt,
1)、YXJ1(dt,2)、YXJ1(dt,3)表示随机点云标定模板中编号为dt的圆的4个相关余弦值,记为 ;
步骤7、使用OpenCV1.0中的cvThreshold函数,对HDRI进行二值化;使用OpenCV1.0中的cvFindContours函数,找出每一个可见椭圆的轮廓点集;随后,需使用OpenCV1.0中的cvCvtSeqToArray函数,依次将每一个可见椭圆的轮廓的点集转换为一维数组,一维数组中元素的类型都为CvPoint;最后,使用OpenCV1.0中的cvFitEllipse函数,对每个一维数组进行椭圆拟合,得到每个椭圆的圆心在世界坐标系下的坐标,记为 ,
并从rotatedrect数据结构中提取出每个可见椭圆的二次曲线方程记为:
其中 分别为编号
为 的椭圆二次曲线方程的多项式系数,令
,
并将 归一化记为 ,其中 表示HDRI中可见椭圆的编号;
步骤8、将HDRI中的每一个可见的椭圆的 (后文称做“中心椭圆”)与其最近的4个椭圆的 (后文称做“邻近椭圆”)构成一个按照中心椭圆编号为次序的TN*5矩阵,记为TU,其中TU(dt’,0)记录中心椭圆的 ,TU(dt’, ii)记录其最近4椭圆的 ,ii=0,1,2,3,如图5所示为一组,计算出每个中心椭圆与其邻近椭圆间的做为边长,其中 ;
根据余弦定理计算方法如下:
将每个中心椭圆处的四个余弦值存储为TN*4的数组,记为YXJ2[TN][4],其中YXJ2[dt’]表示摄影球图片中可见的编号为dt’的椭圆的4个相关余弦值可记为 ,
TN表示在HDRI中观察到的椭圆圆点的总数;
步骤9、将数组YXJ2与YXJ1进行比较,找出其中相匹配的点,其满足: ;
按照YXJ1中各点顺序将YXJ2中与YXJ1中相匹配的点存储于TN*4的数组中,记为YXJ3;
步骤10、将YXJ1中每个圆形的圆心的坐标 和YXJ3中对应的椭圆圆心的坐标 传递给OpenCV1.0中的摄像机标定函数CalibrateCamera2,便可得彩色数码相机的3*3旋转矩阵R和3*1平移矩阵T,从而可以计算得到point0、point1、point2、point3、point4在世界坐标系中的坐标 ,N=0,1,2,3,4:令
,
,
由 解出采样点point0、point1、point2、point3、point4在世界坐标系中的坐标;
步骤11、将point0、point1、point2、point3、point4中的任意四个点为一组,分为不重复的五组,并将这五组采样点所对应的在世界坐标系中的坐标和luminance值存储到一个
5*4*4数组中,记为g_pi,其中g_pi[n][p][q](q=0,1,2)表示第n组采样点中第p个采样点在世界坐标系中的坐标,g_pi[n][p][3]表示第n组采样点中第p个采样点的luminance值;
步骤12、分别假设n=0、1、2、3、4,对g_pi[n][p][3]执行步骤13、14、15操作;
步骤13、根据对实际点光源的位置,估计出大致测算范围M,使得欲测算的点光源能够位于以随机点云标记板所在平面为底面的M*M*M的立方体内,该立方体记为C,设该场景下环境光的luminance值为lum_amb,则可针对每组采样点利用牛顿迭代法解如下方程组:设最终待求点光源在图2所示坐标系中的坐标为 ,
,
该方程组记为“三球方程组”;
步骤14、每组采样点在解步骤13中涉及的方程组时所选取的初始值可采用如下方法确定:由M*M*M立方体的各边中点,将M*M*M的待分割立方体分割为等大的八个较小的立方体,按照方位顺序将这八个较小立方体编号,并记为Cf,其中f=0,1,2,…,7,此八个较小立方体的体中心点在世界系中的空间坐标记为 ,并计算如下式子: ,
该式记为“最小距离式”,其中 为步骤13中牛顿迭代法解方程组时以为初始值的估算结果;
步骤15、选取使得最小距离式成立的体中心点所在较小立方体作为新的待分割立方体,重复操作步骤14,直到最小距离式的结果值小于0.001或者待分割立方体的边长不大于
0.01,重复步骤14终止,至此,求得每组采样点所估算出的关于lum_amb的点光源坐标,记为;
步骤16、以步骤13中涉及的lum_amb为自变量,求解出满足下式的lum_amb值: ;
步骤17、根据步骤16中所得的lum_amb值,依照步骤14、15所述操作求解三球方程组,并将五个三球方程组的结果坐标取平均值;
通过以上步骤便可快速、高精度地估计实际空间中点光源的位置并且为后期在三维建模软件中将其虚拟化做准备。