精华内容
下载资源
问答
  • opencv找直线及直线交点

    万次阅读 2017-12-06 17:16:16
    在图中找出两条直线,并找到两条直线交点位置。 思路: 1) 读图,二值化,简单腐蚀,之后直线在原图中比较明显,所以考虑直接用霍夫变换寻找直线。 2)霍夫直线检测可能会检测出多条重叠直线,利用上下两...

    opencv2.4.9 & VS2013环境

    问题描述

    在图中找出两条直线,并找到两条直线交点位置。
    SRC

    思路:

    1) 读图,二值化,简单腐蚀,之后直线在原图中比较明显,所以考虑直接用霍夫变换寻找直线。

    2)霍夫直线检测可能会检测出多条重叠直线,利用上下两部分直线斜率相反筛选一下,选出两条直线。

    3)两条直线求交点,变为解二元一次方程问题。

    4)画出结果

    实现:

    1)调用opencv中的HoughLinesP函数:

    void HoughLinesP( InputArray image, OutputArray lines,double rho, double theta, int threshold,double minLineLength=0, double maxLineGap=0 );

    image为输入图像,要求是8位单通道图像

    lines为输出的直线向量,每条线用4个元素表示,即直线的两个端点的4个坐标值

    rho和theta分别为距离和角度的分辨率

    threshold为阈值,即步骤3中的阈值

    minLineLength为最小直线长度,在步骤5中要用到,即如果小于该值,则不被认为是一条直线

    maxLineGap为最大直线间隙,在步骤4中要用到,即如果有两条线段是在一条直线上,但它们之间因为有间隙,所以被认为是两个线段,如果这个间隙大于该值,则被认为是两条线段,否则是一条。

    2)检测出的直线为Vec4i类型,一共四位数。分别代表直线上的(x1,y1,x2,y2),求出每条直线写了,Ka * kB<0即代表两条直线鞋履相反

    3)利用四个点坐标解方程,返回point2f类型的一个点

    4)利用Line()以及circle()函数画出图像

    代码:

    /*Copyright@hitzym
    Harbin Institute of Technology
    Nov,29, 2017*/
    # include <opencv2/opencv.hpp>  
    # include <iostream>  
    
    using namespace cv;
    using namespace std;
    
    /*函数功能:求两条直线交点*/
    /*输入:两条Vec4i类型直线*/
    /*返回:Point2f类型的点*/
    Point2f getCrossPoint(Vec4i LineA, Vec4i LineB)
    {
        double ka, kb;
        ka = (double)(LineA[3] - LineA[1]) / (double)(LineA[2] - LineA[0]); //求出LineA斜率
        kb = (double)(LineB[3] - LineB[1]) / (double)(LineB[2] - LineB[0]); //求出LineB斜率
    
        Point2f crossPoint;
        crossPoint.x = (ka*LineA[0] - LineA[1] - kb*LineB[0] + LineB[1]) / (ka - kb);
        crossPoint.y = (ka*kb*(LineA[0] - LineB[0]) + ka*LineB[1] - kb*LineA[1]) / (ka - kb);
        return crossPoint;
    }
    
    int main(){
    
        Mat src, grayImg, binImg, result;
        src = imread("./1.jpg");
        //imshow("srcimage", src);
        //waitKey(30);
    
        /*检查图像是否载入*/
        if (src.empty()) {
            printf("Error Loading Image...\n");
            return -1;
        }
    
        /*转为灰度图*/
        if (src.channels() == 3){
            cvtColor(src, grayImg, CV_BGR2GRAY);
        }
        else if (src.channels() == 2){
            grayImg = src.clone();
        }
    
        /*二值化*/
        threshold(grayImg, binImg, 100, 255, THRESH_BINARY);
        //adaptiveThreshold(grayImg, binImg, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, -2);
        //imshow("binary image", binImg);
        //waitKey(100);
    
        /*腐蚀*/
        Mat element = getStructuringElement(MORPH_RECT, Size(2, 1));
        Mat erodeImg; 
        erode(binImg, erodeImg, element);
        //imshow("erode", erodeImg);
        //waitKey(100);
    
        /*霍夫直线检测*/
        vector<Vec4i> Lines;
        HoughLinesP(erodeImg, Lines, 1, CV_PI / 360, 200, 100, 10);
        Vec4i LineStand = Lines[0];
        Vec4i LineAnother;
        double ka = (double)(LineStand[1] - LineStand[3]) / (double)(LineStand[0] - LineStand[2]);
        double kb;
        for (int i = 1; i < Lines.size(); i++)
        {
            double ki = (double)(Lines[i][1] - Lines[i][3]) / (double)(Lines[i][0] - Lines[i][2]);
            if (ki*ka < 0)        
            {
                LineAnother = Lines[i];
                kb = ki;
            }
        }
    
        /*画出两条直线*/
        result = src.clone();
        line(result, Point(LineStand[0], LineStand[1]), Point(LineStand[2], LineStand[3]), Scalar(0, 255, 0), 2, 8);
        line(result, Point(LineAnother[0], LineAnother[1]), Point(LineAnother[2], LineAnother[3]), Scalar(0, 0, 255), 2, 8);
        cout << "直线A过点(" << LineStand[0] << "," << LineStand[1] << ")以及点(" << LineStand[2]<<","<<LineStand[3] << ");斜率为:" << ka << endl;
        cout << "直线B过点(" << LineAnother[0] << "," << LineAnother[1] << ")以及点(" << LineAnother[2] << "," << LineAnother[3] << ");斜率为:" << kb << endl;
    
        /*求交点并画点保存,result.jpg存储在工程目录下*/
        Point2f crossPoint;
        crossPoint = getCrossPoint(LineStand, LineAnother);
        circle(result, crossPoint, 6, Scalar(255, 0, 0));
        imwrite("./result.jpg", result);
        cout << "交点坐标为:" << crossPoint << endl;
        cout << "Copyrigth@zym" << endl;
        imshow("result", result);
        waitKey(100);
        system("pause");
    
        return 0;
    }

    运行结果:

    result

    console
    一个很简单的小程序~
    请各位看官多多指教!

    展开全文
  • Opencv计算两直线交点

    千次阅读 2017-10-18 10:11:14
    直线交点

    //一个细微的模块,干脆放在这里备忘

    //顺便,喜迎十九大,233


    计算出点1,2形成直线与点3,4形成直线的交点

    如果有无穷多个或者平行,那么返回2和3的中间点


    下面就是简单粗暴的功能函数

    cv::Point 交点(cv::Point 点1, cv::Point 点2, cv::Point 点3, cv::Point 点4) {
    	//计算点1,2形成直线与点3,4形成直线交点
    	//如果平行或有无穷个交点就取点2和3的中间点
    	int x, y;
    	int X1 = 点1.x - 点2.x, Y1 = 点1.y - 点2.y, X2 = 点3.x - 点4.x, Y2 = 点3.y - 点4.y;
    	//(点1.x-x)/(点1.y-y)=X1/Y1
    	//(点1.x-x)Y1=X1(点1.y-y)
    	//X1*y=(Y1*x+X1*点1.y-Y1*点1.x)
    	//X2*y=(Y2*x+X2*点3.y-Y2*点3.x)
    	if (X1*Y2 == X2*Y1)return cv::Point((点2.x+点3.x)/2,(点2.y+点3.y)/2);
    
    	int A = X1*点1.y - Y1*点1.x,B= X2*点3.y - Y2*点3.x;
    	//X1*y=(Y1*x+A)
    	//X2*y=(Y2*x+B)
    	y = (A*Y2 - B*Y1) / (X1*Y2 - X2*Y1);
    	x = (B*X1-A*X2) / (Y1*X2 - Y2*X1);
    	return cv::Point(x, y);
    }

    以及完整测试:


    #include<opencv2/opencv.hpp>
    using namespace cv;
    cv::Point 交点(cv::Point 点1, cv::Point 点2, cv::Point 点3, cv::Point 点4) {
    	//计算点1,2形成直线与点3,4形成直线交点
    	//如果平行或有无穷个交点就取点2和3的中间点
    	int x, y;
    	int X1 = 点1.x - 点2.x, Y1 = 点1.y - 点2.y, X2 = 点3.x - 点4.x, Y2 = 点3.y - 点4.y;
    	//(点1.x-x)/(点1.y-y)=X1/Y1
    	//(点1.x-x)Y1=X1(点1.y-y)
    	//X1*y=(Y1*x+X1*点1.y-Y1*点1.x)
    	//X2*y=(Y2*x+X2*点3.y-Y2*点3.x)
    	if (X1*Y2 == X2*Y1)return cv::Point((点2.x + 点3.x) / 2, (点2.y + 点3.y) / 2);
    
    	int A = X1*点1.y - Y1*点1.x, B = X2*点3.y - Y2*点3.x;
    	//X1*y=(Y1*x+A)
    	//X2*y=(Y2*x+B)
    	y = (A*Y2 - B*Y1) / (X1*Y2 - X2*Y1);
    	x = (B*X1 - A*X2) / (Y1*X2 - Y2*X1);
    	return cv::Point(x, y);
    }
    int  main() {
    	cv::Mat 画布(500, 500, CV_8UC3);
    	画布 = cv::Scalar(255,255,255);
    	cv::Point 点1(200, 100), 点2(100, 50), 点3(400, 50), 点4(100, 380);
    
    	cv::circle(画布, 点1, 5, cv::Scalar(255, 0, 0), -1);
    	cv::circle(画布, 点2, 5, cv::Scalar(255, 0, 0), -1);
    	cv::circle(画布, 点3, 5, cv::Scalar(255, 0, 0), -1);
    	cv::circle(画布, 点4, 5, cv::Scalar(255, 0, 0), -1);
    	line(画布, 点2 - 点1, 3*(点2 + 点1), Scalar(111, 111, 255));
    	line(画布, 点3+2*(点4 - 点3), 点3 -3 * (点4 - 点3), Scalar(111, 111, 255));
    
    	cv::Point 结果 = 交点(点1, 点2, 点3, 点4);
    	cv::circle(画布, 结果, 5, cv::Scalar(0, 255, 0), -1);
    	std::cout << "最终坐标为" << 结果;
    	cv::imshow("计算交点", 画布);
    	cv::waitKey(-1);
    	return 0;
    }


    以后可以叫我老中医……


    展开全文
  • opencv3找直线并求任意两条直线交点

    千次阅读 2018-07-09 20:51:21
    opencv3找直线并求任意两条直线交点,并显示出来,是直线交点,因为我把线段延长了。 求交点函数 /*函数功能:求两条直线交点*/ /*输入:两条Vec4i类型直线*/ /*返回:Point2f类型的点*/ Point2f getCrossPoint...

    opencv3找直线并求任意两条直线交点,并显示出来,是直线交点,因为我把线段延长了。

    求交点函数

    /*函数功能:求两条直线交点*/
    /*输入:两条Vec4i类型直线*/
    /*返回:Point2f类型的点*/
    Point2f getCrossPoint(Vec4i LineA, Vec4i LineB)
    {
        double ka, kb;
        ka = (double)(LineA[3] - LineA[1]) / (double)(LineA[2] - LineA[0]); //求出LineA斜率
        kb = (double)(LineB[3] - LineB[1]) / (double)(LineB[2] - LineB[0]); //求出LineB斜率
    
        Point2f crossPoint;
        crossPoint.x = (ka*LineA[0] - LineA[1] - kb*LineB[0] + LineB[1]) / (ka - kb);
        crossPoint.y = (ka*kb*(LineA[0] - LineB[0]) + ka*LineB[1] - kb*LineA[1]) / (ka - kb);
        return crossPoint;
    }

    效果图:

    这里写图片描述

    整体代码

    
    #pragma warning(disable:4996)
    
    #include <stdio.h>  
    #include <time.h>  
    #include <math.h>  
    #include <iostream> 
    #include <io.h>
    #include "windows.h"  
    #include "fstream" 
    
    //opencv相关
    #include <opencv2/opencv.hpp>  
    #include <opencv2/video.hpp>
    #include <opencv2/imgproc/imgproc.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv/cv.h>  
    #include <opencv2/core/core.hpp>  
    #include <opencv2/highgui/highgui.hpp>  
    #include <opencv2/ml/ml.hpp>  
    #include <opencv2/objdetect/objdetect.hpp>//hog特征的c文件
    
    //自己编写的文件
    #include "UART.h"
    #include "findline.h"
    #include "DrawImage.h"//绘制图形
    #include "Manipulator_positioning.h" //棋子挡板识别及定位
    #include "Number.h"
    #include "Locate.h"
    
    using namespace std;
    using namespace cv;
    using namespace cv::ml;
    
    RNG rng(12345);
    
    using namespace cv;
    using namespace std;
    
    RNG g_rng(12345);
    
    /*函数功能:求两条直线交点*/
    /*输入:两条Vec4i类型直线*/
    /*返回:Point2f类型的点*/
    Point2f getCrossPoint(Vec4i LineA, Vec4i LineB)
    {
        double ka, kb;
        ka = (double)(LineA[3] - LineA[1]) / (double)(LineA[2] - LineA[0]); //求出LineA斜率
        kb = (double)(LineB[3] - LineB[1]) / (double)(LineB[2] - LineB[0]); //求出LineB斜率
    
        Point2f crossPoint;
        crossPoint.x = (ka*LineA[0] - LineA[1] - kb*LineB[0] + LineB[1]) / (ka - kb);
        crossPoint.y = (ka*kb*(LineA[0] - LineB[0]) + ka*LineB[1] - kb*LineA[1]) / (ka - kb);
        return crossPoint;
    }
    
    
    
    //-----------------------------------【main( )函数】--------------------------------------------
    //      描述:控制台应用程序的入口函数,我们的程序从这里开始
    //-----------------------------------------------------------------------------------------------
    int main()
    {   //【1】载入原始图和Mat变量定义   
        Mat srcImage = imread("11.jpg");  //工程目录下应该有一张名为1.jpg的素材图
        Mat midImage, dstImage;//临时变量和目标图的定义
    
        //彩色转灰度
        cv::cvtColor(srcImage, srcImage, CV_BGR2GRAY);
        cv::namedWindow("灰度化", 0);
        imshow("灰度化", srcImage);
        //模糊
        cv::blur(srcImage, srcImage, cv::Size(3, 3));
        cv::namedWindow("模糊", 0);
        imshow("模糊", srcImage);
        //【2】进行边缘检测和转化为灰度图
        Canny(srcImage, midImage, 50, 200, 3);//进行一此canny边缘检测
        cvtColor(midImage, dstImage, COLOR_GRAY2BGR);//转化边缘检测后的图为灰度图
    
        //【3】进行霍夫线变换
        vector<Vec4i> lines;//定义一个矢量结构lines用于存放得到的线段矢量集合
        HoughLinesP(midImage, lines, 1, CV_PI / 180, 320, 240, 30);
    
        printf("\n\n\t\t\t   当前使用的OpenCV版本为:\n" CV_VERSION);
        cout << "共检测到原始直线" << lines.size() << "条" << endl;
    
        //这里是将检测的线调整到延长至全屏,即射线的效果,其实可以不必这么做 
        for (unsigned int i = 0; i<lines.size(); i++)
        {
            cv::Vec4i v = lines[i];
            lines[i][0] = 0;
            lines[i][1] = ((float)v[1] - v[3]) / (v[0] - v[2])* -v[0] + v[1];
            lines[i][2] = midImage.cols;
            lines[i][3] = ((float)v[1] - v[3]) / (v[0] - v[2])*(midImage.cols - v[2]) + v[3];
        }
    
        //【4】依次在图中绘制出每条线段
        for (size_t i = 0; i < lines.size(); i++)
        {
            Vec4i l = lines[i];
            //此句代码的OpenCV2版为:
            //line( dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(186,88,255), 1, CV_AA);
            //此句代码的OpenCV3版为:
            line(dstImage, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0, 0, 255), 1, LINE_AA);
        }
        vector<Point2f> corners;//线的交点存储  
        for (unsigned int i = 0; i<lines.size(); i++)
        {
            for (unsigned int j = i + 1; j<lines.size(); j++)
            {
                cv::Point2f pt = getCrossPoint(lines[i], lines[j]);
                if (pt.x >= 0 && pt.y >= 0)
                {
                    corners.push_back(pt);
                }
            }
        }
        //【4】依次在图中绘制出角点
        for (size_t i = 0; i < corners.size(); i++)
        {
            circle(dstImage, corners[i], 3, CV_RGB(0, 255, 0), 2);
    
    
        }
    
    
    
    
    
    
        //【5】显示原始图  
        namedWindow("【原始图】", 0);//参数为零,则可以自由拖动
        imshow("【原始图】", srcImage);
    
        //【6】边缘检测后的图 
        namedWindow("【边缘检测后的图】", 0);//参数为零,则可以自由拖动
        imshow("【边缘检测后的图】", midImage);
    
        //【7】显示效果图  
        namedWindow("【效果图】", 0);//参数为零,则可以自由拖动
        imshow("【效果图】", dstImage);
    
        waitKey(0);
    
    
    
    
    
    }
    
    
    展开全文
  • opencv求任意两条直线交点

    千次阅读 2018-07-10 12:59:50
    函数功能:求两条直线交点 求两条直线交点 /*函数功能:求两条直线交点*/ /*输入:两条Vec4i类型直线*/ /*返回:Point2f类型的点*/ Point2f getCrossPoint(Vec4i LineA, Vec4i LineB) { double ka, kb; ka = ...

    函数功能:求两条直线交点

    求两条直线交点

    /*函数功能:求两条直线交点*/
    /*输入:两条Vec4i类型直线*/
    /*返回:Point2f类型的点*/
    Point2f getCrossPoint(Vec4i LineA, Vec4i LineB)
    {
        double ka, kb;
        ka = (double)(LineA[3] - LineA[1]) / (double)(LineA[2] - LineA[0]); //求出LineA斜率
        kb = (double)(LineB[3] - LineB[1]) / (double)(LineB[2] - LineB[0]); //求出LineB斜率
    
        Point2f crossPoint;
        crossPoint.x = (ka*LineA[0] - LineA[1] - kb*LineB[0] + LineB[1]) / (ka - kb);
        crossPoint.y = (ka*kb*(LineA[0] - LineB[0]) + ka*LineB[1] - kb*LineA[1]) / (ka - kb);
        return crossPoint;
    }
    

    opencv求任意两条直线交点,并绘制出来

    求任意两条直线交点,加两个个for循环即可,但是要注意相同直线不需要求交点。

        vector<Point2f> corners;//线的交点存储  
        for (unsigned int i = 0; i<lines.size(); i++)
        {
            for (unsigned int j = i + 1; j<lines.size(); j++)
            {
                cv::Point2f pt = getCrossPoint(lines[i], lines[j]);
                if (pt.x >= 0 && pt.y >= 0)
                {
                    corners.push_back(pt);
                }
            }
        }
    
    
        //【4】依次在图中绘制出角点
        for (size_t i = 0; i < corners.size(); i++)
        {
          circle(dstImage, corners[i], 3, CV_RGB(0, 255, 0), 2);
        }
    
    展开全文
  •  因为要求两个交点,所以要迭代两次,flag为1是正斜率,flag为0是负斜率,k和b是直线的两个参数,看代码: Point solve_edge_pionts(Ellipse& e, double &k, double &b,int flag) { //初始点 double x = (e....
  • 已经先处理过原图,利用canny算子边缘检测,如何求出图像中直线交点? (有代码最好- -) 我在网上查询,用hough变换,可是在检测过程中,并不能完全找全每一条边,另外也不是很明白如何求出直线方程,从而求出...
  • python-opencv 直线检测

    千次阅读 2019-12-10 14:21:07
    文章目录1 原理2 使用HoughLines()检测直线 1 原理 众所周知, 一条直线在图像二维空间可由两个变量表示. 例如: 在 笛卡尔坐标系: 可由参数: (m,b)(m,b)(m,b) 斜率和截距表示. 在 极坐标系: 可由参数: (r,θ)(r,\...
  • 小白学python(opencv直线检测)

    千次阅读 2021-04-11 14:32:51
    感觉我学opencv就是单纯学API。。对原理还是单纯了解。。 霍夫变换 霍夫变换是图像处理中从图像中识别几何形状的基本方法之一 主要用来从图像中分离出具有某种相同特征的几何形状 如,直线,圆等)。最基本的霍夫...
  • OpenCV计算两条直线交点

    千次阅读 2021-07-19 13:44:48
    计算两条直线交点,算法来源于python用opencv实现直线检测和计算交点,现翻译为C++实现。 bool getCrossPoint( cv::Point2i &out, cv::Point2i p1, cv::Point2i p2, cv::Point2i p3, cv::Point2i p4) ...
  • opencv求解两条直线交点

    千次阅读 2018-12-09 11:46:16
    假设现在有一个点集,需要拟合出最能够表达点集轮廓的几条直线,并求直线之间的交点。 从点集中拟合直线可以采用的方法:随机抽样一致性(RANSAC),霍夫变换(though transform) c++ 程序代码 /** @brief 计算直线...
  • Opencv学习笔记-----求取两条直线交点坐标

    万次阅读 多人点赞 2016-12-15 12:06:07
    求取二直线交点(基于OpenCv) 理论补充: 两直线是否有交点(或线段齐延长线是否相交)是一个Line-line intersection(Wikipedia)问题 在一个2维平面中有两直线(点到点、(点到点,这两条直线的交点用行列式表示如下:...
  • 在一张CAD图上需要知道墙角,并且标注出来,设想先检测出两面墙壁,即两条直线,然后计算线的交点即可 解决过程 首先要在python里面opencv库,之后读取图片,然后是直线检测前常规性的转灰度图、高斯模糊、边缘...
  • [img=https://forum.csdn.net/PointForum/ui/scripts/csdn/Plugin/001/face/96.gif][/img]
  • opencv 霍夫直线检测

    2021-07-26 21:49:31
    熟悉的opencv 又回到我的博客了,接下来带大家最简单的方式来理解对应原理,然后是如何处理的。 霍夫(Hough)变换是一个非常重要的检查间断点边形状的方法 ,它通过将图像坐标空间变换到参数空间,来实现直线和...
  • 原博客是opencv版本,转成opencvsharp非常方便 public static void Main() { Mat mat = new Mat(800, 800, MatType.CV_8UC3); Line2D l1 = new Line2D(100, 100, 100, 700); Line2D l2 = new Line2D...
  • OpenCV中求解两条直线交点

    千次阅读 2018-08-01 10:51:02
    问题1:给出两组坐标点[x1,y1][x2,y2]确定直线Line1? Line1的方程表示为: ------------(1) 分别带入两组坐标点,因为,,三个参数可以同比例放大缩小的。所以可以用下面这一组参数来表示: 万幸没有...
  • 主要为大家详细介绍了opencv检测直线方法之形态学方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 直线交点计算思路与常用方法 直线交点的计算这里列举几个比较常用的方法: ① 在知道直线方程的前提下(或知道直线上一点和直线角度),联立方程求解交点坐标(注意数学坐标系和图像坐标系的关系); ② 不知道直线...
  • 求两直线交点

    2012-07-19 15:52:00
    1 /// <summary> 2 /// 求两直线交点 直线公式 ax+by+c=0 3 /// </summary> 4 /// <param name="Line1">[a,b,c]</param> 5 /// <param name="Li...
  • opencv 自带直线拟合函数: void fitLine(InputArray points, OutputArray line, int distType, double param, double reps, double aeps) 输入points:C++中一般定义为std::vector points; 输出line:C++中一般定义为...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,439
精华内容 575
关键字:

opencv直线交点