OpenCV(三十七):拟合直线、三角形和圆形

news2024/11/20 9:30:00

1.点集拟合的含义

       点集拟合是一种通过拟合函数或曲线来近似描述给定离散数据点的技术,在点集拟合中,可以使用不同的函数或曲线拟合方法来拟合直线、三角形和圆形。

直线拟合:对于给定的二维数据点集合,可以使用最小二乘法来拟合一条直线。

三角形拟合: 对于给定的二维或三维数据点集合,可以使用三角形拟合方法来找到尽可能逼近数据点的最佳三角形。

圆形拟合: 对于给定的二维数据点集合,可以使用圆形拟合方法来找到与数据点分布最佳匹配的圆。

2.拟合直线的函数fitLine()

void cv::fitLine ( InputArray   points,

OutputArray line,

int  distType,

double   param,

double    reps,

double     aeps

)

  • points:输入待拟合直线的2D或者3D点集。
  • line:输出描述直线的参数,2D点集描述参数为Vec4f类型,3D点集描述参数为Vec6f类型distType:M-estimator算法使用的距离类型标志。
  • param:某些类型距离的数值参数(C)。如果数值为0,则自动选择最佳值。
  • reps: 坐标原点与直线之间的距离精度,数值0表示选择自适应参数,一般常选择0.01
  • aeps:直线角度精度,数值0表示选择自适应参数,一般常选择0.01。

距离类型选择标志

示例代码:

 //直线拟合
    Vec4f lines;//存放拟合后的直线
    vector<Point2f> point;//待检测是否存在直线的所有点
    const static float Points[20][2]={
            {0.0f,0.0f},{10.0f,11.0f},{21.0f,20.0f},{30.0f,30.0f},
            {40.0f,42.0f},{50.0f,50.0f},{60.0f,60.0f},{70.0f,70.0f},
            {80.0f,80.0f},{90.0f,92.0f},{100.0f,100.0f},{110.0f,110.0f},
            {120.0f,120.0f},{136.0f,130.0f},{138.0f,140.0f},{150.0f,150.0f},
            {160.0f,163.0f},{175.0f,170.0f},{181.0f,180.0f},{200.0f,190.0f},
    };
    //将所有点存放在vector中,用于输入函数中
    for(int i=0;i<20;i++){
        point.push_back(Point2f(Points[i][0],Points[i][1]));
    }
    //参数设置
    double param=0;//距离模型中的数值参数C
    double reps=0.01;//坐标原点与直线之间的距离精度
    double aeps=0.01;//角度精度
    fitLine(point,lines,DIST_L1,0,0.01,0.01);
    double k=lines[1]/lines[0];//直线斜率
    ostringstream ss;
    ss<<"直线效率:"<<k<<endl;
    ss<<"直线上一点坐标x:"<<lines[2]<<",y:"<<lines[3]<<endl;
    ss<<"直线解析式:y="<<k<<"(x-"<<lines[2]<<")+"<<lines[3]<<endl;
    LOGD("%s",ss.str().c_str());

运行结果:

3.拟合三角形的函数 minEnclosingTriangle()

double cv::minEnclosingTriangle ( InputArray points,OutputArray triangle)

  • points:待寻找包围三角形的2D点集
  • triangle:拟合出的三角形三个顶点坐标

4.拟合三角形的函数 minEnclosingTriangle()

minEnclosingCircle()

