如何在OpenCV中最好计算光线线段的交点?并获得其交点和距原点的距离? [英] How to calculate ray-line segment intersection preferably in OpenCV? And get its intersection points and distance from origin?

查看:184
本文介绍了如何在OpenCV中最好计算光线线段的交点?并获得其交点和距原点的距离?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有4条线段,A,B,C和D.每条线表示为两个点.例如.线A表示为点A1和点A2.

I have 4 lines segment, A, B, C and D. Each line is represented as two points. Eg. line A is represented as point A1 and point A2.

我想要的是

  1. X点,A线与B线相交的点
  2. X和A1(原点)之间的距离

测试相交时,线A射线不应该

When testing for intersection, line A ray should not

  1. 与线段D相交
  2. 与线段C相交

我该怎么做?

推荐答案

最后使它可以在OpenCV C ++上运行.基于此 https://stackoverflow.com/a/32146853/457030 .

Finally got it working on OpenCV C++. Based on this https://stackoverflow.com/a/32146853/457030.

// return the distance of ray origin to intersection point
double GetRayToLineSegmentIntersection(Point2f rayOrigin, Point2f rayDirection, Point2f point1, Point2f point2)
{
    Point2f v1 = rayOrigin - point1;
    Point2f v2 = point2 - point1;
    Point2f v3 = Point2f(-rayDirection.y, rayDirection.x);

    float dot = v2.dot(v3);
    if (abs(dot) < 0.000001)
        return -1.0f;

    float t1 = v2.cross(v1) / dot;
    float t2 = v1.dot(v3) / dot;

    if (t1 >= 0.0 && (t2 >= 0.0 && t2 <= 1.0))
        return t1;

    return -1.0f;
}

// use this to normalize rayDirection
Point2f NormalizeVector(Point2f pt)
{
    float length = sqrt(pt.x*pt.x + pt.y*pt.y);
    pt = pt / length;
    return pt;
}

// gets the intersection point
Point2f GetRayIntersectionPoint(Point2f origin, Point2f vector, double distance)
{
    Point2f pt;

    pt.x = origin.x + vector.x * distance;
    pt.y = origin.y + vector.y * distance;

    return pt;
}

应该是自我解释.

这篇关于如何在OpenCV中最好计算光线线段的交点?并获得其交点和距原点的距离?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