3D相关知识介绍

3D相关知识介绍

1. 3D相机的分类

1.双目相机

双目测距获取深度 由左右相机拍摄不同角度 通过立体匹配获得空间中的点在两幅图像中的对应点,进而得到空间点的视差。

2.结构光3D相机 三角测距原理 对投射光源进行结构化与特征化编码

光点式结构光法、光条式结构光法和光面式结构光法。

3.飞行时间(Time-of-Flight,ToF)相机 通过连续向目标发送光脉冲,用传感器接收从物体返回的光,通过探测光脉冲的飞行(往返)时间来得到目标物距离

4.三种3D相机的对比
3D相关知识介绍_第1张图片

2. 常见的3D相机品牌

(1)基恩士线激光(点激光、面激光)
(2)上海盛相3D结构光相机
(3)天津微深VisenTOP 3D扫描仪
(4)深圳博明3D传感器 结构光相机

3. 3D数据的存储及数据格式

存储格式
(1)存储深度图 表征场景中的物体与3D相机之间的空间距离的图像,某一像素的像素值表示物体上对应点相对于3D相机(视点)的距离
(2)存储为PLY文件
(3)存储为PCD文件
(4)存储为CSV格式
(5)存储为自定义格式 .vtop .m3dm

数据表示方式
3D相关知识介绍_第2张图片

数据格式

空间坐标(x,y,z)
颜色信息(R,G,B)
反射强度信息
表面法向量等

4. 3D数据的显示

(1)OpenCV 扩展模块Viz模块

void showDepthImage()
{
	//加载深度图
	string filename = "D:\\21_height.tif";
	Mat depth = imread(filename, IMREAD_UNCHANGED);
	Mat point_cloud = Mat::zeros(depth.rows, depth.cols, CV_32FC3);
	ushort zValue = 0;
	for (int row = 0; row < depth.rows; row++)
	{
		ushort* data = depth.ptr(row);
		for (int col = 0; col < depth.cols; col++)
		{
			zValue = data[col];
			if (zValue != 0)
			{
				zValue = (zValue - 32768);
			}
			point_cloud.at(row, col)[0] = col;
			point_cloud.at(row, col)[1] = row;
			point_cloud.at(row, col)[2] = zValue*0.1;
		}
	}


	//初始化
	viz::Viz3d window("window");
	//显示坐标系
	window.showWidget("Coordinate", viz::WCoordinateSystem());
	viz::WCloud cloud(point_cloud);
	window.showWidget("cloud", cloud);
	while (!window.wasStopped())
	{
		window.spinOnce(1, false);
	}
}

(2)PCL 点云数据显示
a.读取PCD文件直接显示

{
   if (pcl::io::loadPCDFile("4.pcd", *cloud) == -1) //* load the file
   {
       PCL_ERROR("Couldn't read file 焊点.pcd \n");
       return (-1);
   }
  pcl::visualization::CloudViewer viewer("Cloud Viewer");
   viewer.showCloud(cloud);

  viewer.runOnVisualizationThread(viewerPsycho);
   while(!viewer.wasStopped())
   {
       user_data++;
   }
}

   
void viewerPsycho(pcl::visualization::PCLVisualizer& viewer)
{
   static unsigned count = 0;;
   stringstream ss;
   ss << "once per viewer loop:" << count++;
   viewer.removeShape("text", 0);
   viewer.addText(ss.str(), 200,300,"text",0);
   user_data++;
}

b.读取PLY文件直接显示

    pcl::PointCloud::Ptr cloud(new pcl::PointCloud);
    reader.read(filename, *cloud);
    pcl::visualization::CloudViewer viewer("Cloud Viewer");
    viewer.showCloud(cloud);
    
    viewer.runOnVisualizationThread(viewerPsycho);
    while (!viewer.wasStopped())
    {
      user_data++;
    }

(3)Halcon 3D显示
a.根据深度图合成三维模型

dev_get_window(WindowHandle)
dev_set_draw('margin')
dev_open_file_dialog('read_image', 'default', 'default', Selection)
read_image(Image,Selection)
get_image_size (Image, Width, Height)
gen_image_surface_first_order (X, 'real', 1, 0, 0, 0, 0, Width, Height)
gen_image_surface_first_order (Y, 'real', 0, 1, 0, 0, 0, Width, Height)
convert_image_type (Image, ImageConverted, 'real')
compose3 (X, Y, ImageConverted, MultiChannelImage)
xyz_to_object_model_3d (X, Y, ImageConverted, ObjectModel3D1)
visualize_object_model_3d (WindowHandle, ObjectModel3D1, [], [], [], [], [], [], [], PoseOut)

b.读取PLY文件直接显示

read_object_model_3d ('bunny.ply', 'mm', [], [], ObjectModel3D, Status)
visualize_object_model_3d (WindowHandle, ObjectModel3D, [], [], [], [], [], [], [], PoseOut)

(4)深度图转伪彩色显示

	string filename = "D:\\21_height.tif";
	Mat depth = imread(filename, IMREAD_UNCHANGED);
	int row = depth.rows;
	int col = depth.cols;
	Mat dst = Mat::zeros(row, col, CV_16UC3);//先生成空的目标图片
	normalize(depth, dst, 255, 0, NORM_MINMAX);

	Mat result = dst;
	result.convertTo(dst, CV_8UC3);
	//imshow("Depth", dst);

	Mat mapImage;
	applyColorMap(dst, mapImage, COLORMAP_JET);
	//imwrite("D:\\21_heightColor2.tif", mapImage);
	namedWindow("MAP", WINDOW_AUTOSIZE);
	imshow("MAP", mapImage);
	waitKey(0);

5. 3D应用方向

(1)3D测量 对待测物体进行几何测量,得到物体的3D尺寸、面积、体积等
(2)3D重建
(3)机器人抓取
(4)3D人体动作识别

你可能感兴趣的:(3D,计算机视觉,PCL,OpenCV,Viz)