Skip to content

Commit

Permalink
Add normals to CaptureViaZivid sample for csharp
Browse files Browse the repository at this point in the history
  • Loading branch information
chrisasc committed Nov 9, 2021
1 parent 3f7d03a commit b48628d
Showing 1 changed file with 52 additions and 28 deletions.
80 changes: 52 additions & 28 deletions source/csharp/Camera/Basic/CaptureViaZivid/CaptureViaZivid.cs
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ static void Main()
var settings = new Zivid.NET.Settings
{
Acquisitions = { new Zivid.NET.Settings.Acquisition{ Aperture = 5.66,
ExposureTime = Duration.FromMicroseconds(8333) } },
ExposureTime = Duration.FromMicroseconds(10000) } },
Processing = { Filters = { Outlier = { Removal = { Enabled = true, Threshold = 5.0 } } } }
};

Expand Down Expand Up @@ -50,8 +50,8 @@ private static int FindNumberOfValidPoints(float[,,] pointCloud, ulong height, u
{
for (ulong j = 0; j < width; j++)
{
double x = pointCloud[i, j, 0];
if (!Double.IsNaN(x))
float x = pointCloud[i, j, 0];
if (!float.IsNaN(x))
{
numberOfValidPoints = numberOfValidPoints + 1;
}
Expand All @@ -65,28 +65,39 @@ private static HalconDotNet.HObjectModel3D ZividToHalconPointCloud(Zivid.NET.Poi
var height = pointCloud.Height;
var width = pointCloud.Width;
var pointsXYZ = pointCloud.CopyPointsXYZ();
var normalsXYZ = pointCloud.CopyNormalsXYZ();
var colorsRGBA = pointCloud.CopyColorsRGBA();

var numberOfValidPoints = FindNumberOfValidPoints(pointsXYZ, height, width);

// Initializing HTuples which are later filled with data from the Zivid point cloud.
// tupleXYZMapping is of shape [width, height, rows[], cols[]], and is used for creating xyz mapping.
// See more at: https://www.mvtec.com/doc/halcon/13/en/set_object_model_3d_attrib.html

var tupleX = new HalconDotNet.HTuple();
var tupleY = new HalconDotNet.HTuple();
var tupleZ = new HalconDotNet.HTuple();
var tupleR = new HalconDotNet.HTuple();
var tupleG = new HalconDotNet.HTuple();
var tupleB = new HalconDotNet.HTuple();
var tuplePointsX = new HalconDotNet.HTuple();
var tuplePointsY = new HalconDotNet.HTuple();
var tuplePointsZ = new HalconDotNet.HTuple();

var tupleNormalsX = new HalconDotNet.HTuple();
var tupleNormalsY = new HalconDotNet.HTuple();
var tupleNormalsZ = new HalconDotNet.HTuple();

var tupleColorsR = new HalconDotNet.HTuple();
var tupleColorsG = new HalconDotNet.HTuple();
var tupleColorsB = new HalconDotNet.HTuple();

var tupleXYZMapping = new HalconDotNet.HTuple();

tupleX[numberOfValidPoints - 1] = (float)0;
tupleY[numberOfValidPoints - 1] = (float)0;
tupleZ[numberOfValidPoints - 1] = (float)0;
tupleR[numberOfValidPoints - 1] = (byte)0;
tupleG[numberOfValidPoints - 1] = (byte)0;
tupleB[numberOfValidPoints - 1] = (byte)0;
tuplePointsX[numberOfValidPoints - 1] = (float)0;
tuplePointsY[numberOfValidPoints - 1] = (float)0;
tuplePointsZ[numberOfValidPoints - 1] = (float)0;

tupleNormalsX[numberOfValidPoints - 1] = (float)0;
tupleNormalsY[numberOfValidPoints - 1] = (float)0;
tupleNormalsZ[numberOfValidPoints - 1] = (float)0;

tupleColorsR[numberOfValidPoints - 1] = (byte)0;
tupleColorsG[numberOfValidPoints - 1] = (byte)0;
tupleColorsB[numberOfValidPoints - 1] = (byte)0;

tupleXYZMapping[2 * numberOfValidPoints + 2 - 1] = (uint)0;
tupleXYZMapping[0] = (uint)width;
Expand All @@ -97,33 +108,46 @@ private static HalconDotNet.HObjectModel3D ZividToHalconPointCloud(Zivid.NET.Poi
{
for (uint j = 0; j < width; j++)
{
double x = pointsXYZ[i, j, 0];
float x = pointsXYZ[i, j, 0];
float normal = normalsXYZ[i, j, 0];

if (!Double.IsNaN(x))
if (!float.IsNaN(x))
{
tupleX[validPointIndex] = pointsXYZ[i, j, 0];
tupleY[validPointIndex] = pointsXYZ[i, j, 1];
tupleZ[validPointIndex] = pointsXYZ[i, j, 2];
tupleR[validPointIndex] = colorsRGBA[i, j, 0];
tupleG[validPointIndex] = colorsRGBA[i, j, 1];
tupleB[validPointIndex] = colorsRGBA[i, j, 2];
tuplePointsX[validPointIndex] = pointsXYZ[i, j, 0];
tuplePointsY[validPointIndex] = pointsXYZ[i, j, 1];
tuplePointsZ[validPointIndex] = pointsXYZ[i, j, 2];
tupleColorsR[validPointIndex] = colorsRGBA[i, j, 0];
tupleColorsG[validPointIndex] = colorsRGBA[i, j, 1];
tupleColorsB[validPointIndex] = colorsRGBA[i, j, 2];
tupleXYZMapping[2 + validPointIndex] = i;
tupleXYZMapping[2 + numberOfValidPoints + validPointIndex] = j;

if (!float.IsNaN(normal))
{
tupleNormalsX[validPointIndex] = normalsXYZ[i, j, 0];
tupleNormalsY[validPointIndex] = normalsXYZ[i, j, 1];
tupleNormalsZ[validPointIndex] = normalsXYZ[i, j, 2];
}
validPointIndex++;
}
}
}

Console.WriteLine("Constructing ObjectModel3D based on XYZ data");
var objectModel3D = new HalconDotNet.HObjectModel3D(tupleX, tupleY, tupleZ);
var objectModel3D = new HalconDotNet.HObjectModel3D(tuplePointsX, tuplePointsY, tuplePointsZ);

Console.WriteLine("Mapping ObjectModel3D data");
HalconDotNet.HOperatorSet.SetObjectModel3dAttribMod(objectModel3D, "xyz_mapping", "object", tupleXYZMapping);

Console.WriteLine("Adding normals to ObjectModel3D");
var normalsAttribNames = new HalconDotNet.HTuple("point_normal_x", "point_normal_y", "point_normal_z");
var normalsAttribValues = new HalconDotNet.HTuple(tupleNormalsX, tupleNormalsY, tupleNormalsZ);
HalconDotNet.HOperatorSet.SetObjectModel3dAttribMod(objectModel3D, normalsAttribNames, "points", normalsAttribValues);

Console.WriteLine("Adding RGB to ObjectModel3D");
HalconDotNet.HOperatorSet.SetObjectModel3dAttribMod(objectModel3D, "red", "points", tupleR);
HalconDotNet.HOperatorSet.SetObjectModel3dAttribMod(objectModel3D, "green", "points", tupleG);
HalconDotNet.HOperatorSet.SetObjectModel3dAttribMod(objectModel3D, "blue", "points", tupleB);
HalconDotNet.HOperatorSet.SetObjectModel3dAttribMod(objectModel3D, "red", "points", tupleColorsR);
HalconDotNet.HOperatorSet.SetObjectModel3dAttribMod(objectModel3D, "green", "points", tupleColorsG);
HalconDotNet.HOperatorSet.SetObjectModel3dAttribMod(objectModel3D, "blue", "points", tupleColorsB);

return objectModel3D;
}
Expand Down

0 comments on commit b48628d

Please sign in to comment.