Ejemplo n.º 1
0
void testIntersection()
{

    RGB24Buffer image(1000,1000, RGBColor::White());

    corecvs::Polygon p;
    for (int i = 0; i < 5; i++)
    {
        p.push_back(Vector2dd::FromPolar(-2 * M_PI / 5 * i, 260) + Vector2dd(image.w / 2.0, image.h / 2.0));
    }


    AbstractPainter<RGB24Buffer> painter(&image);

    painter.drawPolygon(p, RGBColor::Black());
    for (unsigned i = 0; i < p.size(); i++)
    {
        Vector2dd p1 = p[i];
        Vector2dd p2 = p[(i + 1) % p.size()];

        Vector2dd center = (p1 + p2) / 2.0;
        Vector2dd decal = (p2 - p1).rightNormal().normalised();
        decal = center + decal * 8;
        image.drawLine(center.x(), center.y(), decal.x(), decal.y(), RGBColor::gray(128));
    }


    for (int i = 1; i < 10; i++)
    {
        Ray2d ray( Vector2dd::FromPolar( M_PI / 20.0 * i + 0.02, 100), Vector2dd(140,180));

        Vector2dd p1 = ray.getPoint(0.0);
        Vector2dd p2 = ray.getPoint(8.0);
        image.drawLine(fround(p1.x()), fround(p1.y()), fround(p2.x()), fround(p2.y()), RGBColor::Yellow());
        for (int j = 0; j < 8; j++)
        {
            Vector2dd p = ray.getPoint(j);
            image.drawCrosshare1(p.x(), p.y(), RGBColor::Cyan());
        }

        double t1, t2;
        ray.clip<Polygon>(p, t1, t2);

        p1 = ray.getPoint(t1);
        p2 = ray.getPoint(t2);

        cout << "t1 = " << t1 << endl;
        cout << "t2 = " << t2 << endl;
        cout << "p1 = " << p1 << endl;
        cout << "p2 = " << p2 << endl;

        image.drawLine(fround(p1.x()), fround(p1.y()), fround(p2.x()), fround(p2.y()),
                       t1 > t2 ? RGBColor::Red() : RGBColor::Green());

    }


    BMPLoader().save("out1.bmp", &image);

}
    virtual void operator()(const double in[], double out[])
    {
        double dh = (double)mH / (mSteps - 1);
        double dw = (double)mW / (mSteps - 1);
        RadialCorrection guess = updateWithModel(mGuess, in);

        for (int i = 0; i < mSteps; i++)
        {
            for (int j = 0; j < mSteps; j++)
            {
                Vector2dd point(dw * j, dh * i);
                Vector2dd deformed = mInput.map(point); /* this could be cached */
                Vector2dd backproject = guess.map(deformed);
                Vector2dd diff = backproject - point;

                out[2 * (i * mSteps + j)    ] = diff.x();
                out[2 * (i * mSteps + j) + 1] = diff.y();
            }
        }
    }
