精华内容
下载资源
问答
  • Halcon(根据霍夫变换在图像中找直线
    千次阅读
    2020-08-28 19:03:12

    这是学习的第一个Halcon视觉案例:霍夫变换在图像中找曲线

    由于之前了解到的视觉是Ni Vision,对于Halcon也只是了解,今天从第一个例子作为入门。附上代码:

    {

    *读取一张图片
    read_image (Image, ‘C:/Users/58937/Desktop/2222.png’)

    *读取图片长宽
    get_image_size(Image,width,height) *这里读取当前内存图片Image的长宽

    *打开一个窗口
    dev_open_window (0, 0, width, height, ‘black’, WindowHandle) *这里新建一个背景颜色黑色的窗口

    *根据坐标剪切矩形图像
    rectangle1_domain (Image, ImageReduced, 76, 50, 1000, 1000) *这里是根据坐标裁剪图片,我试了要自己修改坐标

    *寻找图像中矩形边缘
    sobel_amp (ImageReduced, EdgeAmplitude, ‘sum_abs’, 3) *这里新建一个背景颜色黑色的图像窗口(这里得到的效果是当前图像里面矩形边缘,相当于同心的两个矩形)

    *设置输出对象颜色
    dev_set_color(‘red’) *这里设置里面对象的颜色

    *对上面获取的边缘图像进行阈值操作 *阈值的作用:得到一张对比度不同的黑白图像

    threshold(EdgeAmplitude,Region,10,255)

    *对阈值后的区域联通处理
    connection(Region,ConnectedRegions) *这样操作后图片中矩形边缘的两个同心矩形变成且可以一次被选中

    *根据面积过滤出团中心矩形区域
    select_shape(ConnectedRegions,SelectedRegions,‘area’,‘and’,250,99999) *这样操作后图片中矩形边缘的两个同心矩形可以单独被选

    *霍夫变换寻找区域中的直线
    hough_lines(SelectedRegions,4,50,5,5,Angle, Dist) *通过霍夫变换(就是根据Y=KX+b,采用Y和X的值生成的不同直线,这些直线都会有一个交点)这样就会有四个交点,也就是矩形的四个点

    *设置输出对象颜色
    dev_set_color(‘blue’) *将所有直线颜色改为蓝色

    *将直线转换为区域
    gen_region_hline(Regions,Angle, Dist) *一个对象的轮廓(contour)作为链式码。

    *根据方向特征来过滤想要的直线
    select_shape(Regions,SelectedRegions1,‘orientation’,‘and’,1.5,1.6) *筛选指定方向的直线
    select_shape(Regions,SelectedRegions2,‘orientation’,‘and’,0,0.1)

    *显示图像和结果直线
    dev_display(Image) *显示图片
    dev_display(SelectedRegions1) *显示筛选方向的直线
    dev_display(SelectedRegions2)

    }

    更多相关内容
  • Hough变换找直线C++

    2020-06-03 11:57:00
    运行在Xcode上的C++工程,自己实现,未调用OpenCV的Hough函数,通过hough变换找到图片中的直线
  • HALCON源码画两个直线两条线的交点,
  • 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找直线及直线交点

    万次阅读 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
    一个很简单的小程序~
    请各位看官多多指教!

    展开全文
  • 模仿的Halcon中直线拟合功能,使用卡尺标定法去径向扫描图像梯度,然后通过最小二乘法或者其他方法来拟合直线。C++、opencv4.3,全部函数都封装好了,注释基本上是全的。创作不易,收个小钱混口饭吃。要是觉得贵了跟...
  • 图中有一条直线AB,现在我们要做他的三等分点在平面内任取一点C,使C不在AB确定的直线上即可。然后连接AC,BC 取AC中点D,连接BD 然后取BD中点E,连接CE并延长与AB相交于F,则F就是AB的一个三等分点。 当时高中的...

    图中有一条直线AB,现在我们要做他的三等分点在这里插入图片描述在平面内任取一点C,使C不在AB确定的直线上即可。然后连接AC,BC
    在这里插入图片描述
    取AC中点D,连接BD
    在这里插入图片描述
    然后取BD中点E,连接CE并延长与AB相交于F,则F就是AB的一个三等分点。
    在这里插入图片描述
    当时高中的时候学物理,学到质心突然想到的一个证明的方法,就假设A处有一个质量为 m m m的质点,B处有一个 2 m 2m 2m的质点,那么我们可以知道把这两个质点看作一个整体的质心在他们连线的三等分点处。
    然后假设C为平面上的一个质点其质量也是 m m m,然后我们来求ABC这三个点的质心,可以想到有两种办法:第一种可以先求出AD的质心也就是图中的D,然后再求出BD的质心,即得到ABC的质心;第二种可以先求出AB的质心也就在三等分点处,然后再求出CF的质心,即得到ABC的质心。
    第一种方法最终我们求得E点,第二种方法最后也必然会得到E点,因此我们可以知道AB的三等分点必然在CE确定的直线上,于是就得到了F为AB三等分点的结论。

    展开全文
  • Halcon抓直线

    2018-07-04 11:01:30
    利用鸟叔的外部函数rake.spoke,抓直线,可简单自定义抓线位置,计算交点
  • 主要为大家详细介绍了OpenCV实现图像直线检测的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • 主要为大家详细介绍了opencv检测直线方法之形态学方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
  • Halcon代码,用于检测选择区域中的直线,把直线标注出来。
  • 分享自己撸的一个halcon检测直线的算法,该方法可控性强,稳定,准确
  • 基于EMGUCV的直线车道线检测,通过改进的HOUGH变换,检测特定区域的直线,以达到检测车道线的目的。
  • 利用Hough变换进行直线检测,原始图像经过边缘检测、Hough变换
  • KCG-VISION:找直线

    2019-06-20 13:46:45
    新建工程 新建工程"Find_Line",其过程或下载软件可以参考《KCG-...找到下图中的直线。 运行过程 读取该图片->直线查找->画出找到的直线。 相关算子 最终的算子脚本如下图 最终效果图 ...
  • OpenCVSharp入门教程 特征提取③——HoughLinesP直线寻找,直线提取。 一、前文; 二、算法流程; 三、界面布局; 四、功能实现; 4.1 打开图片; 4.2 HoughLinesP直线提取—源码; 4.3 HoughLinesP直线提取—参数...
  • 基于halcon的直线查找之卡尺

    千次阅读 2020-03-29 18:14:05
    基于halcon的直线查找之卡尺 直线的检测在halcon中主要有两种方式:直线拟合和卡尺直线。这里分享卡尺方法,拟合的请移步:链接: 直线拟合 直线卡尺 首先把整体思路列出来: ①CreateMetrologyModel创建一个测量句柄...
  • 在Python中使用OpenCV进行直线检测

    千次阅读 2022-03-01 21:20:05
    在图像处理中,直线检测是一种常见的算法,它通常获取n个边缘点的集合,并找到通过这些边缘点的直线。其中用于直线检测,最为流行的检测器是基于霍夫变换的直线检测技术。 2. 霍夫变换 霍夫变换是图像处理中的一种...
  • C# OpenCV EmguCV LSD直线检测使用Demo

    千次阅读 2021-12-27 15:53:17
    LSD直线检测原理大家可以自行百度查询,这里给出EmguCV4.5.4使用Demo如下: 测试图像1: 测试图像2: EmguCV Demo(EmguCV版本4.5.4): using System; using System.Collections....
  • 利用opencv编写的提取直线的代码,主要是canny算子和hough变换的使用
  • 复习久了觉得枯燥,玩玩儿霍夫变换直线检测霍夫变换的基本原理不难,即便是初中生也很容易理解(至少在直线检测上是这样子的)。霍夫变换直线检测的基本原理:(不配图了,自己在白纸上画画,理解更深刻)一步一步来:1...
  • 基本思路先使用上文介绍的Prewitt算子将输入的图像边缘化处理,再使用霍夫变换检测直线。其中使用到了matlab的hough,houghpeaks,houghlines等函数.函数hough[H, theta, rho] = hough(f) 或 [H, theta, rho] = hough...
  • Halcon自定义直线卡尺rake

    千次阅读 2021-06-09 15:37:30
    拟合直线 rake工具 1. 为什么要开发rake工具 2. rake工具的封装三个函数 2.1 创建ROI的函数:draw_rake 2.2 边缘测量的函数:rake 2.3 拟合直线的函数:pts_to_best_line 3. rake工具使用示例 4. 代码下载
  • Halcon取直线

    千次阅读 2019-11-14 14:43:10
    原图,类似这样的图就行 代码 read_image (Image, 'E:/gongsi/Project/BatterySun/test8.png') rgb1_to_gray (Image, GrayImage) threshold_sub_pix (GrayImage, Regions,200) select_shape_xld (Regions, ...
  • plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show() #直线检测 img = cv2.imread("road.jpeg") plt.axis('off') plt.imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB)) plt.show() #canny 方法检测边缘 返回...
  • CV | 直线检测的方法

    千次阅读 2020-08-21 17:10:02
    y0)可以代表360°的直线的其中一个点,我们把这个点旋转360°的直线都用极坐标(ρ,θ)表达出来,就是一个在霍夫空间(ρ,θ)的正弦曲线(大家想象一下,一个点的360°的直线的(ρ,θ)都不一样,不一样的(ρ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 69,457
精华内容 27,782
关键字:

怎么找直线

友情链接: uimed.zip