void cv::minEnclosingCircle ( InputArray points,

Point2f &center,

float &radius

  • points:待寻找包围圆形的2D点集
  • center:圆形的圆心。
  • radius:圆形的半径

拟合三角形和圆形的示例代码:

//点集拟合
void Point_set_fitting(){
  
    Mat img(500,500,CV_8UC3,Scalar::all(0));
    RNG &rng=theRNG();

    int i,count=rng.uniform(1,101);
    vector<Point> points;
    //生成随机点
    for(i=0;i<count;i++){
            Point  pt;
            pt.x=rng.uniform(img.cols/4,img.cols*3/4);
            pt.y=rng.uniform(img.rows/4,img.rows*3/4);
            points.push_back(pt);
    }
    //寻找包围点集的三角形
    vector<Point2f> triangle;
    double area= minEnclosingTriangle(points,triangle);
    //寻找包围点集的圆形
    Point2f center;
    float radius=0;
    minEnclosingCircle(points,center,radius);

    //创建两个图片用于输出结果
    img=Scalar ::all(0);
    Mat img2;
    img.copyTo(img2);
    //在图像中绘制坐标点
    for(i=0;i<count;i++){
        circle(img,points[i],3,Scalar(255,255,255),FILLED,LINE_AA);
        circle(img2,points[i],3,Scalar(255,255,255),FILLED,LINE_AA);
    }
    //绘制三角形
    for(i=0;i<3;i++){
        if(i==2){
            line(img,triangle[i],triangle[0],Scalar(255,255,255),1,16);
            break;
        }
        line(img,triangle[i],triangle[i+1],Scalar(255,255,255),1,16);
    }
    //绘制圆形
    circle(img2,center, cvRound(radius),Scalar(255,255,255),1,LINE_AA);

    //显示图像
    imwrite("/sdcard/DCIM/img.png",img);
    imwrite("/sdcard/DCIM/img2.png",img2);

}

三角形拟合的结果:

圆形拟合的结果:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1000818.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

springboot之三:原理分析之自动配置condition

导入&#xff1a; SpringBoot是如何知道要创建哪个Bean的&#xff1f;比如Spring Boot是如何知道要创建RedisTemplate的&#xff1f; Condition&#xff1a; Condition是在Spring4.0增加的条件判断功能&#xff0c;通过这个可以实现选择性的创建Bean操作。 自定义条件&…

C++之string::npos应用实例(一百九十三)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

使用IDEA创建Vue3通过Vite实现工程化

1、创建Vite项目的分步说明 IntelliJ IDEA与Vite构建工具集成&#xff0c;改善了前端开发体验。Vite 由一个开发服务器和一个构建命令组成。构建服务器通过本机 ES 模块提供源文件。生成命令将代码与汇总捆绑在一起&#xff0c;汇总预配置为输出高度优化的静态资产以供生产。In…

AI绘画:Midjourney超详细教程Al表情包超简单制作,内附关键词和变现方式

大家好&#xff0c;本篇文章主要介绍AI绘画完成表情包的制作和变现方式分享。 你还不会AI表情包制作吗&#xff1f;下面我们详细的拆解制作过程。跟着这个教程做出一套属于自己的表情包。 核心工具Midjourney PS&#xff0c;你就可以得到一套自己的专属表情包啦~ 整体制作…

Go 基础15-在init()函数中检查包级变量的初始状态

从程序逻辑结构角度来看&#xff0c;包&#xff08;package&#xff09;是Go程序逻辑封装的基本单元&#xff0c;每个包都可以理解为一个“自治”的、封装良好的、对外部暴露有限接口的基本单元。一个Go程序就是由一组包组成的。 在Go包这一基本单元中分布着常量、包级变量、函…

胡焕庸线,我国东西地级市分布密度分界线

背景 黑河—腾冲线&#xff0c;又名胡焕庸线&#xff0c;是我国人口密度分布的东西近似分界线。今天把地级市坐标分布密度做成热力图&#xff0c;并与胡焕庸线一起展示时&#xff0c;惊奇的发现&#xff0c;胡焕庸线貌似也是我车东西地级市分布密度的分界线。 生成folium地图…

【17 > 分布式接口幂等性】2. Update的幂等性原理解析

一、 根据 唯一业务号去更新 数据的情况 1.1 原理 1.2 操作 1.3 实战 Stage 1&#xff1a;表添加 version 字段 Stage 2&#xff1a;前端 > 版本号放入隐藏域 Stage 3&#xff1a;后台 > 使用版本号作为更新条件 二、更新操作没有唯一业务号&#xff0c;可使用Tok…

FL Studio Producer Edition 21.0.3.3713中文完整破解版功能特点及安装激活教程

FL Studio Producer Edition 21.0.3.3713中文完整破解版是一款由Image Line公司研发几近完美的虚拟音乐工作站,同时也是知名的音乐制作软件。它让你的计算机就像是全功能的录音室&#xff0c;漂亮的大混音盘&#xff0c;先进的创作工具&#xff0c;让你的音乐突破想象力的限制。…

4.2 Ioc容器加载过程-Bean的生命周期深度剖析

Bean生命周期详解 第一步拿到父类BeanFactory子类 第二步&#xff0c;读取配置类 AnnotatedBeanDefinitionReader 用来读取配置类之外和还做了 第一个是解析类的处理器&#xff0c;没有的话我们的配置类就无法解析 总结this()无参构造函数里面实现了【三大步】 实例…

九安监控初始化后恢复案例

九安监控是国内一个十六线小安防品牌&#xff0c;目前CHS零壹视频恢复程序监控版、专业版、高级版是支持这个安防品牌的&#xff0c;不过下边这个案例比较特殊&#xff0c;具体情况如下。 故障存储:希捷4T监控专用硬盘 故障现象: 客户描述是使用了初始化操作&#xff0c;正常…

Linux中防火墙的简单使用方法

目录 前言 一、概念 1、防火墙的分类&#xff1a; 2、防火墙性能 3、硬件防火墙的品牌、软件防火墙的品牌 4、硬件防火墙与软件防火墙比较 二、linux中的防火墙 1、iptables 2.netfilter/iptables功能 3、四表 iptables中表的优先级 4、五链 三、iptables 1、ipt…

YOLO DNF辅助教程完结

课程完结&#xff01;撒花、撒花、撒花 课程完结&#xff01;撒花、撒花、撒花 课程完结&#xff01;撒花、撒花、撒花 ​呕心沥血三个月&#xff0c;《利用人工智能做DNF游戏辅助》系列实战课程已完结&#xff0c;技术路线贯穿串口通信、目标检测、opencv特征匹配等前沿技术…

计算机组装与维护实训室解决方案

一、产业背景 随着信息技术的不断发展&#xff0c;信息化已经深入到社会中各个层面&#xff0c;它能有效地帮助各个行业提高运营及管理效率&#xff0c;进而帮助企业成长。同时&#xff0c;作为企业信息化建设的基础部分&#xff0c;计算机已经融入了我们的生活&#xff0c;并逐…

【算法】一文带你从浅至深入门dp动态规划

文章目录 一、前言二、动态规划理论基础1、基本概念2、动态规划五部曲【✔】3、出错了如何排查&#xff1f; 三、实战演练&#x1f5e1;0x00 斐波那契数0x01 第N个泰波那契数0x02 爬楼梯0x03 三步问题0x04 使用最小花费爬楼梯⭐解法一解法二 0x05 解码方法* 四、总结与提炼 一、…

查看Android App包名,查看keystore的信息,导出公钥

查看Android App包名的三种方法 cmd中输入命令&#xff1a;adb shell am monitor 然后启动需要获取包名的应用cmd中输入命令&#xff1a;adb shell pm list packages -3 查看自己安装的app包名安卓系统中&#xff1a;设置——应用——正在运行 查看…

SQLI-labs-第七关

知识点&#xff1a;单引号&#xff08;&#xff09;加括号闭合错误的布尔盲注 思路&#xff1a; 寻找注入点 我们首先看一下正常的回显&#xff0c;并没有显示出什么明显的信息 输入?id1 发现报错 输入?id1 -- 还是报错&#xff0c;说明SQL语句的语法错误可能不是单引号闭合…

微信/QQ/TIM防撤回补丁

适用于 Windows 下 PC 版微信/QQ/TIM的防撤回补丁。支持最新版微信/QQ/TIM&#xff0c;其中微信能够选择安装多开功能。 下载地址&#xff1a; ⚡️点我下载最新版本 相关文档&#xff1a; ✔支持哪些版本 | ❓常见问题 | &#x1f4d6;查看完整文档 原理与方法&#xff1a; …

视频怎么转成漫画?分享些视频转漫画方法

在现代社会中&#xff0c;视频和漫画都是非常流行的媒介形式。而有时候&#xff0c;我们可能想将一些有趣的视频转化为漫画&#xff0c;以便在社交媒体上分享或进行其他用途。这篇文章将介绍几种视频转漫画的方法和注意事项。 使用转换工具 现在手机上有很多好用的工具&#x…

根据站点经纬度画全球分布图python

已知几个站点的经纬度,要求画出在全球的分布。 import pandas as pd import matplotlib.pyplot as plt import matplotlib as mpl import cartopy.crs as ccrs import cartopy.feature as cfeature from cartopy.mpl.ticker import LongitudeFormatter, LatitudeFormatter f…