use of org.ddogleg.struct.DogArray in project BoofCV by lessthanoptimal.
the class TestAssociateGreedyBruteForce2D_MT method createPoints.
public static DogArray<Point2D_F64> createPoints(int count) {
Random rand = new Random(234);
DogArray<Point2D_F64> ret = new DogArray<>(count, Point2D_F64::new);
for (int i = 0; i < count; i++) {
ret.grow().setTo(rand.nextDouble() * width, rand.nextDouble() * height);
}
return ret;
}
use of org.ddogleg.struct.DogArray in project BoofCV by lessthanoptimal.
the class PointCloudUtils_F64 method prune.
/**
* Prunes points from the point cloud if they have very few neighbors
*
* @param cloud Point cloud
* @param colors Color of each point.
* @param minNeighbors Minimum number of neighbors for it to not be pruned
* @param radius search distance for neighbors
*/
public static void prune(List<Point3D_F64> cloud, DogArray_I32 colors, int minNeighbors, double radius) {
if (minNeighbors < 0)
throw new IllegalArgumentException("minNeighbors must be >= 0");
NearestNeighbor<Point3D_F64> nn = FactoryNearestNeighbor.kdtree(new KdTreePoint3D_F64());
NearestNeighbor.Search<Point3D_F64> search = nn.createSearch();
nn.setPoints(cloud, false);
DogArray<NnData<Point3D_F64>> results = new DogArray<>(NnData::new);
// It will always find itself
minNeighbors += 1;
// distance is Euclidean squared
radius *= radius;
for (int i = cloud.size() - 1; i >= 0; i--) {
search.findNearest(cloud.get(i), radius, minNeighbors, results);
if (results.size < minNeighbors) {
cloud.remove(i);
colors.remove(i);
}
}
}
use of org.ddogleg.struct.DogArray in project BoofCV by lessthanoptimal.
the class TestRelinearlize method createInputs.
private void createInputs(int numControl) {
if (numControl == 4) {
L_full = new DMatrixRMaj(6, 10);
y = new DMatrixRMaj(6, 1);
} else {
L_full = new DMatrixRMaj(3, 6);
y = new DMatrixRMaj(3, 1);
}
// randomly select null points,
List<Point3D_F64>[] nullPts = new ArrayList[numControl];
for (int i = 0; i < numControl - 1; i++) {
nullPts[i] = GeoTestingOps.randomPoints_F64(-1, 1, -1, 1, -1, 1, numControl, rand);
}
nullPts[numControl - 1] = new ArrayList<>();
nullPts[numControl - 1].add(new Point3D_F64(1, 0, 0));
nullPts[numControl - 1].add(new Point3D_F64(0, 1, 0));
nullPts[numControl - 1].add(new Point3D_F64(0, 0, 1));
if (numControl == 4)
nullPts[numControl - 1].add(new Point3D_F64(0, 0, 0));
// using the provided beta compute the world points
// this way the constraint matrix will be consistent
DogArray<Point3D_F64> worldPts = new DogArray<>(4, Point3D_F64::new);
worldPts.grow().setTo(1, 0, 0);
worldPts.grow().setTo(0, 1, 0);
worldPts.grow().setTo(0, 0, 1);
if (numControl == 4)
worldPts.grow().setTo(0, 0, 0);
if (numControl == 4)
UtilLepetitEPnP.constraintMatrix6x10(L_full, y, worldPts, nullPts);
else
UtilLepetitEPnP.constraintMatrix3x6(L_full, y, worldPts, nullPts);
}
use of org.ddogleg.struct.DogArray in project BoofCV by lessthanoptimal.
the class TestPnPLepetitEPnP method computeBarycentricCoordinates.
@Test
void computeBarycentricCoordinates() {
List<Point3D_F64> worldPoints = GeoTestingOps.randomPoints_F64(-1, 10, -5, 20, 0.1, 0.5, 30, rand);
DogArray<Point3D_F64> worldControlPts = new DogArray<>(4, Point3D_F64::new);
PnPLepetitEPnP alg = new PnPLepetitEPnP();
alg.selectWorldControlPoints(worldPoints, worldControlPts);
DMatrixRMaj alpha = new DMatrixRMaj(1, 1);
alg.computeBarycentricCoordinates(worldControlPts, alpha, worldPoints);
// make sure it sums up to one and it should add up to the original point
for (int i = 0; i < worldPoints.size(); i++) {
double x = 0, y = 0, z = 0;
double sum = 0;
for (int j = 0; j < 4; j++) {
Point3D_F64 cj = worldControlPts.get(j);
double a = alpha.get(i, j);
sum += a;
x += a * cj.x;
y += a * cj.y;
z += a * cj.z;
}
Point3D_F64 p = worldPoints.get(i);
assertEquals(1, sum, 1e-8);
assertEquals(p.x, x, 1e-8);
assertEquals(p.y, y, 1e-8);
assertEquals(p.z, z, 1e-8);
}
}
use of org.ddogleg.struct.DogArray in project BoofCV by lessthanoptimal.
the class ExampleAssociateThreeView method main.
public static void main(String[] args) {
String name = "rock_leaves_";
GrayU8 gray01 = UtilImageIO.loadImage(UtilIO.pathExample("triple/" + name + "01.jpg"), GrayU8.class);
GrayU8 gray02 = UtilImageIO.loadImage(UtilIO.pathExample("triple/" + name + "02.jpg"), GrayU8.class);
GrayU8 gray03 = UtilImageIO.loadImage(UtilIO.pathExample("triple/" + name + "03.jpg"), GrayU8.class);
// Using SURF features. Robust and fairly fast to compute
DetectDescribePoint<GrayU8, TupleDesc_F64> detDesc = FactoryDetectDescribe.surfStable(new ConfigFastHessian(0, 4, 1000, 1, 9, 4, 2), null, null, GrayU8.class);
ExampleAssociateThreeView example = new ExampleAssociateThreeView();
example.initialize(detDesc);
// Compute and describe features inside the image
example.detectFeatures(gray01, 0);
example.detectFeatures(gray02, 1);
example.detectFeatures(gray03, 2);
System.out.println("features01.size = " + example.features01.size);
System.out.println("features02.size = " + example.features02.size);
System.out.println("features03.size = " + example.features03.size);
// Find features for an association ring across all the views. This removes most false positives.
DogArray<AssociatedTripleIndex> associatedIdx = example.threeViewPairwiseAssociate();
// Convert the matched indexes into AssociatedTriple which contain the actual pixel coordinates
var associated = new DogArray<>(AssociatedTriple::new);
associatedIdx.forEach(p -> associated.grow().setTo(example.locations01.get(p.a), example.locations02.get(p.b), example.locations03.get(p.c)));
System.out.println("Total Matched Triples = " + associated.size);
// Show remaining associations from RANSAC
var triplePanel = new AssociatedTriplePanel();
triplePanel.setImages(UtilImageIO.loadImageNotNull(UtilIO.pathExample("triple/" + name + "01.jpg")), UtilImageIO.loadImageNotNull(UtilIO.pathExample("triple/" + name + "02.jpg")), UtilImageIO.loadImageNotNull(UtilIO.pathExample("triple/" + name + "03.jpg")));
triplePanel.setAssociation(associated.toList());
ShowImages.showWindow(triplePanel, "Associations", true);
}
Aggregations