线结构光三维重建(二)相机标定、光平面标定

这篇具有很好参考价值的文章主要介绍了线结构光三维重建(二)相机标定、光平面标定。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线结构光三维重建(一)https://blog.csdn.net/beyond951/article/details/125771158        

        上文主要对线激光的三角测量原理、光平面的标定方法和激光条纹提取的方法进行了一个简单的介绍,本文则主要针对线激光三维重建系统的系统参数标定进行阐述,同时对采集到的图片进行标定。本文主要涉及到的几个重难点:相机标定、激光条纹提取、光平面的标定和坐标系变换的理解。

相机标定

        本博客有多篇文章详细阐述了相机标定的理论推导过程,可详细参考下面链接文章的推导和实现。

北邮鲁鹏老师三维重建课程之相机标定https://blog.csdn.net/beyond951/article/details/122201757?spm=1001.2014.3001.5501相机标定-机器视觉基础(理论推导、Halcon和OpenCV相机标定)https://blog.csdn.net/beyond951/article/details/126435661?spm=1001.2014.3001.5502        

        最后标定的结果如下,标定过程中寻找棋盘格角点的检测图、标定的相机内参、经过内参矫正的图片和对应标定板生成的外参

线结构光三维重建(二)相机标定、光平面标定线结构光三维重建(二)相机标定、光平面标定

线结构光三维重建(二)相机标定、光平面标定 线结构光三维重建(二)相机标定、光平面标定

线结构光三维重建(二)相机标定、光平面标定

激光条纹提取

        本文采用激光条纹提取方式有灰度重心法和Steger算法,对激光条纹的中心点进行提取。

灰度重心法

vector<Point2f> GetLinePointsGrayWeight(Mat& src, int gray_Thed, int Min, int Max, int Type)
{
	vector<Point2f> points_vec;
	if (Type == 0)
	{
		Min = Min < 0 ? 0 : Min;
		Max = Max > src.rows ? src.rows : Max;
		for (int i = 0; i < src.cols; i++)
		{
			float X0 = 0, Y0 = 0;
			for (int j = Min; j < Max; j++)
			{
				if (src.at<ushort>(j, i) > gray_Thed)
				{
					X0 += src.at<ushort>(j, i) * j;
					Y0 += src.at<ushort>(j, i);
				}
			}
			if (Y0 != 0)
			{
				//Point p = Point(i, X0 / Y0);
				points_vec.push_back(Point2f(i, X0 / (float)Y0));
			}
			else
			{
				//points_vec.push_back(Point2f(i, -1));
			}
		}
	}
	else
	{
		Min = Min < 0 ? 0 : Min;
		Max = Max > src.cols ? src.cols : Max;
		for (int i = 0; i < src.rows; i++)
		{
			int X0 = 0, Y0 = 0;
			for (int j = Min; j < Max; j++)
			{
				if (src.at<Vec3b>(i, j)[0] > gray_Thed)
				{
					X0 += src.at<Vec3b>(i, j)[0] * j;
					Y0 += src.at<Vec3b>(i, j)[0];
				}
			}
			if (Y0 != 0)
			{
				points_vec.push_back(Point2f(X0 / (float)Y0, i));
			}
			else
			{
				points_vec.push_back(Point2f(-1, i));
			}
		}
	}
	return points_vec;
}

Steger算法

