-
2020-12-04 10:50:45
本发明为双目立体视觉的三维重建方法,属于图像处理与机器视觉领域,涉及halcon软件,具体涉及空间场景的三维重建。
背景技术:
三维重建技术作为计算机视觉领域的一个重要分支,在人工智能、虚拟现实、非接触无损检测等方面起着重要的作用。获取物体表面三维数据的方法有:一、利用建模软件进行重建。该方法可以构造出物体的精细结构,但是这些软件操作复杂,自动化程度低,建模周期长,需要大量的人力物力,在对不规则物体重建时真实感不高;二、利用激光设备、深度扫描仪等进行三维重建。该方法能够获得比较精确的三维数据,并且简单方便,建模周期短,但其设备比较昂贵,携带不方便;三、利用视频或图像来进行三维重建。该方法具有成本低、效率高、灵活性强、所需设备简单等特点,适合各种三维物体的重建。因此,基于图像或视频的重建方法无疑具有很高的使用价值。人类视觉能够把图像信息转换成立体信息,从而达到对客观真实世界在三维空间上的认知。在众多基于图像或视频进行三维场景重建的方法中,立体视觉的研究目标就是通过模仿人类的视觉机理,使机器人具有通过多幅图像认知周围环境信息的能力,这种能力不仅可以使机器人对客观三维场景中物体的几何信息、外形、位置、运动形态等进行感知,并且能够完成对这些信息的保存、描述、归纳与识别。
技术实现要素:
本发明为了重建现实场景中的三维模型,提供了一种基于双目立体视觉的三维重建方法,该系统包括图像采集模块、摄像机标定模块、图像预处理模块、立体校正模块、立体匹配模块、点云重建及模型重建模块;具体检测方法步骤为:
A、图像采集;B、摄像机标定;C、立体校正;D、图像预处理;E、立体匹配;F、点云重建及模型重建。
所述的图像采集模块的功能为:根据物体的尺寸,调整相机的位置及两个相机的距离与角度,拍摄物体不同角度的两幅图像,完成图像的实时采集。摄像机标定模块的功能为:以张正友标定法为基础对相机进行标定,建立摄像机图像像素坐标与场景点三维坐标之间的关系,根据摄像机模型,由标定板己知特征点的图像坐标和世界坐标求解摄像机的内外参数。立体校正模块的功能为:采用相交光轴结构的视觉系统,通过极线约束将图像校正为标准的外极线几何结构,使两图像的对应点在同一条极线上,缩小匹配搜索空间。图像预处理模块的功能为:将采集的电信号转化为数字图像信息,在计算机内实现存储、处理。图像处理软件采用德国MVtec公司开发的具有标准的机器视觉算法包、拥有应用广泛的机器视觉集成开发环境的HALCON软件。立体匹配模块的功能为:通过基于多重网格的立体匹配算法找到空间中一点在两幅图像投影中的对应点,获取得到整幅图像的稠密视差图。点云重建及模型重建模块的功能为:通过双目立体视觉的深度信息恢复原理获取物体的深度信息,计算空间点的三维坐标,得到空间三维点云,并对三维点云进行平滑滤波,最后进行三角剖分。
前面所述系统中,优选方案为,所述步骤A用到的设备有两个CCD摄像机、设备支架和计算机;两个CCD摄像机是采用相交光轴的结构形式固定在设备支架上,采集不同角度的物体图像对,通过总线接口将图像传输到计算机进行处理;所述摄像机的相机和镜头分别选用MV-VS120 CCD彩色高清工业相机和M-1614MP2工业镜头。
前面所述系统中,优选方案为,所述步骤B选用30×30mm,图像阵列为7×7,黑色圆点半径为0.9375mm,圆点中心距离为3.75mm的圆心陈列型平面标定模板,以张正友标定法为基础,具体步骤如下所示:
B1、采集多幅标定板图像,通过阈值分割找到标定板的内部区域;
B2、通过亚像素边缘提取方法得到标定板各个圆点的边缘,通过最小二乘圆拟合获取圆点的圆心坐标,确定圆心坐标与它们在图像中投影之间的对应关系以及标定板与摄像机之间大致的位置关系,即摄像机的外参初始值;
B3、调用Halcon库函数来确定两个摄像机的内参数、外参数以及两个摄像机之间的相对位置关系;最后,通过多次测量取平均值来确定相关参数信息。
前面所述系统中,优选方案为,所述步骤C通过极线约束进行立体校正,使两幅图像中的对应点在同一条水平极线上,并获取校正后相机参数。
前面所述系统中,优选方案为,所述步骤D具体步骤如下:
D1、把采集的彩色图像对通过加权平均法转化为灰度图像;
D2、全局阈值分割,获取图像中感兴趣的区域;
D3、进行直方图均衡化操作处理,使得图像的灰度分布趋向平均,图像所占有的像素灰度间距拉开,加大图像的反差,达到图像增强的目的。
前面所述系统中,优选方案为,所述步骤E具体步骤如下:
E1、通过极线约束及测量相机与目标物体的距离估计出的视差搜索空间,从而减少匹配的搜索范围;
E2、通过多重网格技术引进粗网格系列加速偏微分方程的收敛,提高匹配速度;
E3、通过细网格迭代,将残差从最细网格依次限制到粗糙的网格中,运用像素的灰度、梯度及平滑度相结合的相似度判断准则在粗网格搜索空间内寻找匹配点,得到视差值;
E4、将粗网格得到的视差值依次延拓到细网格,通过修正组合得到最终匹配点的视差值;
E5、按照以上步骤在整幅图像上进行遍历,直到得到完整连续的视差图。
前面所述系统中,优选方案为,所述步骤F具体步骤如下:
F1、通过双目立体系统深度恢复原理,获取图像每个点的三维空间坐标,得到三维点云;
F2、对空间点云进行基于移动最小二乘法的平滑滤波,获取平滑后的三维点云;
F3、对平滑后的三维点云进行基于贪婪算法的三角剖分,并立体显示。
与现有技术相比,本发明的优点在于:
1、本发明采用基于多重网格的密集型立体匹配算法。通过极线约束及测量相机与目标物体的距离估计出的视差搜索空间,从而减少匹配的搜索范围;通过多重网格技术引进粗网格系列加速偏微分方程的收敛,提高匹配速度,该方法首先通过细网格迭代,将残差从最细网格依次限制到粗糙的网格中,运用像素的灰度、梯度及平滑度相结合的相似度判断准则在粗网格搜索空间内寻找匹配点,然后依次延拓到细网格,通过修正组合得到最终匹配点的视差值,避免了对灰度值的过度依赖,并且可以通过平滑度估计未找到对应点的点的视差,所得视差域平滑连续;
2、本发明通过移动最小二乘拟合法对点云进行平滑滤波。通过采用局部高阶多项式为散乱点云提供一个逼近或插值曲面,然后通过迭代投影方法将分布在逼近曲面周围的点移至到曲面上来消除噪声,有效解决了分段拟合不能局部化处理的缺点,极大地提高了拟合曲面的连续性和光滑性;
3、本发明采用贪婪算法对平滑后的三维点云进行三角剖分。首先通过半径邻域搜索算法搜索符合条件的邻近点,并将邻域点投影到切平面上,使用贪婪算法进行局部二维三角剖分,然后将二维三角剖分点映射回空间中,形成空间三角网格,该方法思想简单,易于实现。
附图说明
图1为本发明的硬件连接图。
图2为本发明重建方法流程图。
图3为本发明得到的视差图。
图4为本发明平滑后的三维点云图。
图5为本发明得到的三角剖分图。
图6为本发明得到的模型图。
具体实施方式
下面结合实施例和实验例详细说明本发明的技术方案,但保护范围不限于此。
实施例
一种基于双目立体视觉的三维重建方法以及实现这种方法的图像处理系统,从而实现现实场景的重建。
图像处理系统结构图包含图像采集模块、摄像机标定模块、立体校正模块、图像处理模块、立体匹配模块以及点云重建及模型重建模块。
图1为本发明的系统结构图,其包括:
通过两个CCD相机拍摄两幅物体不同角度的图像;
通过摄像机总线接口将获取的图像传输到计算机进行处理;
图像处理单元为安装在计算机内部的halcon软件,用于将采集的图像进行灰度化、自动阈值分割、直方图均衡化、基于多重网格的立体匹配、基于移动最小二乘法的点云平滑以及基于贪婪算法的三角剖分等处理,进而获得物体的立体显示图;
图2为本发明的图像处理流程图,该方案包括如下步骤:
A、图像采集,具体步骤:两个CCD摄像机是采用相交光轴的结构形式固定在设备支架上,通过采集不同角度的物体图像对,通过总线接口传输到计算机进行处理;所述摄像机的相机和镜头分别选用维视图像MV-VS120 CCD彩色高清晰工业相机和M-1614MP2工业镜头;
B、摄像机标定,具体步骤如下所示:
B1、采集多幅标定板图像,通过阈值分割找到标定板的内部区域;
B2、通过亚像素边缘提取方法得到标定板各个圆点的边缘,通过最小二乘圆拟合获取圆点的圆心坐标,确定圆心坐标与它们在图像中投影之间的对应关系以及标定板与摄像机之间大致的位置关系,即摄像机的外参初始值;
B3、调用Halcon库函数来确定两个摄像机的内参数、外参数以及两个摄像机之间的相对位置关系;最后,通过多次测量取平均值来确定相关参数信息;
C、立体校正将图像校正为标准极线几何结构,并得到校正后的相机参数;
D、图像处理,具体步骤如下所示:
D1、把采集的彩色图像对通过加权平均法转化为灰度图像;
D2、进行直方图均衡化操作处理,使得图像的灰度分布趋向平均,图像所占有的像素灰度间距拉开,加大图像的反差,达到图像增强的目的;
D3、全局阈值分割,获取图像中感兴趣的区域;
E、基于多重网格的立体匹配,具体步骤如下所示:
E1、通过极线约束及测量相机与目标物体的距离估计出的视差搜索空间,从而减少匹配的搜索范围;
E2、通过多重网格技术引进粗网格系列加速偏微分方程的收敛,提高匹配速度;其基本思想是引进一种粗网格系列加速细网格修正量的传播,并通过套迭代过程反复求解,以得到快速消除低频误差,提高结果的准确性。多重网格方法包括细网格松弛、粗网格校正和套迭代技术过程,细网格松弛过程可以迅速去除高频分量,而粗网格修正过程可以消除被光滑的低频分量,套迭代技术负责通过限制算子和延拓算子连接各层通过不断迭代快速精确地处理问题;
E3、通过细网格迭代,将残差从最细网格依次限制到粗糙的网格中,运用像素的灰度、梯度及平滑度相结合的相似度判断准则在粗网格搜索空间内寻找匹配点,得到视差值;
E4、将粗网格得到的视差值依次延拓到细网格,通过组合修正得到最终匹配点的视差值;
E5、按照以上步骤在整幅图像上进行遍历,直到得到完整连续的视差图,如图3所示;
F、点云重建及模型重建,具体步骤如下所示:
F1、通过双目立体系统深度恢复原理,获取图像每个点的三维空间坐标,得到三维点云;
F2、对空间点云进行基于移动最小二乘法的平滑滤波,获取平滑后的三维点云。其基本思想通过采用局部高阶多项式为离散点云提供一个逼近曲面,然后采用迭代投影的方式将分布在逼近曲面周围的点移至到曲面上来,达到光滑点云表面的目的,通过拟合函数计算得到光滑后的三维坐标,获得平滑后的三维点云图,如图4所示;
F3、对平滑后的三维点云进行基于贪婪算法的三角剖分,该算法思想简单,易于实现,一旦被写入将不会被删除,这样使得算法的内存利用率较高。首先通过半径邻域搜索算法在以某空间点为中心半径为r的球内搜索符合条件的邻近点;将中心点以及它的邻域点投影到切平面上,使用基于三角形生长法的贪婪算法进行局部二维三角剖分;然后将二维三角剖分点映射回空间中,形成一张空间三角网格,继续对空间中其他点进行上述操作,直到形成一张完整的曲面,如图5所示,并立体显示,如图6所示。
应当指出的是,具体实施方式只是本发明比较有代表性的例子,显然本发明的技术方案不限于上述实施例,还可以有很多变形。本领域的普通技术人员,以本发明所明确公开的或根据文件的书面描述毫无异议的得到的,均应认为是本专利所要保护的范围。
更多相关内容 -
OpenCV+OpenGL 双目立体视觉三维重建.zip
2022-03-15 13:14:25由双目立体视觉进行三位重建的第一步是寻找两幅图像中的对应点。目前人们已经发明了很多二维图像配准算法,比如SIFT, SURF等等。最新版本的OpenCV 2.2中的features2d库中包含了很多常用的算法,其中特征点定位的算法... -
基于C++的双目立体视觉三维重建设计与实现
2022-05-04 13:49:56基于C++的双目立体视觉三维重建设计与实现 -
双目立体视觉三维重建
2018-07-22 17:15:08OpenCV+OpenGL 双目立体视觉三维重建 OpenCV 双目测距(双目标定、双目校正和立体匹配) 真实场景的双目立体匹配(Stereo Matching)获取深度图详解 图像获取 双目相机拍摄获取 左右目图像 双目标定 ...Overview
欢迎访问 持续更新:https://spatial-ai.net/stereo-vision-reconstruct.html
双目立体视觉的整体流程包括:
- 图像采集
- 双目标定
- 双目矫正
- 立体匹配
- 三维重建
1. 图像采集
双目相机采集 左右目图像
2. 双目标定
通过 双目标定工具 对双目相机进行标定,得到如下结果参数:
内参 外参 相机矩阵 K 1 , K 2 K_1, K_2 K1,K2 旋转矩阵 R R R 畸变系数 D 1 , D 2 D_1, D_2 D1,D2 平移向量 t t t 《Learning OpenCV》中对于 Translation 和 Rotation 的图示是这样的:
示例代码:
cv::Matx33d K1, K2, R; cv::Vec3d T; cv::Vec4d D1, D2; int flag = 0; flag |= cv::fisheye::CALIB_RECOMPUTE_EXTRINSIC; flag |= cv::fisheye::CALIB_CHECK_COND; flag |= cv::fisheye::CALIB_FIX_SKEW; cv::fisheye::stereoCalibrate( obj_points_, img_points_l_, img_points_r_, K1, D1, K2, D2, img_size_, R, T, flag, cv::TermCriteria(3, 12, 0));
3. 双目矫正
双目矫正 主要包括两方面:畸变矫正 和 立体矫正 。
利用 OpenCV的函数,主要分为
- stereoRectify
- initUndistortRectifyMap
- remap
stereoRectify
根据双目标定的结果 K 1 , K 2 , D 1 , D 2 , R , t K_1, K_2, D_1, D_2, R, t K1,K2,D1,D2,R,t,利用 OpenCV函数 stereoRectify,计算得到如下参数
- 左目 矫正矩阵(旋转矩阵) R 1 R_1 R1 (3x3)
- 右目 矫正矩阵(旋转矩阵) R 2 R_2 R2 (3x3)
- 左目 投影矩阵 P 1 P_1 P1 (3x4)
- 右目 投影矩阵 P 2 P_2 P2 (3x4)
- disparity-to-depth 映射矩阵 Q Q Q (4x4)
其中,
左右目投影矩阵(horizontal stereo, c x 1 ′ = c x 2 ′ {c_x}_1'={c_x}_2' cx1′=cx2′ if CV_CALIB_ZERO_DISPARITY is set)
P 1 = [ f ′ 0 c x 1 ′ 0 0 f ′ c y ′ 0 0 0 1 0 ] P_1 = \begin{bmatrix} f' & 0 & {c_x}_1' & 0 \\ 0 & f' & c_y' & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} P1=⎣⎡f′000f′0cx1′cy′1000⎦⎤
P 2 = [ f ′ 0 c x 2 ′ t x ′ ⋅ f ′ 0 f ′ c y ′ 0 0 0 1 0 ] P_2 = \begin{bmatrix} f' & 0 & {c_x}_2' & t_x' \cdot f' \\ 0 & f' & c_y' & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} P2=⎣⎡f′000f′0cx2′cy′1tx′⋅f′00⎦⎤
where
t x ′ = − B t_x' = -B tx′=−B
disparity-to-depth 映射矩阵
Q = [ 1 0 0 − c x 1 ′ 0 1 0 − c y ′ 0 0 0 f ′ 0 0 − 1 t x ′ c x 1 ′ − c x 2 ′ t x ′ ] Q = \begin{bmatrix} 1 & 0 & 0 & -{c_x}_1' \\ 0 & 1 & 0 & -c_y' \\ 0 & 0 & 0 & f' \\ 0 & 0 & -\frac{1}{t_x'} & \frac{ {c_x}_1'-{c_x}_2'}{t_x'} \end{bmatrix} Q=⎣⎢⎢⎡10000100000−tx′1−cx1′−cy′f′tx′cx1′−cx2′⎦⎥⎥⎤
通过 P 2 P_2 P2 可计算出 基线 长度:
baseline = B = − t x ′ = − P 2 ( 03 ) f ′ \begin{aligned} \text{baseline} = B = - t_x' = - \frac{ {P_2}_{(03)} }{f'} \end{aligned} baseline=B=−tx′=−f′P2(03)
示例代码:
cv::Mat R1, R2, P1, P2, Q; cv::fisheye::stereoRectify( K1, D1, K2, D2, img_size_, R, T, R1, R2, P1, P2, Q, CV_CALIB_ZERO_DISPARITY, img_size_, 0.0, 1.1);
CameraInfo DKRP
参考:sensor_msgs/CameraInfo Message
-
D: distortion parameters.
- For “plumb_bob”, the 5 parameters are: (k1, k2, t1, t2, k3)
-
K: Intrinsic camera matrix for the raw (distorted) images.
- Projects 3D points in the camera coordinate frame to 2D pixel coordinates using the focal lengths (fx, fy) and principal point (cx, cy).
K = [ f x 0 c x 0 f y c y 0 0 1 ] \mathbf{K} = \begin{bmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{bmatrix} K=⎣⎡fx000fy0cxcy1⎦⎤
- Projects 3D points in the camera coordinate frame to 2D pixel coordinates using the focal lengths (fx, fy) and principal point (cx, cy).
-
R: Rectification matrix (stereo cameras only).
- A rotation matrix aligning the camera coordinate system to the ideal stereo image plane so that epipolar lines in both stereo images are parallel.
- For monocular cameras R = I \mathbf{R} = \mathbf{I} R=I
-
P: Projection/camera matrix.
- For monocular cameras
P = [ f x 0 c x 0 0 f y c y 0 0 0 1 0 ] \mathbf{P} = \begin{bmatrix} f_x & 0 & c_x & 0 \\ 0 & f_y & c_y & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} P=⎣⎡fx000fy0cxcy1000⎦⎤ - For a stereo pair, the fourth column [Tx Ty 0]’ is related to the position of the optical center of the second camera in the first camera’s frame. We assume Tz = 0 so both cameras are in the same stereo image plane.
- The first camera
P = [ f x ′ 0 c x ′ 0 0 f y ′ c y ′ 0 0 0 1 0 ] \mathbf{P} = \begin{bmatrix} f_x' & 0 & c_x' & 0 \\ 0 & f_y' & c_y' & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} P=⎣⎡fx′000fy′0cx′cy′1000⎦⎤ - The second camera
P = [ f x ′ 0 c x ′ − f x ′ ⋅ B 0 f y ′ c y ′ 0 0 0 1 0 ] \mathbf{P} = \begin{bmatrix} f_x' & 0 & c_x' & -f_x' \cdot B \\ 0 & f_y' & c_y' & 0 \\ 0 & 0 & 1 & 0 \end{bmatrix} P=⎣⎡fx′000fy′0cx′cy′1−fx′⋅B00⎦⎤
- The first camera
- Given a 3D point [ X Y Z ] ′ [X Y Z]' [XYZ]′, the projection ( x , y ) (x, y) (x,y) of the point onto the rectified image is given by:
[ u v w ] = P ⋅ [ X Y Z 1 ] , { x = u w y = v w \begin{bmatrix} u \\ v \\ w \end{bmatrix} = \mathbf{P} \cdot \begin{bmatrix} X \\ Y \\ Z \\ 1 \end{bmatrix} , \quad \begin{cases} x = \frac{u}{w} \\ y = \frac{v}{w} \end{cases} ⎣⎡uvw⎦⎤=P⋅⎣⎢⎢⎡XYZ1⎦⎥⎥⎤,{x=wuy=wv
- For monocular cameras
initUndistortRectifyMap
左右目 分别利用 OpenCV函数 initUndistortRectifyMap 计算 the undistortion and rectification transformation map,得到
- 左目map: m a p 1 l , m a p 2 l map^l_1, map^l_2 map1l,map2l
- 右目map: m a p 1 r , m a p 2 r map^r_1, map^r_2 map1r,map2r
示例代码:
cv::fisheye::initUndistortRectifyMap(K1, D1, R1, P1, img_size, CV_16SC2, rect_map_[0][0], rect_map_[0][1]); cv::fisheye::initUndistortRectifyMap(K2, D2, R2, P2, img_size, CV_16SC2, rect_map_[1][0], rect_map_[1][1]);
Remap
左右目 分别利用 OpenCV函数 remap 并根据 左右目map 对左右目图像进行 去畸变 和 立体矫正,得到 左右目矫正图像
示例代码:
cv::remap(img_l, img_rect_l, rect_map_[0][0], rect_map_[0][1], cv::INTER_LINEAR); cv::remap(img_r, img_rect_r, rect_map_[1][0], rect_map_[1][1], cv::INTER_LINEAR);
4. 立体匹配
根据双目矫正图像,通过 BM或SGM等立体匹配算法 对其进行立体匹配,计算 视差图
视差计算
通过 OpenCV函数 stereoBM (block matching algorithm),生成 视差图(Disparity Map) (CV_16S or CV_32F)
disparity map from stereoBM of OpenCV :
It has the same size as the input images. When disptype == CV_16S, the map is a 16-bit signed single-channel image, containing disparity values scaled by 16. To get the true disparity values from such fixed-point representation, you will need to divide each disp element by 16. If disptype == CV_32F, the disparity map will already contain the real disparity values on output.So if you’ve chosen disptype = CV_16S during computation, you can access a pixel at pixel-position (X,Y) by:
short pixVal = disparity.at<short>(Y,X);
, while the disparity value isfloat disparity = pixVal / 16.0f;
; if you’ve chosen disptype = CV_32F during computation, you can access the disparity directly:float disparity = disparity.at<float>(Y,X);
5. 三维重建
(1)算法1:根据视差图,利用 f ′ f' f′ 和 B B B 通过几何关系计算 深度值,并利用相机内参计算 三维坐标
根据上图相似三角形关系,得
Z B = Z − f B − d w ⟹ Z = B f d w \frac{Z}{B} = \frac{Z-f}{B-d_w} \quad \Longrightarrow \quad Z = \frac{Bf}{d_w} BZ=B−dwZ−f⟹Z=dwBf
其中, f f f 和 d w d_w dw 分别为 成像平面的焦距和视差,单位均为 物理单位,将其转换为 像素单位,上式写为
Z = B f ′ d p Z = \frac{B f'}{d_p} Z=dpBf′
其中,
d p = ( O r − u r ) + ( u l − O l ) = ( u l − u r ) + ( O r − O l ) d_p = (O_r - u_r) + (u_l - O_l) = (u_l - u_r) + (O_r - O_l) dp=(Or−ur)+(ul−Ol)=(ul−ur)+(Or−Ol)
最终,深度计算公式如下,通过遍历图像可生成 深度图
Z = depth = B ⋅ f ′ d p with d p = disp ( u , v ) + ( c x 2 ′ − c x 1 ′ ) Z = \text{depth} = \frac{B \cdot f'}{d_p} \quad \text{with} \quad d_p = \text{disp}(u,v) + ({c_x}_2' - {c_x}_1') Z=depth=dpB⋅f′withdp=disp(u,v)+(cx2′−cx1′)
根据 小孔成像模型,已知 Z Z Z 和 相机内参 可计算出 三维点坐标,从而可生成 三维点云
{ Z = depth = f ′ ⋅ B d p X = u − c x 1 ′ f ′ ⋅ Z Y = v − c y ′ f ′ ⋅ Z 或 { bd = B d p Z = depth = f ′ ⋅ bd X = ( u − c x 1 ′ ) ⋅ bd Y = ( u − c y ′ ) ⋅ bd \begin{aligned} \begin{cases} Z = \text{depth} = \frac{f' \cdot B}{d_p} \\ X = \frac{u-{c_x}_1'}{f'} \cdot Z \\ Y = \frac{v-{c_y}'}{f'} \cdot Z \end{cases} \end{aligned} \text{或} \begin{aligned} \begin{cases} \text{bd} = \frac{B}{d_p}\\ Z = \text{depth} = f' \cdot \text{bd} \\ X = (u-{c_x}_1') \cdot \text{bd} \\ Y = (u-{c_y}') \cdot \text{bd} \end{cases} \end{aligned} ⎩⎪⎪⎨⎪⎪⎧Z=depth=dpf′⋅BX=f′u−cx1′⋅ZY=f′v−cy′⋅Z或⎩⎪⎪⎪⎨⎪⎪⎪⎧bd=dpBZ=depth=f′⋅bdX=(u−cx1′)⋅bdY=(u−cy′)⋅bd
其中, disp ( u , v ) \text{disp}(u,v) disp(u,v) 代表 视差图 坐标值
(2)算法2:根据视差图,利用 Q Q Q 矩阵 计算 三维点坐标(reprojectImageTo3D)
[ X ′ Y ′ Z ′ W ] = Q ⋅ [ u v disp ( u , v ) 1 ] \begin{bmatrix} X' \\ Y' \\ Z' \\ W \end{bmatrix} = Q \cdot \begin{bmatrix} u \\ v \\ \text{disp}(u,v) \\ 1 \end{bmatrix} ⎣⎢⎢⎡X′Y′Z′W⎦⎥⎥⎤=Q⋅⎣⎢⎢⎡uvdisp(u,v)1⎦⎥⎥⎤
最终,三维点坐标为
[ X Y Z ] = [ X ′ W Y ′ W Z ′ W ] \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} = \begin{bmatrix} \frac{X'}{W} \\[2ex] \frac{Y'}{W} \\[2ex] \frac{Z'}{W} \end{bmatrix} ⎣⎡XYZ⎦⎤=⎣⎢⎢⎢⎡WX′WY′WZ′⎦⎥⎥⎥⎤
深度图 图像类型
- 单位meter --> 32FC1
- 单位millimeter --> 16UC1
总结
-
公垂线法双目立体视觉三维重建
2020-10-16 08:51:21双目立体视觉测量系统是工业测量中的重要手段,三维重建是双目立体视觉测量体统中非常重要的一环。基于视差原理的传统三维...结果表明该方法可达到传统视觉三维重建方法的测量精度,并可有效判断匹配点是否为误匹配点。 -
vs2015+opencv2.4.10实现的双目立体视觉三维重建c++代码
2018-06-11 18:55:14vs2015+opencv2.4.10实现的双目立体视觉三维重建c++代码。SGBM立体匹配 -
OpenCV+OpenGL 双目立体视觉三维重建
2021-09-30 00:00:20OpenCV+OpenGL 双目立体视觉三维重建代码以及文档 使用opencv进行立体匹配获取视差图,三角剖分 使用opengl进行纹理贴图 需要配置opengl,opencv,vs2015工程 博客地址: ... -
yuan基于双目视觉的三维重建(matlab),双目立体视觉三维重建,matlab源码.zip
2021-10-15 00:53:40yuan基于双目视觉的三维重建(matlab),双目立体视觉三维重建,matlab源码 -
基于python的单目与双目视觉三维重建设计与实现
2022-05-04 13:56:04基于python的单目与双目视觉三维重建设计与实现 -
双目视觉的三维重建
2015-04-08 16:44:42这是双目视觉的三维重建代码,希望对大家有所帮助 -
论文研究-双目立体视觉三维重建实验平台研究.pdf
2019-09-12 15:32:18提出了一种新的基于模糊理论的小波域自适应鲁棒性水印算法,目前很多小波域算法都没有真正实现自适应,该算法充分考虑了HVS掩蔽特性,利用离散小波变换的性质和模糊熵衡量出来的纹理特征和亮度对噪声的掩盖因子确定... -
利用matlab实现三维重建,双目视觉的三维重构
2020-10-21 20:20:16很好的源码,思路清晰,利用双目实现的,大家有兴趣使用的可以直接下载,可以应用到比赛和论文内的,工具是matlab,代码也很好理解 -
双目视觉三维重建
2022-01-13 17:26:42三维重建一、三维重建概述
三维重建主要是研究如何从得到的匹配点中计算出相机的投影矩阵(如果是外部标定的话,就是求出相机的外部参数)以及如何计算出匹配点的三维坐标。 目前研究的进展与之还相差较远。研究人员为了能够表达三维空间信息,目前较多地采用三维矢量图形来替代三维位图。主要的重构方法有如下几种: (1)、空间点的重建 这是三维重构中的最基本的方法。空间任一点在两个摄像机中分别成像,得到该点在两个图像中的对应坐标,在知道两摄像机的参数矩阵的条件下,通过建立以该点的世界坐标为未知数的 4 个线性方程,可以用最小二乘法求解得该点的世界坐标。有一种简化计算的办法,选取两个内部参数完全相同的摄像机,将他们平行配置,使他们的光轴相互平行。这种方法计算相当简单,不需要进行外部参数标定。但一般情况下,两个摄像机的内部参数完全相同(包括两摄像机的拍摄状态也相同)是很难选到。摄像机安装时无法看到光轴和成像平面,故难以实施。 (2)、空间直线、空间二次曲线的重建 空间直线和空间曲线也是组成空间图形的主要基元。根据空间直线射影变换前后仍是直线的性质,以此来分析空间直线与图像中的直线之间的关系。空间直线在CCD上的成像可以这样认为,空间直线与摄像机光心构成的平面与成像平面的交线,两台摄像机有两个这样的平面,这两个平面的交线就是空间直线。空间二次曲线是空间二次曲面与平面的交线,因此二次曲线的平面曲线,在CCD上的成像可以认为是由空间二次曲线与光心组成的锥面与成像平面的交线。两台摄像机有两个这样的锥面,求这两个空间锥面的交线,就是空间曲线。 (3)、全像素的三维重建 对图像中的每个像素都进行三维重建,这当然是最理想的情况,目前要实施这种重构,需要相当严格的测量条件,且仅限于对某一具体对象,但效果并不理想。对此人们正在进行大量的研究,还有待于进一步的努力。
二、空间点的三维重建
1、基本模型 空间点三维重建的基本模型如图(4.1)所示,对于空间物体表面任意一点P,如果用C1摄像机观察,看到它在C1摄像机的图像点位于p1,但他们无法由p1得知P的三维位置,事实上,在O1P(O1为C1摄像机的光心)连线上任意一点P’的图像点都是p1,因此,由p1点的位置,我们只知道空间点位于O1P1与O2P2两条直线的交点,即它们的三维位置是唯一确定的。
假如我们能够得到物体表面上所有点的三维坐标,则三维物体的形状与位置就是唯一确定的,在某些简单场合,例如三维物体时一个多面体,我们只需要知道它的各个顶点的三维坐标与相邻关系,则该多面体的形状与位置是唯一确定的。因此,用立体视觉的方法获取三维点的坐标是十分基础的。2、最小二乘法求解三维坐标值 下面我们来具体介绍求解三维点坐标的算法。在进行讨论之前,我们要明确一下几点基本假设:空间任意点P在两个摄像机C1与C2上的图像点平p1与p2已经从两个图像中分别检测出来。即已知p1与p2为空间同一点P的对应点。至于对应点是如何找到的,这属于图像配准问题。还有一个假设就是,摄像机C1与C2已标定,他们的投影矩阵分别为M1与M2,于是有:
其中,(u1,v1,1)与(u2,v2,1)分别为P1与P2点在各自图像中的图像齐次坐标;(X,y,Z,1)为P点在世界坐标系下的齐次坐标;mijk为Mk的第i行第j列元素。式(4.1)与式(4.2)消去Zc1与Zc2得到关于X,Y,Z的四个线性方程:
由于空间点P是O1p1与O2p2的交点,它必然同时满足式(4.3),式(4.4),我们可以联立这四个式子,从而求出P点的坐标(X,Y,Z)。四个方程,三个未知数,也就是说这个方程组只有三个独立的方程,这是因为我们已经假设P1与P2点是空间同一点P的对应点,因此已经假设了直线O1p1与O2p2一定相交,或者说,这四个方程必定有解,而且解是唯一的。而实际应用中,由于数据总是有噪声的,我们可以用最小二乘法求出P的三维点坐标(X,Y,Z)。
3、视差测距法以上我们介绍了空间点三维重建的一般方法,为了更清楚的了解上述过程的物理意义,下面我们讨论在一种简单的摄像机配置下的空间点重建方法,视差测距法。此方法要求选用两个内部参数完全相同的摄像机,将它们平行放置,使它们的光轴相互平行,另有一对坐标轴共线,两个成像平面共面,两摄像机的光心有一个固定的距离d,这样求解图像点的世界坐标时只涉及摄像机内参数。原理如图(4.2)所示:
在上述特殊摄像机配置下,假设C1坐标系为O1x1y1z1,C2坐标系为O2x2y2z2,焦距为f,摄像机间距为d,任何空间点P的坐标在C1下为(x1,y1,z1),在C2坐标系下为(x2,y2,z2),在左摄像机中的图像点左边为(u1,v1),在右摄像机中的图像点坐标为(u2,v2)。根据式(4.5),式(4.6)的摄影比例关系,对于左右摄像机有如下关系:
世界坐标系与摄像机坐标系的关系可表述如下:
联立上两式可得:
进而可得:
由式(4.5)和式(4.8)可计算的空间点的三维坐标:式(4.9)即为双目立体视觉重构三维空间点的方法,可见,通过图像对视差和像点坐标就可以恢复出物体的三维坐标。但是由于对设备配置的要求比较苛刻,只是被应用在一些简单的视觉系统。本文采用的还是针对一般摄像机参数的三维重建方法,这样大大扩展了带云台的摄像机的视野范围,从而增强了移动机器人视觉系统的灵活性。
-
ZYNQ上基于FPGA加速的 双目立体视觉 三维重建 生成 实时深度图彩虹图
2021-04-08 16:19:08ZYNQ上基于FPGA加速的 双目立体视觉 三维重建 生成 实时深度图彩虹图 (zedboard板) 1.在ZYNQ上完成双目采集成像,PS+PL协同处理。 2.在ZYNQ上完成相机标定,镜头校准。 3.在ZYNQ上完成立体匹配算法,目前已实现...ZYNQ上基于FPGA加速的 双目立体视觉 三维重建 生成 实时深度图彩虹图 (zedboard板)
1.在ZYNQ上完成双目采集成像,PS+PL协同处理。
2.在ZYNQ上完成相机标定,镜头校准。
3.在ZYNQ上完成立体匹配算法,目前已实现局部立体匹配BM以及半全局立体匹配SGBM
4.在ZYNQ上完成了立体匹配后的深度图转换彩虹图,即彩色深度图
5.在ZYNQ上也完成了测距算法,但是目前没有识别算法,只能取图像一点计算距离。精度在10mm内。有效距离目前测试在5m内。
6.优化了所有的算法,目前接近720p的图像质量,并且帧率在30fps左右。详细的实现过程会出一个专栏,每周更一次,从零开始的项目搭建ZYNQ上的实时三维重建。
部分实验过程记录:
标定过程:
-
【图像重建】双目视觉三维重建含Matlab源码
2022-03-21 21:21:33基于双目立体视觉的三维重建通过相机标定搭建一个对准的标准立体实验平台采集图像,进而对图像进行特征点检测与匹配找到待重建点,然后通过双目视觉原理计算三维坐标,最后进行纹理映射.根据真实图像的实验结果表明,... -
双目视觉特征点匹配三维重建
2018-01-02 13:58:28双目视觉利用两幅图像进行特征点匹配,生成三维点云,完成三维重建 -
【三维重建】三维重建学习笔记(5)—— 双目立体视觉系统
2021-11-09 20:44:47第五章 双目立体视觉系统 一、平行视图 1.基础矩阵的另一种形式 之前定义了基础矩阵\(F={{{K}'}^{-T}}[{{T}_{\times }}]R{{K}^{-1}}\) 极几何 不妨设世界坐标系和\({{O}_{1}}\)摄像机坐标系重合,\({e}'\)可以... -
双目视觉三维重建 - SLAM技术交流 - PaoPaoRobot - BBS - Powered by phpwind
2020-12-04 10:50:46各位好,最近在学习双目立体视觉的相关知识,有没有大神能讲解一下利用双目相机的原始图、生成的视差图和相机内参生成点云的方法和 demo code,还有我在利用BM算法生成的深度图用照片查看器无法打开,提示无效的位图... -
基于双目立体视觉三维重建系统的研究与设计
2010-06-13 17:27:19文章涉及三维重建的方法,基于立体视觉原理,从2D重建3D模型的方法 -
双目立体视觉在机器人三维重建定位中的方法研究
2014-03-04 20:45:31是一篇研究生毕业论文,双目立体视觉在机器人三维重建定位中的方法研究 -
python图像处理三维重建所有代码
2018-05-27 00:01:52计算三维重建的方法称为SfM(Structure from Motion).\ 假设计算机已经标定,计算重建的部分可以分为下面四个步骤:\ (1)、检测特征点,然后在两幅图间进行特征点匹配。\ (2)、有匹配算出基础矩阵。\ (3)、由... -
三维重建-双目立体视觉原理
2019-12-11 16:12:13三维重建是个跨多学科的应用领域,围绕不同的尺度大小、不同速度要求、不同精度要求、不同硬件成本等要求发展出了各种各样的技术方案。在这个应用领域,充分体现了,没有最好的设备,只有最合适的方案。在本系列文章... -
双目立体三维重建原理及介绍
2021-12-02 16:22:25立体视觉、三位重建