1.双目相机
双目测距获取深度 由左右相机拍摄不同角度 通过立体匹配获得空间中的点在两幅图像中的对应点,进而得到空间点的视差。
2.结构光3D相机 三角测距原理 对投射光源进行结构化与特征化编码
光点式结构光法、光条式结构光法和光面式结构光法。
3.飞行时间(Time-of-Flight,ToF)相机 通过连续向目标发送光脉冲,用传感器接收从物体返回的光,通过探测光脉冲的飞行(往返)时间来得到目标物距离
(1)基恩士线激光(点激光、面激光)
(2)上海盛相3D结构光相机
(3)天津微深VisenTOP 3D扫描仪
(4)深圳博明3D传感器 结构光相机
存储格式
(1)存储深度图 表征场景中的物体与3D相机之间的空间距离的图像,某一像素的像素值表示物体上对应点相对于3D相机(视点)的距离
(2)存储为PLY文件
(3)存储为PCD文件
(4)存储为CSV格式
(5)存储为自定义格式 .vtop .m3dm
数据格式
空间坐标(x,y,z)
颜色信息(R,G,B)
反射强度信息
表面法向量等
(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);
(1)3D测量 对待测物体进行几何测量,得到物体的3D尺寸、面积、体积等
(2)3D重建
(3)机器人抓取
(4)3D人体动作识别