vector<Point2f> GetLinePoints_Steger(Mat& src, int gray_Thed, int Min, int Max, int Type)
{
	Mat srcGray, srcGray1;
	cvtColor(src, srcGray1, CV_BGR2GRAY);

	//高斯滤波
	srcGray = srcGray1.clone();
	srcGray.convertTo(srcGray, CV_32FC1);
	GaussianBlur(srcGray, srcGray, Size(0, 0), 6, 6);


	//一阶偏导数
	Mat m1, m2;
	m1 = (Mat_<float>(1, 2) << 1, -1);//x方向的偏导数
	m2 = (Mat_<float>(2, 1) << 1, -1);//y方向的偏导数
	Mat dx, dy;
	filter2D(srcGray, dx, CV_32FC1, m1);
	filter2D(srcGray, dy, CV_32FC1, m2);
	//二阶偏导数
	Mat m3, m4, m5;
	m3 = (Mat_<float>(1, 3) << 1, -2, 1);   //二阶x偏导
	m4 = (Mat_<float>(3, 1) << 1, -2, 1);   //二阶y偏导
	m5 = (Mat_<float>(2, 2) << 1, -1, -1, 1);   //二阶xy偏导
	Mat dxx, dyy, dxy;
	filter2D(srcGray, dxx, CV_32FC1, m3);
	filter2D(srcGray, dyy, CV_32FC1, m4);
	filter2D(srcGray, dxy, CV_32FC1, m5);
	//hessian矩阵
	double maxD = -1;
	vector<double> Pt;
	vector<Point2f> points_vec;
	if (Type == 0)
	{
		Min = Min < 0 ? 0 : Min;
		Max = Max > src.rows ? src.rows : Max;
		for (int i = 0; i < src.cols; i++)
		{
			for (int j = Min; j < Max; j++)
			{
				if (srcGray.at<uchar>(j, i) > gray_Thed)
				{
					Mat hessian(2, 2, CV_32FC1);
					hessian.at<float>(0, 0) = dxx.at<float>(j, i);
					hessian.at<float>(0, 1) = dxy.at<float>(j, i);
					hessian.at<float>(1, 0) = dxy.at<float>(j, i);
					hessian.at<float>(1, 1) = dyy.at<float>(j, i);

					Mat eValue;
					Mat eVectors;
					eigen(hessian, eValue, eVectors);

					double nx, ny;
					double fmaxD = 0;
					if (fabs(eValue.at<float>(0, 0)) >= fabs(eValue.at<float>(1, 0)))  //求特征值最大时对应的特征向量
					{
						nx = eVectors.at<float>(0, 0);
						ny = eVectors.at<float>(0, 1);
						fmaxD = eValue.at<float>(0, 0);
					}
					else
					{
						nx = eVectors.at<float>(1, 0);
						ny = eVectors.at<float>(1, 1);
						fmaxD = eValue.at<float>(1, 0);
					}

					double t = -(nx*dx.at<float>(j, i) + ny*dy.at<float>(j, i)) / (nx*nx*dxx.at<float>(j, i) + 2 * nx*ny*dxy.at<float>(j, i) + ny*ny*dyy.at<float>(j, i));

					if (fabs(t*nx) <= 0.5 && fabs(t*ny) <= 0.5)
					{
						Pt.push_back(i);
						Pt.push_back(j);
					}
				}

			}
		}
	}
	else
	{
		Min = Min < 0 ? 0 : Min;
		Max = Max > src.cols ? src.cols : Max;
		for (int i = Min; i<Max; i++)
		{
			for (int j = 0; j<src.rows; j++)
			{
				if (srcGray.at<uchar>(j, i) > gray_Thed)
				{
					Mat hessian(2, 2, CV_32FC1);
					hessian.at<float>(0, 0) = dxx.at<float>(j, i);
					hessian.at<float>(0, 1) = dxy.at<float>(j, i);
					hessian.at<float>(1, 0) = dxy.at<float>(j, i);
					hessian.at<float>(1, 1) = dyy.at<float>(j, i);

					Mat eValue;
					Mat eVectors;
					eigen(hessian, eValue, eVectors);

					double nx, ny;
					double fmaxD = 0;
					if (fabs(eValue.at<float>(0, 0)) >= fabs(eValue.at<float>(1, 0)))  //求特征值最大时对应的特征向量
					{
						nx = eVectors.at<float>(0, 0);
						ny = eVectors.at<float>(0, 1);
						fmaxD = eValue.at<float>(0, 0);
					}
					else
					{
						nx = eVectors.at<float>(1, 0);
						ny = eVectors.at<float>(1, 1);
						fmaxD = eValue.at<float>(1, 0);
					}

					double t = -(nx*dx.at<float>(j, i) + ny*dy.at<float>(j, i)) / (nx*nx*dxx.at<float>(j, i) + 2 * nx*ny*dxy.at<float>(j, i) + ny*ny*dyy.at<float>(j, i));
					if (fabs(t*nx) <= 0.5 && fabs(t*ny) <= 0.5)
					{
						Pt.push_back(i);
						Pt.push_back(j);
					}
				}
			}
		}
	}
	for (int k = 0; k<Pt.size() / 2; k++)
	{
		points_vec[k].x = Pt[2 * k + 0];
		points_vec[k].y = Pt[2 * k + 1];
	}
	return points_vec;
}

steger参考的网上算法需要调试几个参数。灰度重心法的提取图像如下图所示:

