精华内容
下载资源
问答
  • OpenCV实现SfM(二):双目三维重建

    万次阅读 多人点赞 2015-09-02 14:33:18
    使用OpenCV3.0实现双目三维重建,原理清晰,实践有效。

    注意:本文中的代码必须使用OpenCV3.0或以上版本进行编译,因为很多函数是3.0以后才加入的。
    目录:

    文章目录


    #极线约束与本征矩阵

    在三维重建前,我们先研究一下同一点在两个相机中的像的关系。假设在世界坐标系中有一点pp,坐标为XX,它在1相机中的像为x1x_1,在2相机中的像为x2x_2(注意x1x_1x2x_2为齐次坐标,最后一个元素是1),如下图。
    这里写图片描述
    XX到两个相机像面的垂直距离分别为s1s_1s2s_2,且这两个相机具有相同的内参矩阵KK,与世界坐标系之间的变换关系分别为[R1  T1][R_1\ \ T_1][R2  T2][R_2\ \ T_2],那么我们可以得到下面两个等式
    s1x1=K(R1X+T1)s2x2=K(R2X+T2) s_1x_1 = K(R_1X + T_1) \\ s_2x_2 = K(R_2X + T_2)
    由于K是可逆矩阵,两式坐乘K的逆,有
    s1K1x1=R1X+T1s2K1x2=R2X+T2 s_1K^{-1}x_1 = R_1X + T_1 \\ s_2K^{-1}x_2 = R_2X + T_2
    K1x1=x1K^{-1}x_1 = x_1^{'}K1x2=x2K^{-1}x_2 = x_2^{'},则有
    s1x1=R1X+T1s2x2=R2X+T2 s_1x_1^{'} = R_1X + T_1 \\ s_2x_2^{'} = R_2X + T_2
    我们一般称x1x_1^{'}x2x_2^{'}为归一化后的像坐标,它们和图像的大小没有关系,且原点位于图像中心。
    由于世界坐标系可以任意选择,我们将世界坐标系选为第一个相机的相机坐标系,这时R1=I, T1=0R_1 = I,\ T_1 = 0。上式则变为
    s1x1=Xs2x2=R2X+T2 s_1x_1^{'} = X \\ s_2x_2^{'} = R_2X + T_2
    将第一式带入第二式,有
    s2x2=s1R2x1+T2 s_2x_2^{'} = s_1R_2x_1^{'} + T_2
    x2x_2^{'}T2T_2都是三维向量,它们做外积(叉积)之后得到另外一个三维向量T2^x2\widehat{T_2}x_2^{'}(其中T2^\widehat{T_2}为外积的矩阵形式,T2^x2\widehat{T_2}x_2^{'}代表T2×x2T_2\times x_2^{'}),且该向量垂直于x2x_2^{'}T2T_2,再用该向量对等式两边做内积,有
    0=s1(T2^x2)TR2x1 0 = s_1(\widehat{T_2}x_2^{'})^TR_2x_1^{'}

    x2T2^R2x1=0 x_2^{'}\widehat{T_2}R_2x_1^{'} = 0
    E=T2^R2E = \widehat{T_2}R_2
    x2Ex1=0 x_2^{'}Ex_1^{'} = 0
    可以看出,上式是同一点在两个相机中的像所满足的关系,它和点的空间坐标、点到相机的距离均没有关系,我们称之为极线约束,而矩阵EE则称为关于这两个相机的本征矩阵。如果我们知道两幅图像中的多个对应点(至少5对),则可以通过上式解出矩阵EE,又由于EE是由T2T_2R2R_2构成的,可以从E中分解出T2T_2R2R_2
    如何从EE中分解出两个相机的相对变换关系(即T2T_2R2R_2),背后的数学原理比较复杂,好在OpenCV为我们提供了这样的方法,在此就不谈原理了。

    #特征点提取与匹配
    从上面的分析可知,要求取两个相机的相对关系,需要两幅图像中的对应点,这就变成的特征点的提取和匹配问题。对于图像差别较大的情况,推荐使用SIFT特征,因为SIFT对旋转、尺度、透视都有较好的鲁棒性。如果差别不大,可以考虑其他更快速的特征,比如SURF、ORB等。
    本文中使用SIFT特征,由于OpenCV3.0将SIFT包含在了扩展部分中,所以官网上下载的版本是没有SIFT的,为此需要到这里下载扩展包,并按照里面的说明重新编译OpenCV(哎~真麻烦,-_-!)。如果你使用其他特征,就不必为此辛劳了。
    下面的代码负责提取图像特征,并进行匹配。

    void extract_features(
    	vector<string>& image_names,
    	vector<vector<KeyPoint>>& key_points_for_all,
    	vector<Mat>& descriptor_for_all,
    	vector<vector<Vec3b>>& colors_for_all
    	)
    {
    	key_points_for_all.clear();
    	descriptor_for_all.clear();
    	Mat image;
    
    	//读取图像,获取图像特征点,并保存
    	Ptr<Feature2D> sift = xfeatures2d::SIFT::create(0, 3, 0.04, 10);
    	for (auto it = image_names.begin(); it != image_names.end(); ++it)
    	{
    		image = imread(*it);
    		if (image.empty()) continue;
    
    		vector<KeyPoint> key_points;
    		Mat descriptor;
    		//偶尔出现内存分配失败的错误
    		sift->detectAndCompute(image, noArray(), key_points, descriptor);
    
    		//特征点过少,则排除该图像
    		if (key_points.size() <= 10) continue;
    
    		key_points_for_all.push_back(key_points);
    		descriptor_for_all.push_back(descriptor);
    
    		vector<Vec3b> colors(key_points.size());
    		for (int i = 0; i < key_points.size(); ++i)
    		{
    			Point2f& p = key_points[i].pt;
    			colors[i] = image.at<Vec3b>(p.y, p.x);
    		}
    		colors_for_all.push_back(colors);
    	}
    }
    
    void match_features(Mat& query, Mat& train, vector<DMatch>& matches)
    {
    	vector<vector<DMatch>> knn_matches;
    	BFMatcher matcher(NORM_L2);
    	matcher.knnMatch(query, train, knn_matches, 2);
    
    	//获取满足Ratio Test的最小匹配的距离
    	float min_dist = FLT_MAX;
    	for (int r = 0; r < knn_matches.size(); ++r)
    	{
    		//Ratio Test
    		if (knn_matches[r][0].distance > 0.6*knn_matches[r][1].distance)
    			continue;
    
    		float dist = knn_matches[r][0].distance;
    		if (dist < min_dist) min_dist = dist;
    	}
    
    	matches.clear();
    	for (size_t r = 0; r < knn_matches.size(); ++r)
    	{
    		//排除不满足Ratio Test的点和匹配距离过大的点
    		if (
    			knn_matches[r][0].distance > 0.6*knn_matches[r][1].distance ||
    			knn_matches[r][0].distance > 5 * max(min_dist, 10.0f)
    			)
    			continue;
    
    		//保存匹配点
    		matches.push_back(knn_matches[r][0]);
    	}
    }
    

    需要重点说明的是,匹配结果往往有很多误匹配,为了排除这些错误,这里使用了Ratio Test方法,即使用KNN算法寻找与该特征最匹配的2个特征,若第一个特征的匹配距离与第二个特征的匹配距离之比小于某一阈值,就接受该匹配,否则视为误匹配。当然,也可以使用Cross Test(交叉验证)方法来排除错误。

    得到匹配点后,就可以使用OpenCV3.0中新加入的函数findEssentialMat()来求取本征矩阵了。得到本征矩阵后,再使用另一个函数对本征矩阵进行分解,并返回两相机之间的相对变换R和T。注意这里的T是在第二个相机的坐标系下表示的,也就是说,其方向从第二个相机指向第一个相机(即世界坐标系所在的相机),且它的长度等于1。

    bool find_transform(Mat& K, vector<Point2f>& p1, vector<Point2f>& p2, Mat& R, Mat& T, Mat& mask)
    {
    	//根据内参矩阵获取相机的焦距和光心坐标(主点坐标)
    	double focal_length = 0.5*(K.at<double>(0) + K.at<double>(4));
    	Point2d principle_point(K.at<double>(2), K.at<double>(5));
    
    	//根据匹配点求取本征矩阵,使用RANSAC,进一步排除失配点
    	Mat E = findEssentialMat(p1, p2, focal_length, principle_point, RANSAC, 0.999, 1.0, mask);
    	if (E.empty()) return false;
    
    	double feasible_count = countNonZero(mask);
    	cout << (int)feasible_count << " -in- " << p1.size() << endl;
    	//对于RANSAC而言,outlier数量大于50%时,结果是不可靠的
    	if (feasible_count <= 15 || (feasible_count / p1.size()) < 0.6)
    		return false;
    
    	//分解本征矩阵,获取相对变换
    	int pass_count = recoverPose(E, p1, p2, R, T, focal_length, principle_point, mask);
    
    	//同时位于两个相机前方的点的数量要足够大
    	if (((double)pass_count) / feasible_count < 0.7)
    		return false;
    
    	return true;
    }
    

    #三维重建
    现在已经知道了两个相机之间的变换矩阵,还有每一对匹配点的坐标。三维重建就是通过这些已知信息还原匹配点在空间当中的坐标。在前面的推导中,我们有
    s2x2=K(R2X+T2)s_2x_2 = K(R_2X + T_2)
    这个等式中有两个未知量,分别是s2s_2XX。用x2x_2对等式两边做外积,可以消去s2s_2,得
    0=x2^K(R2X+T2) 0 = \widehat{x_2}K(R_2X+T_2)
    整理一下可以得到一个关于空间坐标X的线性方程
    x2^KR2X=x2^KT2 \widehat{x_2}KR_2X = -\widehat{x_2}KT_2
    上面的方程不能直接取逆求解,因此化为其次方程
    x2^K(R2  T)(X1)=0 \widehat{x_2}K(R_2\ \ T)\left(\begin{matrix}X \\ 1\end{matrix}\right) = 0
    用SVD求X左边矩阵的零空间,再将最后一个元素归一化到1,即可求得X。其几何意义相当于分别从两个相机的光心作过x1x_1x2x_2的延长线,延长线的焦点即为方程的解,如文章最上方的图所示。由于这种方法和三角测距类似,因此这种重建方式也被称为三角化(triangulate)。OpenCV提供了该方法,可以直接使用。

    void reconstruct(Mat& K, Mat& R, Mat& T, vector<Point2f>& p1, vector<Point2f>& p2, Mat& structure)
    {
    	//两个相机的投影矩阵[R T],triangulatePoints只支持float型
    	Mat proj1(3, 4, CV_32FC1);
    	Mat proj2(3, 4, CV_32FC1);
    
    	proj1(Range(0, 3), Range(0, 3)) = Mat::eye(3, 3, CV_32FC1);
    	proj1.col(3) = Mat::zeros(3, 1, CV_32FC1);
    
    	R.convertTo(proj2(Range(0, 3), Range(0, 3)), CV_32FC1);
    	T.convertTo(proj2.col(3), CV_32FC1);
    
    	Mat fK;
    	K.convertTo(fK, CV_32FC1);
    	proj1 = fK*proj1;
    	proj2 = fK*proj2;
    
    	//三角化重建
    	triangulatePoints(proj1, proj2, p1, p2, structure);
    }
    

    #测试
    我用了下面两幅图像进行测试
    这里写图片描述

    得到了着色后的稀疏点云,是否能看出一点轮廓呢?!

    这里写图片描述
    这里写图片描述

    图片中的两个彩色坐标系分别代表两个相机的位置。
    在接下来的文章中,会将相机的个数推广到任意多个,成为一个真正的SfM系统。

    关于源代码的使用
    代码是用VS2013写的,OpenCV版本为3.0且包含扩展部分,如果不使用SIFT特征,可以修改源代码,然后使用官方未包含扩展部分的库。软件运行后会将三维重建的结果写入Viewer目录下的structure.yml文件中,在Viewer目录下有一个SfMViewer程序,直接运行即可读取yml文件并显示三维结构。

    代码下载

    展开全文
  • 双目三维重建程序
  • OpenCV实现SfM:双目三维重建

    千次下载 热门讨论 2015-09-02 14:29:19
    使用OpenCV3.0进行双目三维重建。 代码是用VS2013写的,OpenCV版本为3.0且包含扩展部分,如果不使用SIFT特征,可以修改源代码,然后使用官方未包含扩展部分的库。软件运行后会将三维重建的结果写入Viewer目录下的...
  • 双目三维重建——层次化重建思考 FesianXu 2020.7.22 at ANT FINANCIAL intern 前言 本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐述了双目三维重建的若干种层次化的方法,包括投影重建,仿射重建和...
    双目三维重建——层次化重建思考
    FesianXu 2020.7.22 at ANT FINANCIAL intern

    前言

    本文是笔者阅读[1]第10章内容的笔记,本文从宏观的角度阐述了双目三维重建的若干种层次化的方法,包括投影重建,仿射重建和相似性重建到最后的欧几里德重建等。本文作为介绍性质的文章,只提供了这些方法的思路,并没有太多的细节,细节将会由之后的博文继续展开。如有谬误,请联系作者指出,转载请注明出处。

    \nabla 联系方式:

    e-mail: FesianXu@gmail.com

    QQ: 973926198

    github: https://github.com/FesianXu

    知乎专栏: 计算机视觉/计算机图形理论与应用

    微信公众号
    qrcode


    : 在阅读本文之前,强烈推荐读者先阅读[4]和[5], 以了解[几何变换的层次——投影变换,仿射变换,度量变换和欧几里德变换的具体区别]和[conic圆锥线和quadric二次曲锥面的定义和应用],在本文中将会基于这些前置知识进行讨论。同时作为成像的基础知识,相机内外参数的知识[6]也是必须了解的。

    双目三维重建简介

    作为三维重建,我们希望能够得到被重建物体的结构(也就是三维世界中的点的位置信息)。在双目三维重建中,正如其“双目”所言,我们假设有两个摄像机对某个物体进行观测,得到了多视角对同一个物体描述的图片。通常,在三维重建任务中,我们通过一系列的前置算法,可以得到这些多视角图片之间的对应点关系,如Fig 1所示,点pl\mathbf{p}_l和点pr\mathbf{p}_r都是三维世界客体点P\mathbf{P}的投影,也就是说它们是一对 对应点(correspondence),通常我们用xixi\mathbf{x}_i \leftrightarrow \mathbf{x}_i^{\prime}表示一对对应点。笔者之前的博文[2,3]中曾经根据对极线约束和图像矫正对对应点的影响进行过介绍,读者有兴趣可自行查阅。

    stereovision

    Fig 1. 双目多视角图片之间的对应点,其都是对三维世界中客体点P的投影。

    通常来说,在三维重建任务中,我们假设对应点对应的三维点P\mathbf{P}的位置是未知的,需要我们求出,并且我们也不知道相机的方向,位置和内参数校准矩阵等(也就是外参数和内参数都未知)。整个重建任务就是需要去计算相机矩阵P\mathrm{P}P\mathrm{P}^{\prime},使得对于三维点Xi\mathbf{X}_i有:
    xi=PXi,xi=PXii(1) \mathbf{x}_i = \mathrm{P} \mathbf{X}_i, \mathbf{x}_i^{\prime} = \mathrm{P}^{\prime} \mathbf{X}_i \\ \forall i \tag{1}
    其中的ii表示的是对应点的编号。当给定的对应点太少时,这个任务是显然不能完成的,但是如果给定了足够多的对应点,那么我们就有足够的约束去唯一确定出一个基础矩阵(Fundamental Matrix)[2] 出来,如式子(2)所示(当然,求解这个基础矩阵也并没有那么简单,这个并不在本文中进行阐述)。此时,整个三维重建将会存在一种称之为 投影歧义 (projective ambiguity)的现象,我们将会在下文进行介绍。作为无校准的相机来说,在不引入任何先验知识进行约束的情况下,这是双目三维重建能得到的最好结果。在添加了其他对场景的先验知识后(比如平行线约束,垂直线约束,摄像机内参数相同假设等),投影歧义可以被减少到仿射歧义甚至是相似歧义的程度。
    xTFx=0(2) \mathbf{x}^{\mathrm{T}} \mathcal{F} \mathbf{x}^{\prime} = 0 \tag{2}
    总的来说,重建过程的三部曲可以分为:

    1. 根据对应点计算得到基础矩阵。
    2. 根据基础矩阵计算得到相机矩阵P,P\mathrm{P},\mathrm{P}^{\prime}
    3. 对于每对对应点xixi\mathbf{x}_i \leftrightarrow \mathbf{x}_i^{\prime}来说,通过三角测量法,计算其在空间上的三维点坐标位置。

    注意到本文对这些重建方法的介绍只是一个概念性的方法,读者需要明晰的是,不要尝试单纯地实现本文介绍的方法去实现重建,对于真实场景的图片而言,重建过程存在着各种噪声(比如对应点对可能不准确,存在噪声等,需要鲁棒估计),这些具体的方法我们将会在之后的博文介绍。

    这里需要单独拎出来提一下的是 三角测量法(Triangulation),如Fig 2所示,在计算得到了相机矩阵P,P\mathrm{P},\mathrm{P}^{\prime}之后,我们知道x,x\mathbf{x},\mathbf{x}^{\prime}满足对极约束xTFx=0\mathbf{x}^{\mathrm{T}} \mathcal{F} \mathbf{x}^{\prime} = 0,换句话说,我们知道x\mathbf{x}在对极线Fx\mathcal{F}\mathbf{x}^{\prime}上,反过来这意味着从图像点x,x\mathbf{x},\mathbf{x}^{\prime}反向投影得到的射线共面,因此它们的反向射线将会交于一点X\mathbf{X}。通过三角测量的方法,我们可以测量除了基线上的任意一个三维空间点,原因在于基线上的点的反向射线是共线的,因此不能唯一确定其相交点。

    triangulation

    Fig 2. 通过三角测量法去确定三维空间中的点。

    重建歧义性

    重建过程存在或多或少的歧义性,为了解决歧义性,我们需要引入额外的信息。

    单纯地从对应点去进行场景,物体的三维重建必然是有一定的歧义性的,只是说引入了对场景一定的先验知识后,这种歧义性会得到缓解。举个例子,光从成对的对应点对(甚至可能是多个视角的点对),都不能计算出场景的绝对位置(指的是地球上的经纬度)和绝对朝向,这点很容易理解,例如Fig 3所示,即便是给定了相机内参数等,也不可能决定b和c这两个走廊的具体的东西走向,还是南北走向,亦或是其经纬度,这些涉及到地理位置的绝对信息无法光从相机重建得到。

    corridor

    Fig 3. 不引入其他任何知识,只从相机得到的照片,无法判断场景的绝对地理信息。

    一般来说,基于相机的重建,我们称它最好的情况下,对于世界坐标系来说,都只能是欧几里德变换(包括这旋转和偏移)。当然,如果我们的相机没有标定,也就是内参数未知,就Fig 3的走廊为例子,我们无法确定走廊的宽度和长度,它可能是3米,也可能只是一个玩具走廊,只有30厘米,这些都有可能。在不引入对场景尺度的任何先验而且相机没有标定的情况下,我们称基于相片的场景重建只能最好到相似性变换(也就是是存在旋转,偏移和尺度缩放)。

    如果用数学形式去解释这个现象,用Xi\mathbf{X}_i表示一系列场景中的三维点,P,P\mathrm{P},\mathrm{P}^{\prime}表示一对相机,其将三维点投影到xi,xi\mathbf{x}_i, \mathbf{x}_i^{\prime}。假设我们有相似性变换HS\mathrm{H}_S
    HS=[Rt0Tλ](3) \mathrm{H}_S = \left[\begin{matrix} \mathrm{R} & \mathbf{t} \\ \mathbf{0}^{\mathrm{T}} & \lambda \end{matrix}\right] \tag{3}
    其中的R\mathrm{R}是旋转矩阵,t\mathbf{t}是偏移,λ1\lambda^{-1}是尺度放缩。假设我们对三维点进行相似性变换,那么我们用HSXi\mathrm{H}_S\mathbf{X}_i取代Xi\mathbf{X}_i,并且用PHS1\mathrm{P}\mathrm{H}_S^{-1}PHS1\mathrm{P}^{\prime}\mathrm{H}_S^{-1}取代原来的相机参数P,P\mathrm{P},\mathrm{P}^{\prime}。我们发现,因为有PXi=(PHS1)(HSXi)\mathrm{P}\mathbf{X}_i = (\mathrm{P}\mathrm{H}_S^{-1})(\mathrm{H}_S \mathbf{X}_i),因此在图像上的投影点位置是不会改变的。 通常来说,在不引入其他先验的情况下,我们会发现,在重建过程中,算法只会保证图像上的投影点的位置是投影正确的,没法保证三维空间的其他信息了。

    相似歧义性

    更进一步,我们对相机参数进行分解,有P=K[RPtP]\mathrm{P} = \mathrm{K}[\mathrm{R}_P | \mathbf{t}_P],那么经过相似性变换之后,有:
    PHS1=K[RPR1t](4) \mathrm{P}\mathrm{H}_S^{-1} = \mathrm{K} [\mathrm{R}_P\mathrm{R}^{-1} | \mathbf{t}^{\prime}] \tag{4}
    一般情况下,我们不是很关心偏移t\mathbf{t}^{\prime}。我们会发现,相似性变换并不会改变其相机内参数,K\mathrm{K}是不会改变的,也就是说,即便是对于校准后的相机,最好的重建结果也会存在相似性歧义,我们称之为 相似性重建 (Similarity reconstruction, metric reconstruction)。 如Fig 4的图a所示,这就是相似性歧义的示意图,我们无法确定场景的绝对大小。

    proj_ambiguity

    Fig 4. 重建的相似性歧义性和投影歧义性

    如果两个相机的内参数中的焦距都是已知的,那么这个重建最好能到 相似性重建 (similarity reconstruction) 的程度,其重建过程引入的是 相似歧义性 (similarity ambiguity)。也就是说,重建出来的场景只会在尺度大小上和真实场景的有差别。

    投影歧义性

    如果我们对内参数一无所知,也不知道相机之间的相对位置关系,那么整个场景的重建将会陷入 投影歧义性 (projective ambiguity),如Fig 4的图b所示。同样我们可以假设一个不可逆的矩阵 HPR4×4\mathrm{H}_P \in \mathbb{R}^{4 \times 4} 作为投影矩阵,用我们在之前介绍的方法,我们会发现将投影矩阵同时作用在三维点和相机上时,不影响图像上的投影点位置。因此实际的重建三维点将会是投影歧义的。这个称之为 投影重建 (Projective reconstruction),投影重建和相似重建的不同之处在于,相似重建因为相机内参数已经知道,因此相机焦点位置是确定的,而投影重建因为没有校准机参数,因此焦点位置可能会变化,Fig 4示意图就明确了这一点。

    仿射歧义性

    如果两个相机只是存在位置偏移上的变化,而内参数完全相同(可以视为是同一个相机的在不同位置拍摄的相片),那么重建过程是最好能达到 仿射重建 (affine reconstruction)的程度,相对应的,这个重建过程会引入 仿射歧义性 (affine ambiguity)。举个例子,假如我们知道不同相机之间的焦距都是一样的(焦距是内参数的一部分),因此整个场景可能存在旋转,偏移和尺度放缩或者切变(Shear)[7]。但是不会存在如同Fig 4所示的投影歧义的那么严重的歧义性。

    度量重建和欧几里德重建

    一般来说,我们同样可以用 度量重建 (metric reconstruction) 去表述相似性重建,因为相似性重建过程中的某些量 比如 线与线的角度,线段比例等度量在重建场景和真实场景中应该是一致的。另外,当我们说到 欧几里德重建 (Euclidean reconstruction) 的时候,一般我们也是把它当做度量重建或者是相似性重建的别称,因为没有其他额外的知识,比如场景的世界坐标上的朝向,景深甚至是世界坐标经纬度等,我们是无法真正地实现欧几里德重建的,而这些额外知识已经脱离了基于相机的重建了。

    理想点,无限远平面和IAC

    我们曾经在博文[4,7]中提到过理想点(Ideal point),无限远平面(The plane at infinity)和IAC (Image of Absolute Conic)[8]。这些几何元素是用于描述投影空间中的一些性质,包括变换前后的不变性。这里进行知识回顾并且进一步的介绍。

    简单来说,在投影变换过程中,平行线的平行性质将得不到保留,因此可能存在 透视 (perspective) 现象,具体体现出来如同Fig 5所示。这里的平行线交汇的无限远处的消失点我们称之为 理想点, 由所有理想点所组成的平面称之为 无限远平面 ,我们用符号Π\Pi_{\infty}表示。

    parallel_road

    Fig 5. 本来应该是平行的马路,在相机成像的时候,则变成了“不平行”,汇聚于无限远处的消失点(vanishing point)。

    在谈到绝对圆锥曲线 (Absolute Conic, AC) 和 绝对圆锥曲线的投影 (Image of Absolute Conic, IAC) 之前,我们可以举个日常生活中的例子,我们都知道月亮离我们很远,可以视为是在无限远处的一个圆形(圆锥曲线的一种特例),想象你开车行驶在一条笔直的道路上,右侧空中高悬着圆月,你会发现不管你怎么疾驰,月亮仿佛都跟随着你,而且位置不变,大小也不变。

    这个浪漫的“月亮跟着我”的例子,正是欧几里德变换对于处在无限远处平面上的绝对圆锥线的影响。 绝对圆锥曲线AC 是指的处在无限远平面上的圆锥曲线(圆锥曲面),而 绝对圆锥曲线的投影IAC 指的是绝对圆锥曲线在成像平面上的投影,如Fig 6所示,通常我们用Ω\Omega表示IAC,用ω\omega表示AC,其中CC表示的是焦点。当距离足够远,可以视为无限远时,我们直观上会发现,只要成像平面是欧几里德变换的,那么AC将不会改变,原因很简单,因为任何的旋转,平移对于无限远而言,都太过渺小,因此可以视为没有任何欧式变换能够影响这些性质。因此,我们知道 欧几里德变换不影响IAC的形状大小

    IAC_AC

    Fig 6. 在无限远平面上的AC和在成像平面上的IAC。

    我们为什么要在这里讨论这些概念呢?原因在于,不管是几何变换也好,三维重建也好,都会涉及到“变”与“不变”的量,当需要对某些变化的量约束到不变的量时,我们需要添加条件,比如固定住无限远平面的位置,固定AC的形状大小等,从而可以减少歧义性,实现更精确的三维重建。

    层次化三维重建

    通过在投影重建的基础上,添加一系列的信息,我们可以分别得到场景的仿射重建,相似性重建。

    我们考虑双目三维重建的层次化过程。首先作为基础的,假设我们的相机是没有校准的,我们需要基于对应的两张图像之间的对应点,求得场景的投影重建后,再添加若干信息,可以分别得到场景的仿射重建,相似性重建。

    对于未校准的相机而言,假设给定了两张图片之间的对应点xixi\mathbf{x}_i \leftrightarrow \mathbf{x}_i^{\prime},通过式子(2)我们可以计算出基础矩阵F\mathcal{F}。通过之前的分析,我们知道存在投影矩阵 HP\mathrm{H}_P 可以使得场景重建存在投影歧义性,如Fig 5所示。

    需要注意的是,我们这里提到的对应点对不能在两台相机的焦点连线上(也就是基线),这个我们之前也提到过。

    proj_rec

    Fig 5. 投影重建带来的投影歧义性,对于单次重建来说,投影重建的每个可能的场景都是投影一致性的。

    仿射重建

    从投影重建到仿射重建,回忆下我们在[4]中曾经讨论的:

    仿射变换不会影响无限远平面的位置

    也就是说,为了消除投影歧义性,我们需要添加约束 固定 无限远平面的位置。用数学形式化地表达我们整个过程,假设我们现在已经有了一个对场景的投影重建结果,包括一个三元组(P,P,{Xi})(\mathrm{P}, \mathrm{P}^{\prime}, \{\mathbf{X}_i\}),其中P,P\mathrm{P}, \mathrm{P}^{\prime}是相机矩阵,Xi\mathbf{X}_i为场景坐标点集。进一步假设我们确定平面π\pi作为真正的无限远平面,那么这个平面将会用一个齐次坐标下的向量表示,有πR4\pi \in \mathbb{R}^4。我们需要把这个平面挪到(0,0,0,1)T(0,0,0,1)^{\mathrm{T}}去,因此需要找到一个投影矩阵,将π\pi映射到(0,0,0,1)T(0,0,0,1)^{\mathrm{T}},也就是有:H1π=(0,0,0,1)T\mathrm{H}^{-1}\pi = (0,0,0,1)^{\mathrm{T}}。有:
    H=[I0πT](5) \mathrm{H} = \left[ \begin{matrix} \mathrm{I} | \mathbf{0} \\ \pi^{\mathrm{T}} \end{matrix} \right] \tag{5}

    此时的H\mathrm{H}可以作用在所有的三维重建后的点集和两个相机矩阵上,注意到,公式(5)将会在πT=0\pi^{\mathrm{T}} = \mathbf{0}的情况下失效。 通过求得这个投影矩阵,我们得到了 仿射重建

    然而,正如我们说的,除非我们添加一些额外的信息,否则无限远平面 π\pi 是不能确定下来的,我们接下来给出几个例子,说明什么类型的信息是足够确定这个平面的。

    偏移运动

    偏移运动 (Translational motion) 指的是我们已知拍摄出来的两张照片来自于同一个相机,只不过是这两张照片来自于不同的视角下拍摄的,而且这个视角变化只是由于相机矩阵的tT\mathbf{t}^{\mathrm{T}} 也即是偏移造成的。简单来说,就是如Fig 6 所示,黄色平面就是只是存在平移的相机,而灰色平面则同时存在平移和旋转。

    rectification_coplanar

    Fig 6. 绿色物体为成像客体,黄色平面是只存在偏移变化的相机,而灰色平面则存在着偏移和旋转。

    回忆下我们刚才提到的“月亮跟着我”的例子,对于无限远处的物体来说,只是存在平移变化,是不会影响该物体的位置的(因为平移的距离对比他们之间的距离来说,实在是微不足道)。因此,相机的平移不会影响两张照片中的处在无限远处平面的点的位置,让我们用X\mathrm{X}表示这个处在无限远处平面的点。如Fig 7所示,两幅图像的对极点位置在图像中的相机坐标系是一致的,就是因为相机的平移大小对于走廊的深度来说是微不足道的,因此可以视为是无限远平面,因此对极点不变。我们可以知道,投影形成这些不变点的三维空间点,是处在无限远处的,通过匹配点和图片的像素位置(通过两个条件,既是匹配点又是图片上不变的点去筛选),我们可以寻找得到三组以上的这种无限远处的点,并且通过最小二乘法或者解析法求出这个无限远处平面π\pi

    corridor

    Fig 7. 纯平移运动不会改变远处(可以视为无限远处)的对极点位置。

    虽然这样原理上是可行的,但是实际上计算过程中存在较大的数值问题,事实上我们这样计算出的基础矩阵是一个反对称(skew-symmetric)矩阵,这意味着我们还需要对基础矩阵进行约束。 事实上,在实际中最常用的约束还是下面谈到的平行线约束。

    平行线约束

    我们知道仿射变换不改变平行线的平行性,而投影变换则可能会改变,那么根据这个知识,我们可以从场景中寻找三组以上的本应该在实际三维空间中平行,却因为投影的透视现象在图像中相交的平行线,将它们的交点视为是无限远处的点,因此可以确定出无限远处平面π\pi

    parallel_lines

    Fig 8. 寻找场景中三组本应该在实际三维空间中平行,却在图像中因为存在透视而相交的平行线,它们的交点作为无限远处的点,可以确定出无限远处平面。

    这个过程听起来挺理想,然而因为存在噪声,多组不同的平行线在图片中不一定会交于一个点,这个时候我们需要鲁棒估计进行数值问题上的求解,我们之后再讨论。

    我们如果在认真观察Fig 8我们会发现,虽然仿射重建保留了平行性,但是却不保证正交性,因此图(b)的右下图其实是不能保证的,我们一般只能得到(b)的左下图,为了保证场景的正交性,我们要到度量重建中才会考虑。

    线段比例

    我们知道仿射变换是不会改变变换前后线段之间的比例,见[4]中的具体描述。这为我们计算无限远处的消失点(vanishing point)又提供了一种思路:我们可以通过引入真实三维世界中某个直线上的线段比例长度去确定消失点的位置,如Fig 9和Fig 10所示。具体的计算过程我们之后的博文进行介绍。

    equal_length

    Fig 9. 根据实际世界中的线段比例去计算消失点位置。

    affine_rectification

    Fig 10. 通过引入线段比例的先验知识,从而将投影歧义性消除。

    无限单应性矩阵

    一旦无限远处平面被确定下来,我们就确定了仿射重建,随后我们就有一个被称之为“无限单应性矩阵”(The infinite homography)的特殊矩阵。这个矩阵负责把两个相机的图像中的无限远处的消失点进行映射,是一个2D的单应性矩阵。假设相机P\mathrm{P}对应的拍摄的图片的消失点x\mathbf{x}对应在无限远处平面的客体点是X\mathbf{X},然后假设该客体点在另一个相机P\mathrm{P}^{\prime}对应拍摄的图片的投影为x\mathbf{x}^{\prime}。那么这个无限单应性矩阵存在有以下性质:
    x=Hx(6) \mathbf{x}^{\prime} = \mathrm{H}_{\infty} \mathbf{x} \tag{6}
    假设我们知道两个相机矩阵
    P=[Mm]P=[Mm](7) \begin{aligned} \mathrm{P} &= [\mathrm{M} | \mathbf{m}] \\ \mathrm{P}^{\prime} &= [\mathrm{M}^{\prime} | \mathbf{m}^{\prime}] \\ \end{aligned} \tag{7}
    他们是符合仿射重建的相机矩阵,那么我们有无限单应性矩阵H=MM1\mathrm{H}_{\infty} = \mathrm{M}^{\prime} \mathrm{M}^{-1}。这个并不难证明得到,留个读者自证。结合其(6),我们有:
    x=MM1x(8) \mathbf{x}^{\prime} = \mathrm{M}^{\prime} \mathrm{M}^{-1} \mathbf{x} \tag{8}
    也即是说,通过寻找两个图片的对应的消失点对,我们可以计算得到无限单应性矩阵H\mathrm{H}_{\infty}。我们接下来可以对相机矩阵中的某一个进行标准化,因此(7)变化为:

    P=[I0]P=[Me](8) \begin{aligned} \mathrm{P} &= [\mathrm{I} | \mathbf{0}] \\ \mathrm{P}^{\prime} &= [\mathrm{M}^{\prime} | \mathbf{e}^{\prime}] \\ \end{aligned} \tag{8}

    此时H=H\mathrm{H}_{\infty} = \mathrm{H}^{\prime},也就是说,通过计算得到无限单应性矩阵,我们可以恢复从仿射重建的相机矩阵。

    其中一个相机是仿射相机

    假设我们确定两个相机之中的其中一个是仿射相机[10],当然,仿射相机只是对投影相机的一种近似,其近似的基本假设就是被拍摄物体的表面纹理深度对于拍摄的距离来说可以忽略不计,也就是[11]中所说的弱深度纹理,low-relief。我们知道仿射相机进行的是仿射变换,因此不会移动无限远处平面的位置,而且我们知道仿射相机的主平面(principle plane)就是无限远处平面,并且它就可以用相机矩阵的第三行向量表示。那么假设最简单的情况,我们把这个仿射相机的相机矩阵P\mathrm{P}标准化为P=[I0]\mathrm{P} = [\mathrm{I} | \mathbf{0}],第三行为(0,0,1,0)T(0,0,1,0)^{\mathrm{T}},因此要把这个无限远处平面固定到(0,0,0,1)T(0,0,0,1)^{\mathrm{T}},只需要:

    1. 同时简单地交换两个相机矩阵的最后两列;
    2. 同时交换每个三维客体点Xi\mathbf{X}_i的最后两个坐标即可。

    相似性重建/度量重建

    我们知道在仿射变换中,变换前后无限远处平面的位置不变;我们也知道在相似性变换/度量变换中,变换前后位于无限远处平面上的绝对圆锥曲线AC的位置不变。基于此,我们从仿射重建中消除仿射歧义性,将结果提升到度量重建的依据就在于,如何固定绝对圆锥线AC的位置。 与此同时,因为绝对圆锥线Ω\Omega_{\infty}位于无限远处平面上,因此确定了AC的位置也就意味着确定了无限远处平面的位置。

    回忆下我们在博文[5]中,曾经讨论过圆锥曲线和二次圆锥面的数学表达式,简单来说,我们知道,描述一个圆锥线可以表达为:
    xTCx=0(9) \mathbf{x}^{\mathrm{T}} \mathbf{C} \mathbf{x} = 0 \tag{9}
    其中曲线上的点为x=(x1,x2,x3)T\mathbf{x} = (x_1, x_2, x_3)^{\mathrm{T}},圆锥线CR3×3\mathbf{C} \in \mathbb{R}^{3 \times 3}为:
    C=[ab/2d/2b/2ce/2d/2e/2f](10) \mathbf{C} = \left[\begin{matrix} a & b/2 & d/2 \\ b/2 & c & e/2 \\ d/2 & e/2 & f \end{matrix} \right] \tag{10}

    在实践当中,最简单的方法是考虑其中一幅图像中的IAC。IAC是AC在图像上的成像投影,因此是一个圆锥曲线。根据焦点的位置对IAC进行反向投影,就形成了一个圆锥,如Fig 6所示,这个圆锥交于无限远处平面,就形成了AC。我们需要注意的是,IAC是图像本身的一个性质,就像图像中的点,线条一样,不取决于某个特定的重建,因此其对于重建中的变换来说是不变的。

    假设已知了仿射重建,其中某个相机矩阵为P=[Mm]\mathrm{P} = [\mathrm{M} | \mathbf{m}],用这个相机成像得到的图像中的IAC为ω\omega,那么,度量重建可以由这个仿射重建进行某个3D变换后得到,变换矩阵为:
    H=[A11](11) \mathrm{H} = \left[\begin{matrix}\mathrm{A}^{-1} & \\ & 1 \end{matrix}\right]\tag{11}
    其中的A\mathrm{A}可以由Cholesky分解得到,我们有AAT=(MTωM)1\mathrm{A}\mathrm{A}^{\mathrm{T}} = (\mathrm{M}^{\mathrm{T}}\omega\mathrm{M})^{-1},当然前提要保证(MTωM)1(\mathrm{M}^{\mathrm{T}}\omega\mathrm{M})^{-1}是正定的,否则不能进行Cholesky矩阵分解。该证明具体可见[1]。

    由此可知,为了从仿射重建中升级得到度量重建,我们需要得知IAC的表达。为了得到这个表达,就像在仿射重建中的一样,我们需要从场景中引入某些约束。

    从场景的正交性中得到的约束

    假设现在有一对消失点v1\mathbf{v}_1v2\mathbf{v}_2,这对消失点来自于图像中的本身应该正交的场景,比如Fig 8中的三张图,都选自房子场景中本身应该垂直的部分,我们计算出其交点即为消失点,找出其中一对消失点,因为消失点处在无限远平面上,而且度量变换不会影响正交性,因此我们有:
    v1Tωv2=0(12) \mathbf{v}^{\mathrm{T}}_1\omega\mathbf{v}_2 = 0\tag{12}
    根据此我们可以计算出IAC的表达。

    从内参数标定中得到约束

    假设我们知道了相机内参数并且假设内参数矩阵为 K\mathrm{K},我们有ω=KTK1\omega = \mathrm{K}^{-\mathrm{T}}\mathrm{K}^{-1}。我们从[6]中知道:
    K=[αxsx00αyy0001](13) \mathrm{K} = \left[\begin{matrix}\alpha_x & s & x_0 \\0 & \alpha_y & y_0 \\0 & 0 & 1\end{matrix}\right]\tag{13}
    如果有s=0s=0,那么有ω12=ω21=0\omega_{12} = \omega_{21} = 0

    如果有αx=αy\alpha_x = \alpha_y,那么有ω11=ω22\omega_{11} = \omega_{22}


    Reference

    [1]. Hartley R, Zisserman A. Multiple view geometry in computer vision[M]. Cambridge university press, 2003. Chapter 10

    [2]. https://blog.csdn.net/LoseInVain/article/details/102665911

    [3]. https://blog.csdn.net/LoseInVain/article/details/102775734

    [4]. https://blog.csdn.net/LoseInVain/article/details/104533575

    [5]. https://blog.csdn.net/LoseInVain/article/details/104515839

    [6]. https://blog.csdn.net/LoseInVain/article/details/102632940

    [7]. https://blog.csdn.net/LoseInVain/article/details/102756630

    [8]. http://www.cs.unc.edu/~marc/tutorial/node87.html

    [9]. https://blog.csdn.net/richardzjut/article/details/10473051

    [10]. https://blog.csdn.net/LoseInVain/article/details/102883243

    [11]. https://blog.csdn.net/LoseInVain/article/details/102739778

    展开全文
  • 这里特别感谢博主shiter的原创文章:OpenCV+OpenGL 双目立体视觉三维重建 本博文参考了该博主的的核心代码,并针对该博主博文中声明的一些BUG进行了修正: 本文代码下载地址(已修正相关问题问题):...

    首先我们先来看一下三维重建的效果图:

    这里特别感谢博主shiter的原创文章:OpenCV+OpenGL 双目立体视觉三维重建

    本博文参考了该博主的的核心代码,并针对该博主博文中声明的一些BUG进行了修正:

    本文代码下载地址(已修正相关问题问题):https://download.csdn.net/download/qq_15029743/10784389

    本文主要从如何配置环境方面进行介绍,后期会更新基于摄像头实际抓图的三维重建

    相机抓取的相片原图:

     

    首先是本文的运行环境:Window 7 x64+OpenCV 2.4.10+VS 2013+OpenGL(GLUT)

    首先你需要自行配置好OpenCV环境,这里就不再赘述了

    OpenCV配置方法详细可以参考博主的博文:Open_cv 2.49+Windows 7(×64)+VS2013安装教程

    不同之处在于我们采用的是2.4.10的OpenCV,导入附加依赖项如下(注意,OpenCV2.49也同样可以,只是需要将所有涉及到OpenCV 249的改成2410):

    opencv_calib3d2410.lib
    opencv_contrib2410.lib
    opencv_core2410.lib
    opencv_features2d2410.lib
    opencv_flann2410.lib
    opencv_gpu2410.lib
    opencv_highgui2410.lib
    opencv_imgproc2410.lib
    opencv_legacy2410.lib
    opencv_ml2410.lib
    opencv_nonfree2410.lib
    opencv_objdetect2410.lib
    opencv_photo2410.lib
    opencv_stitching2410.lib
    opencv_ts2410.lib
    opencv_video2410.lib
    opencv_videostab2410.lib

     如果你的计算机配置完成OpenCV后出现如下提示:

     请在系统变量下添加path路径,并重启后即可生效:

    如果提示缺少xxxx.LIB文件 ,大概率是opencv路径配置错误,请仔细检查路径并重新配置即可。

    到这里就完成了OpenCV的基本配置,接下来进行OpenGl的配置,这里我们选择的是入门级的GLUT库,这里我们进行详细的介绍,首先我们要下载GLUT库:GLUT库(注:源码包中已包含该文件,无需重复下载)

    解压库文件后,我们发现一共有五个文件,分别是:

    • glut.dll 动态链接库
    • glut.h 头文件
    • glut.lib 库文件
    • glut32.dll 动态链接库
    • glut32.lib 库文件

    Step1:我们把glut.h文件放到VS安装目录下的GL文件夹中,以博主的默认安装路径,应该放到:

    C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\GL

    注:如果没有GL文件夹请新建一个

    Step2:将得到的glut.lib和glut32.lib复制到vs2013的lib文件夹下:vs2013\VC\lib,以博主的默认安装路径,应该放到:

    C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\lib

    Step3:将glut.dll,glut32.dll复制到到操作系统目录下面的C:\Windows\SysWOW64或C:\Windows\system32文件夹内,以博主的默认安装路径,应该放到: 

    C:\Windows\SysWOW64

     好了,到这里所有的配置就完成了,点击VS运行即可实现基本功能了:

     这里,程序中提供了两种重建方法,一种是基于特征点的,一种是基于稠密的,可以在程序中进行修改

    将下面的语句修改成对应模式即可切换算法:

    Algorithm g_algo = FEATURE_PT;  //基于特征点
    Algorithm g_algo = DENSE;       //稠密

    其中稠密匹配方式速度快,但是通用性及重建效果不如基于特征点的匹配(尤其是深度变化较复杂的图片)


    2020年5月7日更新:

    转自评论区闿涤:博主您好,在学习您这篇文章的时候也发现了之前提问的显示图片失败的问题。后来看了浅墨大神的文章(您推荐的那篇)后,发现是“附加依赖项”的问题,我在将附加依赖项中带d的写在前面,不带d的卸载后面,且只在32debug里改了之后,问题就解决了。您的文章给我帮助很大,希望我犯的错误大家可以借鉴下。

    展开全文
  • 双目视觉三维调研方法总结 基于连续视差空间算法 立体匹配算法 基于连续视差空间算法 采用欧式投影误差作为离群准则函数,建立RANSAC算法 D-H方法 几何法和解析法相结合的方法 结合图像速度和视差信息,通过最小...

    双目视觉三维调研方法总结

    基于连续视差空间算法

    立体匹配算法

    基于连续视差空间算法

    采用欧式投影误差作为离群准则函数,建立RANSAC算法

    D-H方法

    几何法和解析法相结合的方法


    结合图像速度和视差信息,通过最小二乘方法对目标的相对运动状态进行了重构;将重构状态作为伪测量,引入线性化的相对运动模型,采用扩展卡尔曼滤波方法对连续多帧图像信息进行序贯处理以改善估计精度。


    目立体视觉与三维激光扫描仪相融合的近距离非合作目标相对位姿测量方法



    基于双目视觉的动态目标定位与抓取研究

    双目立体视觉是计算机视觉领域研究的热点内容,可以获取并恢复出场景中物体的三维信息,被广泛应用于机器人识别定位、工业自动化等众多领域,因此,进行双目立体视觉的研究有着重要的理论及实际意义。本文以双目立体视觉基本原理为依托,结合摄像机标定与立体匹配技术,开发应用于动态目标识别定位与抓取的双目立体视觉系统,并设计了以安川YASKAWA-MH6S六自由度工业机械臂抓取系统平台,进行目标识别定位与抓取实验,主要工作如下:双目摄像机标定中,建立摄像机成像模型,并考虑成像过程中相机畸变的影响,采用张正友两步标定法,得到双目相机的内参数、外参数和图像像素坐标系与世界坐标系转换的旋转矩阵与平移向量。针对目标识别问题,对多种局部特征点进行比较分析,并确定具有良好速度的Surf特征作为模板匹配的特征。采用基于特征的模板匹配算法对目标进行自动检测、识别,并通过实验验证目标物体发生缩放、旋转、被遮挡情形下目标识别的正确性与稳定性。针对动态目标三维位姿定位,本文提出了基于连续视差空间算法,对动态目标进行运动估计与姿态获取,对立体匹配算法进行了改进,将固定区域的特征点限制为一定数量,并采用欧式投影误差作为离群准则函数,建立RANSAC算法的数学模型,加入极线约束的立体匹配算法实现误匹配点的剔除,该算法在降低了误匹配点对算法的影响,同时缩小匹配所耗时间,并通过实验进行了验证分析。最后搭建一套双目视觉-机械臂手眼实验系统,通过D-H参数法对六自由度机械臂建模,正逆运动学分析和求解,在控制上本文采用的是主从式控制方式,通讯采用网络传输,主控机采用计算机平台,负责图像的采集,目标姿态解算,得出控制机械臂运动所需的关节角,从机采用工业机械臂控制器。主机将目标三维重建的位置信息传给抓取系统进行抓取实验,并对抓取误差进行分析,验证了该系统在工业生产实际中具有一定的应用价值。

     

    基于双目视觉的六自由度仿人手抓取目标定位研究

    摘 要: 为了使仿人手能对抓取目标物体进行识别和定位,提出一种基于双目视觉的仿人手抓取定位方法。采用改进的D-H方法对假肢手臂进行建模,采用几何法和解析法相结合的方法对六自由度假肢手臂进行逆运动学求解,并采用基于灰度相关的模板匹配算法提取出目标,最后根据双目视觉原理计算出目标位置的空间坐标,并控制假肢手臂对目标物体进行抓取。实验结果表明,假肢手臂能够有效完成对目标物体的识别和抓取动作。

     

    基于双目视觉的动态目标定位与抓取研究

     

    摘要

    双目立体视觉是计算机视觉领域研究的热点内容,可以获取并恢复出场景中物体的三维信息,被广泛应用于机器人识别定位、工业自动化等众多领域,因此,进行双目立体视觉的研究有着重要的理论及实际意义。本文以双目立体视觉基本原理为依托,结合摄像机标定与立体匹配技术,开发应用于动态目标识别定位与抓取的双目立体视觉系统,并设计了以安川YASKAWA-MH6S六自由度工业机械臂抓取系统平台,进行目标识别定位与抓取实验,主要工作如下:双目摄像机标定中,建立摄像机成像模型,并考虑成像过程中相机畸变的影响,采用张正友两步标定法,得到双目相机的内参数、外参数和图像像素坐标系与世界坐标系转换的旋转矩阵与平移向量。针对目标识别问题,对多种局部特征点进行比较分析,并确定具有良好速度的Surf特征作为模板匹配的特征。采用基于特征的模板匹配算法对目标进行自动检测、识别,并通过实验验证目标物体发生缩放、旋转、被遮挡情形下目标识别的正确性与稳定性。针对动态目标三维位姿定位,本文提出了基于连续视差空间算法,对动态目标进行运动估计与姿态获取,对立体匹配算法进行了改进,将固定区域的特征点限制为一定数量,并采用欧式投影误差作为离群准则函数,建立RANSAC算法的数学模型,加入极线约束的立体匹配算法实现误匹配点的剔除,该算法在降低了误匹配点对算法的影响,同时缩小匹配所耗时间,并通过实验进行了验证分析。最后搭建一套双目视觉-机械臂手眼实验系统,通过D-H参数法对六自由度机械臂建模,正逆运动学分析和求解,在控制上本文采用的是主从式控制方式,通讯采用网络传输,主控机采用计算机平台,负责图像的采集,目标姿态解算,得出控制机械臂运动所需的关节角,从机采用工业机械臂控制器。主机将目标三维重建的位置信息传给抓取系统进行抓取实验,并对抓取误差进行分析,验证了该系统在工业生产实际中具有一定的应用价值。

    收起

    出版源

    西南科技大学 , 2016

     

     

    浮体六自由度实时测量系统的研究

    摘要

    浮体的六个运动分量,即横摇、纵摇、回转、横移、纵移和升沉,是海洋、港口和船舶工程模型试验研究中的重要参考数据。传统的接触式测量方法是利用直尺测量位移值,使用陀螺仪测量摇角,通过光线示波仪记录信号,人工读取分析,精度低,浪费人力物力,无法满足使用要求。非接触式测量基于双目立体视觉系统,采用双CCD抓拍浮体运动图像,利用标定过程获取的CCD内外参数来三维重构、计算出目标物体的空间坐标,并由此分解其六分量。该种测量技术对浮体的运动没有任何影响,精度相对较高,通过提高分辨率和采用高精度定位算法还可以对性能进行进一步提升。 本文在实时测量的前提下研究非接触式浮体测量系统的具体应用,主要完成了一下工作:首先,本文进行了以机器视觉和图像处理为理论背景的算法研究与应用,算法部分主要包括图像预处理、二值化、特征点提取、标定、立体匹配及三维重构等一系列立体视觉方面的内容;其次,本文设计并实现相应的系统软件,系统软件部分是以VC6.0为开发平台,结合Matorx公司随METEORⅡ/Digital图像采集卡提供的MIL~(TM) Library图像采集卡软件开发包,编写了一套满足工程需要的应用软件;最后,本文在实验水槽中,利用造波机打浪,对浮体运动进行了实时测量,并且对系统的测量精度进行了验证和分析。 本文搭建了新的硬件平台,提高了分辨率,且改善了精度,不仅解决了双CCD异步触发同步抓取的功能,还达到了真正的实时处理,20f/s的速率跟踪浮体运动,并且实现了全姿态测量。同时,本文解决了工程应用条件下、实时测量过程中需要考虑的关键问题,经过不断的实验分析,论证了系统的可行性以及可靠性,精度已经达到各种科学研究和工程设计实验使用的技术指标。

     

    空间六自由度对接中机器视觉技术的研究 

    研究惯性约束核聚变的固体激光装置需要将某些大口径光学模块自下往上精密装配到光学路径中,这些模块数量大、种类多、尺寸规格和重量不一,而且安装环境复杂,因此在安装过程需要对其位姿进行调整。以美国NIF装校系统为参考,为满足安装精度的要求,一种机器视觉技术辅助的全自动位姿调整方案被考虑用于下装系统光学模块的空间对接中。该方案代替人工干涉过多的原始方案,提高了光学模块安装过程的装配效率和自动化程度。 本课题通过研究机器视觉系统硬件组成、软件流程、主要特性和工作原理,以及图像预处理的原理和算法,将被测点坐标求取简化成圆形标识点圆心的求取,探讨了适于圆形标识点除噪、二值化、边缘提取等图像预处理以及像素级和亚像素级圆形边缘定位的方法,再一次图像滤波获取圆心在世界坐标系下的精确坐标。 二维坐标通过双目机器视觉系统转化成获取三维坐标的关键在于左右摄像机摄取图像中的对应点匹配问题,双目光栅视觉系统代替人工视觉测量光学模块,具有精度高、速度快、非接触等优点,将其应用于空间对接方案中,可以有效的克服人工监视主观意识的影响。 光学模块安装空间狭小,升降过程容易造成碰撞和卡死,提出一种由平面调整并联机构和水平调整并联机构串联而成六自由度混联机构,用于调整光学模块空间位姿,该机构融合了并联机构刚度大、承载能力强、精度高以及串联机构运动学分析容易、机构灵活、工作空间大的优点。机器视觉技术获取标定物和目标点之间的位姿关系,代入驱动器位移和动平台几何中心点的位姿方程,数学模型逆解,得出工作空间求解所需机构约束不等式组和任意空间点位姿方程组。在给定机构参数下通过一组实例,运用Matlab仿真分析动平台不同位姿的工作空间,并运用空间几何法进一步验证该技术的有效性。

     基于立体视觉的非合作航天器相对状态估计

     摘要

    在轨服务和空间碎片清理等任务操作要求的提高,使得关于空间近场操作中高效、自主的相对导航方法研究成为热点问题。本文以非合作航天器自主交会相对导航为背景,采用双目立体视觉测量,利用最小二乘方法对图像信息进行重构获得相对状态,结合相对运动模型通过滤波提高估计精度,并针对目标惯量不确定情况下的相对状态估计问题进行研究。由于视觉测量只能敏感到目标航天器表面的特征,在质心相对运动模型的基础上加入相对姿态运动建立六自由度相对运动模型。考虑非合作航天器表面特征点分布的随机性,建立任意非质心点之间的相对运动模型,模型仿真结果表明,非质心点运动耦合引起的位置偏差在近场操作中的影响不能忽略。对计算机视觉中的位姿变换和成像原理进行研究,分析了空间目标的成像特点,考虑可能出现的图像模糊和降质问题,从图像降噪、复原和增强等方面对图像处理技术进行研究,并通过经典案例图片的处理验证相关算法的有效性。基于计算机视觉理论,建立双目视觉测量的几何模型,利用追踪航天器上获得的目标表面多特征点单副帧对图像,结合图像速度和视差信息,通过最小二乘方法对目标的相对运动状态进行了重构;将重构状态作为伪测量,引入线性化的相对运动模型,采用扩展卡尔曼滤波方法对连续多帧图像信息进行序贯处理以改善估计精度。仿真结果表明,与单纯利用图像信息的状态重构相比,滤波对估计精度的改善效果明显。针对相对导航过程中非合作航天器惯量不确定问题,考虑有部分目标惯量先验信息的情况下,利用对视觉图像信息的状态重构和序贯处理方法,设计了一套应用各惯量假设模型的并行扩展卡尔曼滤波方法进行相对状态估计,并通过贝叶斯极大后验估计方法比较各并行估计的累积残差信息,从而辨识出最接近真实惯量的一组假设和对应的相对状态估计。结果表明,本文设计的方法能够充分利用先验信息和测量信息,有效地改善惯量不确定情况下的相对位姿估计精度。 

     

    基于视觉的近距离非合作空天目标的相对位姿测量技术研究 

    随着人类对空间的不断探索和深入,空间飞行器交会对接、在轨服务等近场操作在空间计划和任务中扮演着越来越重要的角色。要实现空间飞行器交会对接等近场操作,相对位姿的测量是关键技术之一。 为了实现近距离非合作目标航天器的相对位姿的测量,本文研究基于双目立体视觉与三维激光扫描仪相融合的近距离非合作目标相对位姿测量方法。在100m- 20m阶段,立体视觉系统从目标图像中识别出目标航天器,并对其进行轮廓提取和跟踪,获取目标航天器的方位角信息,三维激光扫描仪测量目标航天器的相对距离信息;在20m-2m阶段,双目立体视觉系统与三维激光扫描...展开 随着人类对空间的不断探索和深入,空间飞行器交会对接、在轨服务等近场操作在空间计划和任务中扮演着越来越重要的角色。要实现空间飞行器交会对接等近场操作,相对位姿的测量是关键技术之一。    为了实现近距离非合作目标航天器的相对位姿的测量,本文研究基于双目立体视觉与三维激光扫描仪相融合的近距离非合作目标相对位姿测量方法。在100m- 20m阶段,立体视觉系统从目标图像中识别出目标航天器,并对其进行轮廓提取和跟踪,获取目标航天器的方位角信息,三维激光扫描仪测量目标航天器的相对距 离信息;在20m-2m阶段,双目立体视觉系统与三维激光扫描仪融合获取准确的深度信息,并利用几何结构确定目标航天器的相对姿态信息。   由于 空间环境和光照条件的影响,立体视觉系统采集的目标航天器图像对在不同距离不同角度存在着不同程度的图像退化,仿射变换和图像模糊是最普遍的图像退化。本 文首先将仿射不变矩和模糊不变量在数学原理上进行融合研究,以形成仿射模糊融合矩对目标航天器退化图像进行识别;其次研究仿射模糊融合矩的尺度空间不变性,验证其在不同尺度空间的稳定性;最后通过数学仿真实验和半物理仿真实验研究仿射模糊融合矩的仿射不变性和模糊不变性。实验结果表明,应用仿射模糊融合矩对目标航天器的平均识别率达到92%,远高于仿射不变矩的76%。   为了实现目标航天器表面特征点的立体深度恢复,本文研究了目标航天器的立体匹配特征提取。首先研究基于Harris算子的特征角点提取;其次由于追踪航天器通常配置宽基线立体视觉系统,视觉系统采集的目标航天器图像对可能存在 旋转、尺度和光照变化等问题,因此研究基于SIFT算子的特征点提取和匹配;最后研究基于Hough变换的特征线提取,并提出基于激光点位置的目标边界直 线判定方法,解决目标边界直线无法稳定提取的问题。   在相对位姿测量阶段,在分析立体视觉的深度恢复原理的基础上,提出基于立体视觉的相对位姿 测量算法;并对相对位姿测量进行误差分析,根据立体深度恢复的原理,提出新的立体深度和视差关系模型,极大地提高了立体深度恢复和相对位姿测量的精度。实验结果表明,模型修正后在1600mm处深度恢复的相对误差由9.2%减小到0.75%俯仰角、偏航角和滚转角与参考点相差45°时绝对误差分别降低了0.35°1.17°1.52°,基本能够满足非合作目标航天器相对位姿测量的精度要求。

     空间非合作目标的近距离相对位姿测量技术研究

      

    空间非合作目标的交会对接技术是载人航天中需要解决的重要课题。其中,非合作航天器间相对位姿的测量是解决这一问题的关键技术。本文主要针对空间非合作目标的近距离相...


    展开全文
  • 一转眼,研究生毕业已经一年了,整日忙于工作,曾经做过的双目三维重建课题快要慢慢退出记忆了。鉴于现在三维重建这么火,这里为以前学习过的知识做个记录。 下面是摄像机标定的相关知识(张正友标定),为了加深...
  • 1.修改为 VS2015 Debug win32 版本,支持利用特征点和 OpenCV 立体匹配算法进行进行三维重建及显示,相关代码需要自行修改,代码中添加了修改注释。 2.工程依赖库为 OpenCV2.4.8,内部已完成 OpenCV 相关配置。无论...
  • 双目三维重建和误差估计

    千次阅读 2018-08-18 10:09:34
    双目测距的精度和基线长度(两台相机之间的距离)有关,两台相机布放的距离越远,测距精度越高。 但问题是:往往在实际应用中,相机的布放空间是有限的,最多也只有几米或几十米的基线长度,这就导致双目测距在远...
  • 相机标定是为了求得内外参数,为三维重建做准备。后续的一般过程还有图像畸变矫正,图像校正,立体匹配和三维点计算。因为立体匹配是三维重建中最为最为重要的一环,所以这里先不介绍,后续再开个单篇。本文先讨论...
  • Evision双目视觉关于双目视觉的一些总结相机模型标定视差算法:立体匹配重投影:测量,三维重建,重投影约束三维重建示例程序 关于双目视觉的一些总结 笔者2013年进入吉林大学软件学院,2014年开始写自己的第一个完整的...
  • ,从三维点云估计场景流。 立体匹配就4个步骤:匹配代价计算,代价聚合,计算视差,视差精化。 ,描述了几个定义,意思大家都懂,就是名词解释有时候对不上。 A Large Dataset to Train Convolutional Networks ...
  • 三维重建是指根据基于一个视图或者多个视图所获得的物体或者场景的图像重建三维模型的过程。由于单视图的信息很单一,因此三维重建需要更复杂的算法和过程。相比之下,多视图的三维重建(模仿人类观察世界的方式)就...
  • 测量,三维重建 示例程序 参考文献 关于双目视觉的一些总结 笔者2013年进入吉林大学软件学院,2014年开始写自己的第一个完整的程序,期间受到过无数前辈的帮助,正是这个程序的完成给了我极大的信心,也让我喜欢上...
  • //三维坐标 string point_cloud; Point origin; //鼠标按下的起始点 Rect selection; //定义矩形选框 bool selectObject = false; //是否选择对象 int blockSize = 1, uniquenessRatio = 38, ...
  • 双目视觉三维重建

    2018-08-14 12:45:37
    一些双目三维重建的代码,有matlab和c++的,效果不错。
  • 双目快速触发投影三维重建系统,采用的是降光栅图片事先保存到投影仪当中,然后使用USB接口去控制投影仪并给相机 发生触发型号,控制相机进行采集,这样可以实现图像快速采集的目的。硬件采用的60帧的投影仪,相机...
  • 记录一下深度学习进行双目三维重建看过的网络 持续更新(时不时更新) 数据集: SceneFlow KITTI 与三维有关的数据集: TanksAndTemples 一大堆Github总结的数据集 Github大佬的笔记 -----------------------------...
  • 双目视觉三维重建框架

    万次阅读 多人点赞 2018-01-23 14:08:52
    玉米竭力用轻松具体的描述来讲述双目三维重建中的一些数学问题。希望这样的方式让大家以一个轻松的心态阅读玉米的《计算机视觉学习笔记》双目视觉数学架构系列博客。这个系列博客旨在捋顺一下已标定的双目视觉中的...
  • 双目视觉的三维重建

    2018-06-11 21:13:55
    双目视觉的三维重建 双目视觉的三维重建 双目视觉的三维重建
  • 双目相机三维重建

    2019-04-09 10:29:56
    matlab实现双目标定,畸变矫正和立体校正,再用vs实现三维重建,亲测可用。
  • 双目立体视觉三维重建

    万次阅读 多人点赞 2018-07-22 17:15:08
    双目立体视觉的整体流程包括:图像获取、双目标定、双目矫正、立体匹配、三维重建。 Stereo Vision OpenCV+OpenGL 双目立体视觉三维重建 OpenCV 双目测距(双目标定、双目校正和立体匹配) 真实场景的双目立体...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 516
精华内容 206
关键字:

双目三维重建