BlenderCN论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1099|回复: 1

Blender节点控制

[复制链接]
发表于 2018-2-2 14:20:26 | 显示全部楼层 |阅读模式
本帖最后由 蒜薹 于 2018-2-2 19:45 编辑

简介
    这里使用blender的目标是做相机旋转、平移以及空间点的三维显示。
    目前(2018.1.25)正在进行相机定位开发的第一阶段,已经通过对极几何得到了Essential Matrix(本质矩阵,之后简称E-Matrix),并通过对E-Matrix的分解和组合得到了相机的旋转矩阵R和平移向量t。R和t构成了相机的姿态,可以用Camera Matrix(相机矩阵,之后简称P)表示,方程见下。
P = K[R|t]
    相机矩阵的表示方程中,K为Camera intrinsic matrix(相机内部参数矩阵,简称相机内参矩阵),为3*3矩阵,[R|t]表示由旋转和平移合成的矩阵,左侧为3*3的旋转矩阵,右侧为3*1的平移向量,整体为3*4矩阵。
    由于数学求解的限制,R和t分别都有两个解,一共组合成4个相机姿态,其中只有一个是符合真实情况的,其余三个是错误的。为了筛选出正确的结果,使用Correspondece(匹配点)的空间坐标,只有真实的姿态会使匹配点位于相机前方,具体参考[Hartley, 2003]的第九章。
    计划在blender中,对相机的四种姿态进行3D显示,配合匹配点一并显示在其中,可以非常直观地把这一过程表现出来。
1 脚本文件命名
    python脚本程序命名为alice_checkingCamera.py,blender程序命名为blender-cameraMatrixChecking.blend。
2 检查Numpy
    Numpy库是python的一个基本库,提供了对矩阵操作的支持,在我们的开发中,虽然自行编写了矩阵库,但是还没有经过检验,所以这里仍然使用已经验证可行的矩阵库。
    检查方法是在blender脚本中使用numpy库构建一个矩阵,并进行一些矩阵操作,如矩阵SVD等。检查结果如下图,构建了一个3*3矩阵,并使用了SVD,结果正常,表明blender已经包含了Numpy库。

相机姿态筛选-numpy检查-2.jpg

blender内部numpy库检查通过

3 相机旋转和平移显示
    在机器人视觉工程中,相机的旋转和平移是以矩阵的形式得到的,在blender中显示的方法有挺多。
    首先讨论旋转,blender内提供了Axis Angle(轴角)、Euler(欧拉角)和Quaternion(四元数)三种旋转的表现方法,我们可以将旋转矩阵拆解,并转换为任何一种表现方法的参数,并赋予一个我们称之为“摄像机”的Object(对象)。但我现在的旋转矩阵拆解的知识不足以进行这个工作,因此在本文中,选择直接使用旋转矩阵,直接对我们认为的“摄像机”Object的所有Vertex(节点)进行逐个操作。
    相较于旋转,平移简单很多,仅仅是对空间三维坐标进行加法。由于旋转采用直接计算的方法,为了简化计算,将平移与旋转组合成为[R|t]矩阵,将其左乘vertex的坐标向量(x,y,z)T即可。注意,由于[R|t]是3*4矩阵,位于其右侧的坐标矩阵需要是4*1的,数学上,只要在矩阵最后添加1即可,P=(x,y,z,1)T,几何上,这种空间点的表示方法称为Homogeneous Coordinates(齐次坐标),相对的,只包含点的三个分量的矩阵形式称为Inhomogeneous Coordinates(非齐次坐标),P~=(x,y,z)T。
    同时,[R|t]与P相乘的结果是一个三维点的非齐次坐标形式,用P2~表示。
[R|t]*P1 = P2~
P2 = (x2, y2, z2)T
4 ObjectVertices的信息提取
    在相机定位开发的背景下,旋转和平移是用来显示相机的,具体而言,是用在代表相机的Object上的,实际上,是相机Object的所有vertices上的。
    以基于两张照片的相机坐标解算为例,两张照片分别来自待测相机和参考相机,规定参考相机的旋转矩阵为单位矩阵,平移矩阵的所有元素全为零,也就是参考相机相对于全局坐标系,不旋转、不平移,其First Camera Coordinate System与Global Coordinate System重合。
    对于待测相机,根据对极几何,从E-Matrix分解组合得到的旋转和平移矩阵,各有两个结果,用R1, R2和t1, t2表示,那么相机的姿态,也就是[R|t]会有4种情况。
    基于这些,在blender中,用一个Object表示参考相机,名为”Camera_ref”,用四个Objects表示待测相机,名为”Camera0”, ”Camera1”, ”Camera2”, ”Camera3”。这些Object都是来自于Cube,将一侧的四个节点缩小了。
    为了做旋转和平移,要得到camera的所有vertices坐标。vertices的坐标是vertices的数据成员之一,vertices是存储在meshes里面的,每一个object都有一个对应的mesh,不同的mesh通过meshName来区分,meshes是在bpy.data之中的。因此,为了得到vertices坐标,需要知道meshName,而上面说到的”Camera0”, ”Camera1”, ”Camera2”, ”Camera3”并不是meshName,而是ObjectName,是用来区分和获取Objects的。因此,需要建立从Object到Mesh的关系,这个关系就是meshName,存储在Object的data中,是作为data的数据成员之一存在的,称为”name”。
相机姿态筛选-blender编程5.png

相机姿态筛选-blender编程4-2.jpg
相机姿态筛选-blender编程3-1.jpg
5 Blender显示
相机姿态筛选-blender显示2.png
参考文献
[Hartley, 2003] Hartley, Richard, and A. Zisserman. "Multiple view geometry in computer vision. With foreword by Olivier Faugeras. 2nd edition." (2003).






发表于 2018-3-16 17:33:57 | 显示全部楼层
不明觉厉,完全看不懂
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

Blender最新中文教学视频|Blender头条|小黑屋|手机版|Archiver|Blender中国 ( 蜀ICP备17002929号 )360网站安全检测平台

GMT+8, 2019-1-22 01:05 , Processed in 0.018653 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表