空间中两条直线可以确定一个平面,这里用了四副标板图以及上面的激光轮廓。可将其中一块标板的参考坐标系作为世界坐标系,这里将第一块标板的坐标系当做世界坐标系。另外三幅标板的作用在于将激光条纹提取的轮廓点根据相应的标板外参转到相机坐标系下,再由相机坐标和标板1的外参可将所有的轮廓点坐标转到以标板1为参考系的世界坐标。

上面这段话是理解整个标定、重构过程的精髓,理解了这段话,整个系统的理解就很简单。

线结构光三维重建(二)相机标定、光平面标定

 标板投射的激光图,为避免棋盘格的影响,将整个图像的亮度调低。

线结构光三维重建(二)相机标定、光平面标定

 提取出来的激光轮廓图,为绿颜色的线条

线结构光三维重建(二)相机标定、光平面标定

 光平面标定

首先加载各副标板图对应的外参,并保存下来;

读取激光条纹图,先根据相机标定的内参结果对激光轮廓图进行矫正;

矫正完后,基于灰度重心法对激光条纹轮廓进行提取,将提取的点存在vector;

将各副对应标板图的平面零点和法向量,(一个平面可由平面上的一点和法向量表示),根据其对应的标板外参转换到相机坐标系下,即转换后的标板平面为相机坐标系下的平面;

将提取的点由图像坐标系转为相机坐标系下,将该点和相机光心(相机坐标系的原点)连线,可得到一条空间直线;

求解空间直线和平面的交点即为光平面上的点。

看完理清上面这一段话,再看博文一更好理解。

线结构光三维重建(一)https://blog.csdn.net/beyond951/article/details/125771158?spm=1001.2014.3001.5502

//相机标定完,保存下来各副标板图的外参
//读取外参矩阵
for (int i = 0; i < ImgSource_Vec.size(); i++)
{
	Mat rotation_matrix, translation_vectors;
	File_Help.Load_RT_Params(".\\image\\source\\" + ImgSource_Vec[i] + ".xml", rotation_matrix, translation_vectors);
	R_Vec.push_back(rotation_matrix);
	T_Vec.push_back(translation_vectors);
}
for (int i = 0; i < ImgSource_Vec.size(); i++)
{
	//先根据标定的内参矫正图像
	Mat line_src = imread(Line_path + ImgSource_Vec[i] + ".bmp");
	line_src = Api.Correct_Img(line_src, intrin_matrix, distort_coeffs);
	//灰度重心法提取激光条纹轮廓点
	vector<Point2f> Line_Points_Vec = Api.GetLinePoints_GrayWeight(line_src, 190, 1600, 2000, 1);
	//相机坐标系下标板的零点
	//相机坐标系下平面法向量
	//将世界坐标系下标板的零点和平面法向量转换到对应的相机坐标系下
	Mat Word_Zreo = (Mat_<double>(3, 1) << 0, 0, 0);
	Mat cam_Zero = R_Vec[i] * Word_Zreo + T_Vec[i];             
	Mat Plane_N = (Mat_<double>(3, 1) << 0, 0, 1);
	Mat cam_Plane_N = R_Vec[i] * Plane_N + T_Vec[i];             
	for each (Point2f L_Point in Line_Points_Vec)
	{
		//计算激光条纹点在成像面投影点
		Mat Cam_XYZ = (Mat_<double>(3, 1) << (L_Point.x - u)* 0.0024, (L_Point.y - v)*0.0024, f);
		//计算相机光心和激光条纹点在成像面投影点的连线和标板平面的交点
		Point3f point_Cam = Api.CalPlaneLineIntersectPoint(Vec3d(cam_Plane_N.at<double>(0, 0) - cam_Zero.at<double>(0, 0), cam_Plane_N.at<double>(1, 0) - cam_Zero.at<double>(1, 0), cam_Plane_N.at<double>(2, 0) - cam_Zero.at<double>(2, 0)), Point3f(cam_Zero.at<double>(0, 0), cam_Zero.at<double>(1, 0), cam_Zero.at<double>(2, 0)), Vec3f(Cam_XYZ.at<double>(0, 0), Cam_XYZ.at<double>(1, 0), Cam_XYZ.at<double>(2, 0)), Point3f(0, 0, 0));
		//将求得点进行保存
		Plane_Points_Vec.push_back(point_Cam);
	}
}
//保存点云
ofstream fout(".\\image\\word_cor_points.txt");
for each(Point3f point in Plane_Points_Vec)
{
	fout << point.x << " " << point.y << " " << point.z << endl;
}
//根据上面得到点拟合光平面
float PlaneLight[4];                            
Api.Fit_Plane(Plane_Points_Vec, PlaneLight);
//平面误差
float ems = Api.Get_Plane_Dist(Plane_Points_Vec, PlaneLight);
Mat Plane_V = (Mat_<double>(4, 1) << PlaneLight[0], PlaneLight[1], PlaneLight[2], PlaneLight[3]);