Ejemplo n.º 3
0
void RGB24Buffer::drawCorrespondanceList(CorrespondanceList *src, double colorScaler, int32_t y, int32_t x)
{
    if (src == NULL) {
        return;
    }

    CorrespondanceList::iterator it;
    for (it = src->begin(); it != src->end(); ++it)
    {
        Correspondance &tmpCorr = (*it);
        Vector2dd from = tmpCorr.start;
        Vector2dd to = tmpCorr.end;
        Vector2dd vec = to - from;
        //RGBColor color = RGBColor(128 + (vec.x() * 5),128 + (vec.y() * 5), 0);
        RGBColor color = RGBColor::rainbow1(!vec / colorScaler);
        drawLineSimple(from.x() + x, from.y() + y, to.x() + x, to.y() + y, color);
        this->drawCrosshare3(to.x() + x, to.y() + y, color);
    }
}
TEST(ConvexHull, testConvexHull1)
{
    Polygon  p;
    p.push_back(Vector2dd(0.0, 0.0));
    p.push_back(Vector2dd(2.0, 0.0));
    p.push_back(Vector2dd(2.0, 4.0));
    p.push_back(Vector2dd(4.0, 4.0));
    p.push_back(Vector2dd(4.0, 0.0));
    p.push_back(Vector2dd(6.0, 0.0));
    p.push_back(Vector2dd(6.0, 6.0));
    p.push_back(Vector2dd(0.0, 6.0));

    /* Test Gift Wrap */
    Polygon result1 = ConvexHull::GiftWrap(p);
    cout << result1 << endl;
    for (size_t i = 0; i < result1.size(); i++)
    {
        Vector2dd point = result1[i];
        bool perefery = !point.isInRect(Vector2dd(0.01,0.01), Vector2dd(5.99,5.99));
        CORE_ASSERT_TRUE(perefery, "GiftWrap: Convex hull is wrong");
    }

    /* Test GrahamScan */
    Polygon pCopy(p);
    Polygon result2 = ConvexHull::GrahamScan(pCopy);
    cout << result2 << endl;
    for (size_t i = 0; i < result2.size(); i++)
    {
        Vector2dd point = result2[i];
        bool perefery = !point.isInRect(Vector2dd(0.01,0.01), Vector2dd(5.99,5.99));
        CORE_ASSERT_TRUE(perefery, "GrahamScan: Convex hull is wrong");
    }

    /* Test GrahamScan projective*/
    ProjectivePolygon pCopy1(p);
    ProjectivePolygon result3 = ConvexHull::GrahamScan(pCopy1);
    cout << result3 << endl;
    for (size_t i = 0; i < result3.size(); i++)
    {
        Vector2dd point = result3[i].normalisedProjective().xy();
        bool perefery = !point.isInRect(Vector2dd(0.01,0.01), Vector2dd(5.99,5.99));
        CORE_ASSERT_TRUE(perefery, "GrahamScan Projective: Convex hull is wrong");
    }

}
StereographicProjection::StereographicProjection(const Vector2dd &principal, double focal, const Vector2dd &size) :
    ProjectionBaseParameters(principal.x(), principal.y(), focal, size.x(), size.y(), size.x(), size.y()),
    CameraProjection(ProjectionType::STEREOGRAPHIC)
{}
Ejemplo n.º 6
0
CameraProjection *ILFormat::loadIntrisics(std::istream &filename)
{
    /**
      Some examples

        // "omnidirectional\n"
        // "1578 1.35292 1.12018 5 0.520776 -0.561115 -0.560149 1.01397 -0.870155";


        // projective
        // fx fy cx cy w h


    **/

    std::string cameraType;
    filename >> cameraType;

    if (cameraType == IL_OMNIDIRECTIONAL)
    {
        double s;
        Vector2dd c;
        int imax;
        double n0;

        filename >> s;
        filename >> c.x() >> c.y();
        filename >> imax;

        filename >> n0;
        vector<double> n;
        for (int i = 0; i < imax-1; i++)
        {
            double v = 0;
            filename >> v;
            n.push_back(v);
        }

#if 0
        cout << "Type: " << cameraType << endl;
        cout << "s: " << s << endl;
        cout << "c: " << c << endl;
        cout << "imax: " << imax << endl;
        cout << "n0: " << n0 << endl;

        for (int i = 0; i < imax-1; i++)
        {
            cout << "n" << i+2 << " " << n[i] << endl;
        }
#endif

        OmnidirectionalProjection *projection = new OmnidirectionalProjection;
        projection->setFocal(s * n0);
        projection->setPrincipalX(s * c.x());
        projection->setPrincipalY(s * c.y());
        projection->setSizeX(projection->principalX() * 2);
        projection->setSizeY(projection->principalY() * 2);

        projection->setDistortedSizeX(projection->principalX() * 2);
        projection->setDistortedSizeY(projection->principalY() * 2);

        projection->mN.clear();

        for (size_t i = 0; i < n.size(); i++)
        {
           projection->mN.push_back(n[i] * pow(n0, i + 1));
        }
        return projection;
    }