OpenCV中更稳更快的边缘检测方法,快速查找线、圆、椭圆--EdgeDrawing-C++代码

这篇具有很好参考价值的文章主要介绍了OpenCV中更稳更快的边缘检测方法,快速查找线、圆、椭圆--EdgeDrawing-C++代码。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

计算机视觉之家看到快速圆检测Edge Drawing,其效果比霍夫要好,速度更快(具体效果可以参考视觉之家的文章),上面C++代码不全,那么好的检测效果国内资料竟然那么少,后在opencv的开发文档中找到了C++代码,在此分享学习交流。

实战 | OpenCV中更稳更快的找圆方法--EdgeDrawing使用演示(详细步骤 + 代码)_opencv 找圆_计算机视觉之家的博客-CSDN博客

OpenCV: EdgeDrawing

OpenCV: fld_lines.cpp文章来源地址https://www.toymoban.com/news/detail-782730.html

#include <iostream>

#include "opencv2/imgproc.hpp"
#include "opencv2/ximgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui.hpp"

using namespace std;
using namespace cv;
using namespace cv::ximgproc;

int main(int argc, char** argv)
{
    string in;
    CommandLineParser parser(argc, argv, "{@input|corridor.jpg|input image}{help h||show help message}");
    if (parser.has("help"))
    {
        parser.printMessage();
        return 0;
    }
    in = samples::findFile(parser.get<string>("@input"));

    Mat image = imread(in, IMREAD_GRAYSCALE);

    if( image.empty() )
    {
        return -1;
    }

    // Create FLD detector
    // Param               Default value   Description
    // length_threshold    10            - Segments shorter than this will be discarded
    // distance_threshold  1.41421356    - A point placed from a hypothesis line
    //                                     segment farther than this will be
    //                                     regarded as an outlier
    // canny_th1           50            - First threshold for
    //                                     hysteresis procedure in Canny()
    // canny_th2           50            - Second threshold for
    //                                     hysteresis procedure in Canny()
    // canny_aperture_size 3            - Aperturesize for the sobel operator in Canny().
    //                                     If zero, Canny() is not applied and the input
    //                                     image is taken as an edge image.
    // do_merge            false         - If true, incremental merging of segments
    //                                     will be performed
    int length_threshold = 10;
    float distance_threshold = 1.41421356f;
    double canny_th1 = 50.0;
    double canny_th2 = 50.0;
    int canny_aperture_size = 3;
    bool do_merge = false;
    Ptr<FastLineDetector> fld = createFastLineDetector(length_threshold,
            distance_threshold, canny_th1, canny_th2, canny_aperture_size,
            do_merge);
    vector<Vec4f> lines;

    // Because of some CPU's power strategy, it seems that the first running of
    // an algorithm takes much longer. So here we run the algorithm 10 times
    // to see the algorithm's processing time with sufficiently warmed-up
    // CPU performance.
    for (int run_count = 0; run_count < 5; run_count++) {
        double freq = getTickFrequency();
        lines.clear();
        int64 start = getTickCount();
        // Detect the lines with FLD
        fld->detect(image, lines);
        double duration_ms = double(getTickCount() - start) * 1000 / freq;
        cout << "Elapsed time for FLD " << duration_ms << " ms." << endl;
    }

    // Show found lines with FLD
    Mat line_image_fld(image);
    fld->drawSegments(line_image_fld, lines);
    imshow("FLD result", line_image_fld);

    waitKey(1);

    Ptr<EdgeDrawing> ed = createEdgeDrawing();
    ed->params.EdgeDetectionOperator = EdgeDrawing::SOBEL;
    ed->params.GradientThresholdValue = 38;
    ed->params.AnchorThresholdValue = 8;

    vector<Vec6d> ellipses;

    for (int run_count = 0; run_count < 5; run_count++) {
        double freq = getTickFrequency();
        lines.clear();
        int64 start = getTickCount();

        // Detect edges
        //you should call this before detectLines() and detectEllipses()
        ed->detectEdges(image);

        // Detect lines
        ed->detectLines(lines);
        double duration_ms = double(getTickCount() - start) * 1000 / freq;
        cout << "Elapsed time for EdgeDrawing detectLines " << duration_ms << " ms." << endl;

        start = getTickCount();
        // Detect circles and ellipses
        ed->detectEllipses(ellipses);
        duration_ms = double(getTickCount() - start) * 1000 / freq;
        cout << "Elapsed time for EdgeDrawing detectEllipses " << duration_ms << " ms." << endl;
    }

    Mat edge_image_ed = Mat::zeros(image.size(), CV_8UC3);
    vector<vector<Point> > segments = ed->getSegments();

    for (size_t i = 0; i < segments.size(); i++)
    {
        const Point* pts = &segments[i][0];
        int n = (int)segments[i].size();
        polylines(edge_image_ed, &pts, &n, 1, false, Scalar((rand() & 255), (rand() & 255), (rand() & 255)), 1);
    }

    imshow("EdgeDrawing detected edges", edge_image_ed);

    Mat line_image_ed(image);
    fld->drawSegments(line_image_ed, lines);

    // Draw circles and ellipses
    for (size_t i = 0; i < ellipses.size(); i++)
    {
        Point center((int)ellipses[i][0], (int)ellipses[i][1]);
        Size axes((int)ellipses[i][2] + (int)ellipses[i][3], (int)ellipses[i][2] + (int)ellipses[i][4]);
        double angle(ellipses[i][5]);
        Scalar color = ellipses[i][2] == 0 ? Scalar(255, 255, 0) : Scalar(0, 255, 0);

        ellipse(line_image_ed, center, axes, angle, 0, 360, color, 2, LINE_AA);
    }

    imshow("EdgeDrawing result", line_image_ed);
    waitKey();
    return 0;
}