交比不变性标定

首先加载标板图对应的外参参数;

读取对应的标板图像,进行角点检测,将角点按行存储,并拟合直线(蓝线);

读取对应的激光条纹投射的标板图,提取激光轮廓点,并进行直线拟合(黄线),求拟合直线和棋盘格行直线的交点(红点);

求得的交点图像坐标已知,根据交比不变性,图像坐标系下的交并复比和标板坐标系下的交并复比相等,求得交点在标板上的坐标;

将求得交点在标板上的坐标根据标板对应的外参转到相机坐标系下;

将多副激光标板求得点进行平面拟合得到其在相机坐标系下的光平面。

线结构光三维重建(二)相机标定、光平面标定

//读取外参矩阵
	for (int i = 0; i < ImgSource_Vec.size(); i++)
	{
		Mat rotation_matrix, translation_vectors;
		File_Help.Load_RT_Params(".\\image\\source\\" + ImgSource_Vec[i] + ".xml", rotation_matrix, translation_vectors);
		R_Vec.push_back(rotation_matrix);
		T_Vec.push_back(translation_vectors);
	}

	for (int i = 0; i < ImgSource_Vec.size(); i++)
	{
		//读取标板图像
		Mat src = imread(Chess_path + ImgSource_Vec[i] + ".bmp");
		//根据标定的相机内参先对图像进行校正
		Mat Correct = Api.Correct_Img(src, intrin_matrix, distort_coeffs);
		//提取标板图像上面棋盘格的角点
		vector<Point2f> corners = Api.Get_Conners(Correct, Conner_Size, ".\\image\\line_Image\\" + ImgSource_Vec[i], 0);
		//标板角点按行进行直线拟合
		vector<vector<Point2f>> Lines_Points;
		Mat LineImg = src.clone();
		vector<Vec4f> Chess_Lines; 
		//按行存储
		for (int j = 0; j < Conner_Size.width; j++)
		{
			vector<Point2f> line_points;
			for (int k = 0; k < Conner_Size.height; k++)
			{
				line_points.push_back(corners[j + k*Conner_Size.width]);
				circle(LineImg, corners[j + k*Conner_Size.width], 2, Scalar(0, 0, 255), 2, 8, 0);
			}
			Lines_Points.push_back(line_points);
		}
		//直线拟合	
		for each (vector<Point2f> points in Lines_Points)
		{
			Vec4f corner_line_fit_temp;
			fitLine(points, corner_line_fit_temp, CV_DIST_L2, 0, 0.01, 0.01);
			//直线拟合
			Chess_Lines.push_back(corner_line_fit_temp);
			Mat Temp;
			Api.CVT_Gray2RGB(src, Temp);
			//图片转换
			CvPoint2D32f startpt;
			CvPoint2D32f endpt;
			//直线起点&终点
			Api.getFitLineStartEndPt(Temp, corner_line_fit_temp, startpt, endpt);     
			line(LineImg, startpt, endpt, Scalar(0, 255, 0), 1);
		}
		//首先灰度重心法对激光条纹进行轮廓点进行提取
		//根据提取到的轮廓点进行直线拟合
		Vec4f lightline_fitline;
		//读取标板图对应的激光标板图
		Mat line_src = imread(Line_path + ImgSource_Vec[i] + ".bmp");
		//校正图像
		line_src = Api.Correct_Img(line_src, intrin_matrix, distort_coeffs);
		//灰度重心法提取激光轮廓中心点
		vector<Point2f> Line_Points_Vec = Api.GetLinePoints_GrayWeight(line_src, 254, 1700, 2300, 1);
		//直线拟合
		fitLine(Line_Points_Vec, lightline_fitline, CV_DIST_L12, 0, 0.01, 0.01);        
		Mat Temp;
		//图片转换
		Api.CVT_Gray2RGB(line_src, Temp);                                             
		CvPoint2D32f startpt;
		CvPoint2D32f endpt;
		//直线起点&终点
		Api.getFitLineStartEndPt(Temp, lightline_fitline, startpt, endpt);     
		line(line_src, startpt, endpt, Scalar(0, 255, 0), 1);
		//保存灰度重心法提取光条直线的图片
		imwrite(Line_path + ImgSource_Vec[i] + "_FitLine.bmp", line_src); 
		//棋盘格角点每一行拟合的直线和激光条纹拟合直线的交点
		vector<Point2f> cross_vec;        
		for each (Vec4f line in Chess_Lines)
		{
			/*求交点并画点保存,result.jpg存储在工程目录下*/
			Point2f crossPoint;
			crossPoint = Api.getCrossPoint(line, lightline_fitline);
			cross_vec.push_back(crossPoint);
			circle(LineImg, crossPoint, 3, Scalar(255, 0, 0), 2, 8, 0);
		}
		line(LineImg, startpt, endpt, Scalar(0, 255, 0), 1);
		imwrite(".\\image\\line_Image\\" + ImgSource_Vec[i] + "_Final.bmp", LineImg);
		//激光线标板坐标系坐标提取(交比不变性)
		//根据标板坐标系和图像坐标系的交并复比不变性
		//求取交点在靶标坐标系上的点坐标
		vector<Point3f> Cor_Points;   //标板坐标系激光点
		vector<Point3f> Cam_Points;   //相机坐标系激光点
		for (int m = 0; m < Lines_Points.size(); m++)
		{
			vector<Point2f> Chess_points = Lines_Points[m];   //图像坐标系:标板直线角点
			//图像坐标系的交并复比
			double AC = Api.Point2Point_Dist(Chess_points[10], Chess_points[5]);
			double AD = Api.Point2Point_Dist(Chess_points[10], Chess_points[0]);
			double BC = Api.Point2Point_Dist(cross_vec[m], Chess_points[5]);
			double BD = Api.Point2Point_Dist(cross_vec[m], Chess_points[0]);
			double SR = (AC / BC) / (AD / BD);
			//标板坐标系的交并复比
			//棋盘格一格距离代表2mm
			double ac = (10 - 5) * 2;
			double ad = (10 - 0) * 2;
			double X1 = (ad*SR * 2 * 5 - ac * 2 * 0) / (ad*SR - ac);
			AC = Api.Point2Point_Dist(Chess_points[10], Chess_points[5]);
			AD = Api.Point2Point_Dist(Chess_points[10], Chess_points[4]);
			BC = Api.Point2Point_Dist(cross_vec[m], Chess_points[5]);
			BD = Api.Point2Point_Dist(cross_vec[m], Chess_points[4]);
			SR = (AC / BC) / (AD / BD);
			ac = (10 - 5) * 2;
			ad = (10 - 4) * 2;
			double X2 = (ad*SR * 2 * 5 - ac * 2 * 4) / (ad*SR - ac);
			float x = (X1 + X2) / 2.0f;
			Point3f Point = Point3f(x, m * 2, 0);
			Cor_Points.push_back(Point);
			//将标板上的交点坐标根据标板对应的外参转到相机坐标系
			Mat cam_Point = (Mat_<double>(3, 1) << x, m * 2, 0);
			Mat Trans_Mat = (Mat_<double>(3, 1) << 0, 0, 0);
			Trans_Mat = R_Vec[i] * cam_Point + T_Vec[i];
			Point3f Trans_Point = Point3f(Trans_Mat.at<double>(0, 0), Trans_Mat.at<double>(1, 0), Trans_Mat.at<double>(2, 0));
			Plane_Points_Vec.push_back(Trans_Point);
		}
	}
	//根据点进行平面拟合
	float PlaneLight[4];                             
	Api.Fit_Plane(Plane_Points_Vec, PlaneLight);
	//平面拟合的误差
	float ems = Api.Get_Plane_Dist(Plane_Points_Vec, PlaneLight);

