根据三维空间坐标点如何构建三维模型
1.Halcon 算子:xyz_to_object_model_3d
2.OpenCV生成XYZ图像
3.保存的XYZ图像
4.调用Halcon算子,生成三维模型并显示
1.Halcon 算子:xyz_to_object_model_3d
功能:将含有三维空间坐标的图像(数值矩阵)生成一个三维模型,输入的图像为三维空间坐标点的X、Y、Z图像
xyz_to_object_model_3d (ImageX, ImageY, ImageZ, model)
ImageX:含有物体三维空间中的X坐标信息
ImageY:含有物体三维空间中的Y坐标信息
ImageZ:含有物体三维空间中的Z坐标信息
2.OpenCV生成XYZ图像
XYZ图像:实际上是以图像的形式存储的二维矩阵
定义32位Mat类型图像,初始化为0
Mat xImg, yImg, zImg;
xImg= Mat::zeros(height, width, CV_32FC1);
yImg= Mat::zeros(height, width,CV_32FC1);
zImg= Mat::zeros(height, width, CV_32FC1);
循环遍历像素,判断二维坐标中该点位置实际对应的三维空间坐标点是否存在,若存在则取出三维空间坐标点的x、y、z值,分别赋值给 xImg, yImg, zImg
for (int i = 0; i < height; i++)
{
//注:pt为三维空间坐标点对象
float *r = xImg.ptr(i);
float *g = yImg.ptr(i);
float *b = zImg.ptr(i);
for (int j = 0; j < width; j++)
{
// 取出2D图像位置(i,j)对应的点云
float x, y, z;
float cr, cg, cb;
x = pt->x;
y = pt->y;
z = pt->z;
if (fabs(x – 0.0) < FLT_EPSILON && fabs(y – 0.0) < FLT_EPSILON && fabs(z – 0.0) < FLT_EPSILON) // 判断当前2D图像位置是否有点云
{
//情况1:当前(i,j)位置没有点云
}
else
{
//情况2:当前(i,j)位置有点云,取出点云信息
cnt++;
r[j] = x ;
g[j] = y;
b[j] = z;
}
}
}
3.保存的XYZ图像
4.调用Halcon算子,生成三维模型并显示
xyz_to_object_model_3d (Image1, Image2, Image3, model)
visualize_object_model_3d (WindowHandle, model, []