opencv 求两条线的交叉点

#include <opencv2\highgui\highgui.hpp>
#include <opencv2\opencv.hpp>
using namespace std;
using namespace cv;

Point2f CrossPoint(vector<Point2f> dots)
{
    Point2f pt;
    double X1 = dots[3].x - dots[0].x;//b1
    double Y1 = dots[3].y - dots[0].y;//a1
    double X2 = dots[2].x - dots[1].x;//b2
    double Y2 = dots[2].y - dots[1].y;//a2

    double X21 = dots[1].x - dots[0].x;
    double Y21 = dots[1].y - dots[0].y;

    double D = Y1*X2 - Y2*X1;// a1b2-a2b1
                             // 
    if (D == 0) return 0;
    pt.x = (X1*X2*Y21 + Y1*X2*dots[0].x - Y2*X1*dots[1].x) / D;
    pt.y = -(Y1*Y2*X21 + X1*Y2*dots[0].y - X2*Y1*dots[1].y) / D;
    if ((abs(pt.x - dots[0].x - X1 / 2) <= abs(X1 / 2)) &&
        (abs(pt.y - dots[0].y - Y1 / 2) <= abs(Y1 / 2)) &&
        (abs(pt.x - dots[1].x - X2 / 2) <= abs(X2 / 2)) &&
        (abs(pt.y - dots[1].y - Y2 / 2) <= abs(Y2 / 2))) {
        return pt;
    }
    return 0;
}

int main()
{
    Mat srcImage(Size(800, 800), CV_8UC3, Scalar(0));

    Point2f a(200, 300);
    Point2f b(600, 300);
    Point2f c(200, 600);
    Point2f d(600, 600);

    circle(srcImage, a, 6, Scalar(0, 255, 0), -1, 8, 0);
    circle(srcImage, b, 6, Scalar(0, 255, 0), -1, 8, 0);
    circle(srcImage, c, 6, Scalar(0, 255, 0), -1, 8, 0);
    circle(srcImage, d, 6, Scalar(0, 255, 0), -1, 8, 0);

    line(srcImage, a, d, Scalar(0, 0, 255), 2);
    line(srcImage, b, c, Scalar(0, 0, 255), 2);

    vector<Point2f> dots;
    dots.push_back(a);
    dots.push_back(c);
    dots.push_back(b);
    dots.push_back(d);



    Point2f jx = CrossPoint(dots);

    circle(srcImage, jx, 10, Scalar(0, 255, 255), 2, 8, 0);

    imshow("srcImage", srcImage);
    waitKey(0);
    return 0;
}

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值