到了这里,关于OpenCV中更稳更快的边缘检测方法,快速查找线、圆、椭圆--EdgeDrawing-C++代码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Spark+Celeborn:更快,更稳,更弹性

    摘要:本文整理自阿里云 EMR Spark 团队的周克勇(一锤),在 SparkDS Meetup 的分享。本篇内容主要分为三个部分: 传统 Shuffle 的问题 Apache Celeborn (Incubating)简介 Celeborn 在性能、稳定性、弹性上的设计 Apache Spark 是广为流行的大数据处理引擎,它有很多使用场景: Spark SQL、批处

    2024年02月12日
    浏览(39)
  • mosn基于延迟负载均衡算法 -- 走得更快,期待走得更稳

    这篇文章主要是介绍mosn在v1.5.0中新引入的基于延迟的负载均衡算法。 对分布式系统中延迟出现的原因进行剖析 介绍mosn都通过哪些方法来降低延迟 构建来与生产环境性能分布相近的测试用例来对算法进行验证 地址: https://github.com/mosn/mosn/pull/2253 在开始聊基于延迟的负载均衡

    2024年02月03日
    浏览(32)
  • 学习opencv.js之基本使用方法(读取,显示,灰度化,边缘检测,特征值点检测)

    OpenCV.js 是 OpenCV(Open Source Computer Vision Library)的 JavaScript 版本。OpenCV 是一个广泛使用的计算机视觉和图像处理库,提供了一系列功能强大的算法和工具,用于处理图像、视频、特征提取、对象识别等计算机视觉任务。 OpenCV.js 是将 OpenCV 库编译为 JavaScript 的版本,使得开发者

    2024年02月16日
    浏览(44)
  • 更快更稳的4K响应鼠标,小手玩家也能用,雷柏VT9PRO mini

    雷柏今年推出了不少新品,特别是一系列支持4K回报率的鼠标,凭借敏捷的响应速度,获得了非常好的评价。不过之前雷柏出的4K鼠标都多适合中大手,对小手用户不友好,而且配色较少,都是黑白色的基础款,选择比较有限。 最近雷柏推出了一款缩减机身尺寸的VT9PRO mini,更

    2024年01月20日
    浏览(35)
  • 《opencv实用探索·十二》opencv之laplacian(拉普拉斯)边缘检测,Scharr边缘检测,Log边缘检测

    1、Laplacian算子 Laplacian(拉普拉斯)算子是一种二阶导数算子,其具有旋转不变性,可以满足不同方向的图像边缘锐化(边缘检测)的要求。同时,在图像边缘处理中,二阶微分的边缘定位能力更强,锐化效果更好,因此在进行图像边缘处理时,直接采用二阶微分算子而不使

    2024年04月10日
    浏览(40)
  • 《opencv实用探索·十一》opencv之Prewitt算子边缘检测,Roberts算子边缘检测和Sobel算子边缘检测

    1、前言 边缘检测: 图像边缘检测是指在图像中寻找灰度、颜色、纹理等变化比较剧烈的区域,它们可能代表着物体之间的边界或物体内部的特征。边缘检测是图像处理中的一项基本操作,可以用于人脸识别、物体识别、图像分割等多个领域。 边缘检测实质上是计算当前点和

    2024年02月22日
    浏览(54)
  • 【OpenCV--边缘检测】

    目录 一、边缘检测概念 二、Sobel算子 1.描述: 2.方法: 3.Sobel算子的应用:  三、Laplacian算子 1.描述: 2.应用: 四、Canny边缘检测 1.原理: 2.应用: 1.边缘检测是图像处理和计算机视觉中的基本问题,边缘检测的目的是标识数字图像中亮度变化明显的点,往往以轮廓的形式表

    2024年02月01日
    浏览(42)
  • opencv#34 边缘检测(二)

    前面介绍的Sobel算子和Scharr算子存在的问题: 1.要分别计算两个方向(x,y)的边缘,之后将两方向的边缘进行叠加。 2.边缘与方向相关性较大。当我们通过Sobel算子提取x方向检测时,它所能够检测到的边缘都是一个沿着y轴方向的边缘,与检测的方向相反(垂直方向),当进行y方向

    2024年01月25日
    浏览(32)
  • opencv#33 边缘检测

         图像的每一行每一列都可以看成是一个连续的信号经过离散后得到的数值,例如上图左侧给出的图像由黑色到白色的一个信号,也就是图像中某一行像素变化是由黑色逐渐到白色,我们将其对应在一个坐标轴中,将像素值的大小对应与我们y轴,我们可以得到中间图片的

    2024年01月25日
    浏览(33)
  • OpenCV——Scharr边缘检测

    OpenCV——Scharr边缘检测由CSDN点云侠原创,爬虫自重。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。    Scharr边缘检测算法是对Sobel算子差异性的增强,因此两者在检测图像边缘的原理和使用方式上相同。Scharr算子的边缘检测滤波尺寸为3x3,因此也

    2024年01月23日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包