最后得到的光平面如下

线结构光三维重建(二)相机标定、光平面标定文章来源地址https://www.toymoban.com/news/detail-492234.html

到了这里,关于线结构光三维重建(二)相机标定、光平面标定的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于OpenCV的单目相机标定与三维定位

           相机是产生图像数据的硬件,广泛应用于消费电子、汽车、安防等领域。围绕着相机衍生出一系列的研究与应用领域,包括传统的图像处理和基于深度学习的智能应用等。目前大火的自动驾驶中相机也是重要的硬件组成,如环视用鱼眼相机,adas用周视相机。    

    2024年02月09日
    浏览(37)
  • 计算机视觉中的三维重建:基于激光雷达与相机的方法

    作者:禅与计算机程序设计艺术 近年来,随着激光雷达、相机等传感器的广泛应用,三维重建技术逐渐成为热门研究方向。三维重建技术可以从多种角度帮助我们理解世界,并进行精准定位、建筑物三维模型化、环境规划、自然现象研究以及各种各样的应用。 但由于三维重

    2024年03月22日
    浏览(52)
  • 三维重建之条纹投影结构光(一)

            该系列为条纹投影结构光学习笔记,一共分为四篇。 第一篇记录文献阅读的笔记,对重要知识点进行摘录介绍;第二篇为相位求解和相位展开;第三篇为相高模型的标定;第四篇为重构篇。         本篇以理论知识为主,主要从以下三个方面进行介绍,首先介

    2024年02月02日
    浏览(47)
  • 三维重建之条纹投影结构光(二)——四步相移+三频外差法

            接上文:         针对上文思路进行验证,本篇博客主要对相位进行求解,首先,对上面博客的理论进行复述,然后包括相位主值的计算和相位展开。          通过一帧变形条纹 图样是很难得到高精度的相位Φ(x,y),需要采用相移算法来准确测定相位。

    2024年02月08日
    浏览(102)
  • 结构光三维重建(四步相移&多频外差法)matlab实现(一)

    前言:这里主要梳理自己在理解四步相移法和三频外差法,以及用MATLAB实现条纹图生成,四步相移求相位主值,三频外差相位展开(解包裹)的过程。 废话不多说,一些基本思想概念可以看下面参考文章,里面有详细介绍。这里主要对遇到的问题展开阐述。 由于用周期性变

    2024年02月16日
    浏览(43)
  • 从0到1搭建一套属于你自己的高精度实时结构光3D相机(8):结构光系统模型与逆相机法投影仪标定

    在前面的博客中,介绍了采用同心双圆环靶标下的相机标定算法与代码实践。在这篇博客中,博主将介绍 结构光相机模型与逆相机法投影仪标定 。完成本篇博客的学习内容后,你将收获投影仪逆相机法标定和结构光相机模型算法与代码实践经验。 本系列博客的完整项目代码

    2024年04月15日
    浏览(57)
  • (四)激光线扫描-光平面标定

    在上一章节,已经实现了对激光线条的中心线提取,并且在最开始已经实现了对相机的标定,那么相机标定的作用是什么呢? 就是将图像二维点和空间三维点之间进行互相转换。 激光发射器投射出一条线,形成的一个扇形区域平面就是 光平面 ,也叫 光刀面 ,与物体相交就

    2024年02月03日
    浏览(34)
  • 【三维重建】三维重构基础知识、三维数据、重建流程

    1.使用几何建模软件,通过人机交互生成人为控制下的三维:3DMAX、Maya、AutoCAD、UG 2.获取真实的物体形状:三维重构 三维图像重构: 摄像机获取图像,对图像分析处理,结合CV知识推导出现实中物体的三维信息 从二维图像到三维空间的重构(模仿生物两只眼睛观察物体产生的

    2024年02月02日
    浏览(56)
  • 【探讨】融合 3D 对极平面图像的光场角度超分辨重建

    摘要: 针对光场成像中因硬件限制而造成的光场图像角度分辨率低的问题,提出一种融合3D对极平面图像的光场角度超分辨重建方法。该方法首先将输入图像按不同的视差方向排列分别进行特征提取,以充分利用输入图像的视差信息,提高深度估计的准确性。利用深度图将输

    2024年04月27日
    浏览(38)
  • 基于MVS的三维重建算法学习笔记(一)— MVS三维重建概述与OpenMVS开源框架配置

    本人书写本系列博客目的是为了记录我学习三维重建领域相关知识的过程和心得,不涉及任何商业意图,欢迎互相交流,批评指正。 MVS(多视点立体视觉,Multi-view stereo)能够单独从图像中构造出高度细节化的3D模型,采集一个庞大的图像数据集,用其来构建出一个用来解析

    2024年01月15日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包