Beispiel #1
0
// A recursive function that accepts an array of integers
// and length and returns the highest common divisor of them.
int hcd(int *vals, int length) {
	if (length==2) {
		// HCD of two numbers using euclid's algorithm.
		int m,n;
		m = vals[0];
		n = vals[1];
		while (m > 0) {
			int temp = m;
			m = n % m;
			n = temp;
		}
		return n;
	}
	else if (length > 2) {
		// using identity that hcd(a,b,c,..) = hcd(a,hcd(b,c,..))
		int vals2[2];
		vals2[0]=vals[0];
		// hcd of tail of array.
		vals2[1]=hcd((vals + 1),length-1);
		// finally, hcd of result of hcd and head of array.
		return hcd(vals2,2);
	}
	// There was an error.
	else return -1;
}
Beispiel #2
0
int main(int argc, char *argv[]) {
	// Don't make me laugh.
	if (argc<=2) {
		return 1;
	}
	else {
		int highest, i;
		int *nums;
		// nums is an array of the values to process.
		nums = (int*)calloc(argc-1,sizeof(int));
		
		// let's populate the nums array.
		for (i = 1; i < argc; i++) {
			*(nums + i - 1) = atoi(argv[i]);
		}

		// highest = number of bags.
		highest = hcd(nums,argc-1);

		// (if we didn't mess up somewhere)
		if( highest>0) {
			int i, n, sum;
			// sum: number of sweets per bag.
			sum = 0;
			n = argc - 1;
		   	for (i=0; i < n; i++) {
				sum += nums[i] / highest;
			}
			// there you go.
			printf("%i %i\n",highest,sum);
		}
		else return 1;
	}

	return 0;
}
Beispiel #3
0
int main(int argc, char *argv[])
{
    std::string img0_str, img1_str;

    if(argc == 3) {
        img0_str = argv[1];
        img1_str = argv[2];
    } else {
        img0_str = "../data/input/features/balcony_0.png";
        img1_str = "../data/input/augmented_reality/desk.png";
    }

    //computing K matrix from manufacturer data
    double fx = pic::getFocalLengthPixels(3.3, 3.8, 2592.0);
    double fy = pic::getFocalLengthPixels(3.3, 2.9, 1936.0);
    Eigen::Matrix3d K = pic::getIntrinsicsMatrix(fx, fy, 2592.0 / 2.0, 1936.0 / 2.0);

    printf("Reading LDR images...");
    pic::Image img0, img1;
    img0.Read(img0_str, pic::LT_NOR);
    img1.Read(img1_str, pic::LT_NOR);

    printf("Ok\n");

    printf("Are they both valid? ");
    if(img0.isValid() && img1.isValid()) {
        printf("OK\n");

        //output corners
        std::vector< Eigen::Vector2f > corners_from_img0;
        std::vector< Eigen::Vector2f > corners_from_img1;

        //compute the luminance images
        pic::Image *L0 = pic::FilterLuminance::Execute(&img0, NULL, pic::LT_CIE_LUMINANCE);
        pic::Image *L1 = pic::FilterLuminance::Execute(&img1, NULL, pic::LT_CIE_LUMINANCE);

        //get corners
        printf("Extracting corners...\n");
        pic::HarrisCornerDetector hcd(2.5f, 5);
        hcd.execute(L0, &corners_from_img0);
        hcd.getCornersImage(&corners_from_img0, NULL, L0->width, L0->height, true)->Write("../test1.bmp");

        hcd.execute(L1, &corners_from_img1);
        hcd.getCornersImage(&corners_from_img1, NULL, L1->width, L1->height, true)->Write("../test2.bmp");

        //compute ORB descriptors for each corner and image
        //compute luminance images
        pic::Image *L0_flt = pic::FilterGaussian2D::Execute(L0, NULL, 2.5f);
        pic::Image *L1_flt = pic::FilterGaussian2D::Execute(L1, NULL, 2.5f);

        printf("Computing ORB descriptors...\n");

        //pic::PoissonDescriptor b_desc(16);
        pic::ORBDescriptor b_desc(31, 512);

        std::vector< unsigned int *> descs0;
        b_desc.getAll(L0_flt, corners_from_img0 , descs0);

        std::vector< unsigned int *> descs1;
        b_desc.getAll(L1_flt, corners_from_img1 , descs1);

        printf("Matching ORB descriptors...\n");
        int n = b_desc.getDescriptorSize();

        pic::BinaryFeatureBruteForceMatcher bfm(&descs1, n);

        printf("Descriptor size: %d\n", n);

        printf("Matching...");
        std::vector< Eigen::Vector3i > matches;
        bfm.getAllMatches(descs0, matches);
        printf(" we found %d matches ", matches.size());
        printf("Ok\n");

        //filter
        std::vector< Eigen::Vector2f > m0, m1;
        pic::BinaryFeatureMatcher::filterMatches(corners_from_img0, corners_from_img1, matches, m0, m1);

        printf("Estimating a homography matrix H from the matches...");

        std::vector< unsigned int > inliers;
        Eigen::Matrix3d H = pic::estimateHomographyWithNonLinearRefinement(m0, m1, inliers, 10000, 2.5f, 1, 10000, 1e-5f);

        Eigen::Matrix34d cam = pic::getCameraMatrixFromHomography(H, K);

        img1 *= 0.25f;

        //Augmentation: drawing a 3D grid
        int res = 10;
        for(int i=1;i<(res + 1);i++) {
            float u = float(i) / 50.0f;

            for(int j=1;j<(res + 1);j++) {
                float v = float(j) / 50.0f;

                Eigen::Vector4d point(u, v, 0.0f, 1.0f);
                Eigen::Vector2i coord = pic::cameraMatrixProject(cam, point);

                float *tmp = img1(coord[0], coord[1]);
                tmp[0] = 1.0f;
                tmp[1] = 0.25f;
                tmp[2] = 0.25f;
            }

        }

        //Augmentation: drawing 3D axis
        Eigen::Vector4d p0(0.0, 0.0, 0.0, 1.0);
        Eigen::Vector2i coord0 = pic::cameraMatrixProject(cam, p0);

        Eigen::Vector4d p1(0.2, 0.0, 0.0, 1.0);
        Eigen::Vector2i coord1 = pic::cameraMatrixProject(cam, p1);

        Eigen::Vector4d p2(0.0, 0.2, 0.0, 1.0);
        Eigen::Vector2i coord2 = pic::cameraMatrixProject(cam, p2);

        Eigen::Vector4d p3(0.0, 0.0, 0.2, 1.0);
        Eigen::Vector2i coord3 = pic::cameraMatrixProject(cam, p3);

        float color[]={0.25f, 1.0f, 0.25f};
        pic::drawLine(&img1, pic::convertFromEigenToVec(coord0), pic::convertFromEigenToVec(coord1), color);
        pic::drawLine(&img1, pic::convertFromEigenToVec(coord0), pic::convertFromEigenToVec(coord2), color);
        pic::drawLine(&img1, pic::convertFromEigenToVec(coord0), pic::convertFromEigenToVec(coord3), color);

        img1.Write("../data/output/simple_augmented_reality.png", pic::LT_NOR);

    } else {
        printf("No, there is at least an invalid file!\n");
    }

    return 0;
}