20.java openCV4.x 入门-Imgproc之点集拟合

专栏简介

💒个人主页
📖心灵鸡汤📖

我们唯一拥有的就是今天,唯一能把握的也是今天


建议把本文当作笔记来看,据说专栏目录里面有相应视频🤫
📰专栏目录

Imgproc之点集拟合

  • 一、拟合直线
    • 1.字段
    • 2.方法说明
  • 二、拟合椭圆
    • 1.最佳拟合
    • 2.最小面积拟合

一、拟合直线

1.字段

列举部分,更多请查看官方文档。

DIST_L1 这是L1距离度量。它计算两点之间的绝对差值之和
DIST_L12这是加权L1距离度量。它结合了L1和L2距离的特性
DIST_L2这是欧几里得距离,也就是L2距离度量。它计算两点之间的平方差之和的平方根

2.方法说明

1.拟合给定点集的直线

fitLine(Mat points, Mat line, int distType, double param, double reps, double aeps)
参数:
points 输入的2D或3D点向量
line输出参数,表示拟合得到的直线的参数。在2D拟合的情况下,它应该是一个4个元素的向量(如Vec4f) - (vx,vy,x0,y0),其中(vx,vy)是与直线共线的归一化向量,(x0,y0)是直线上的点。在3D拟合的情况下,它应该是一个6个元素的向量(如Vec6f) - (vx,vy,vz,x0,y0,z0),其中(vx,vy,vz)是与直线共线的归一化向量,(x0,y0,z0)是直线上的点
distType 距离度量方式,用于M估计。参见DIST_*
param 可选参数,对于某些距离类型,它表示数值参数C。如果为0,则选择最优值
reps 足够精度下的半径(坐标原点到直线的距离)
aeps 对于角度的足够精度。对于reps和aeps,0.01是一个不错的默认值
拟合给定点集的直线.

请添加图片描述

根据自身需求选择合适的距离计算类型,此处仅给出使用示例

       //创建矩阵Mat mat = new Mat(300,300, CvType.CV_8UC3);mat.setTo(new Scalar(255,255,255));//创建点集MatOfPoint points = new MatOfPoint();points.fromArray(new Point(30,30),new Point(55,30),new Point(110,88),new Point(150,200),new Point(100,250));Mat line = new Mat();//拟合直线Imgproc.fitLine(points,line,Imgproc.DIST_L1,0,0.01,0.01);//获取拟合结果double vx = line.get(0, 0)[0];double vy = line.get(1, 0)[0];double x = line.get(2, 0)[0];double y = line.get(3, 0)[0];System.out.println("line.dump() = \n" + line.dump());//绘制点集for (Point point : points.toArray()) {Imgproc.circle(mat,point,2,new Scalar(0,0,255),-1,Imgproc.LINE_AA);}//根据拟合结果绘制直线Point p1 = new Point(x,y);Point p2 = new Point(x+200*vx,y+200*vy);Imgproc.line(mat,p1,p2,new Scalar(255,0,0),2);HighGui.imshow("mat",mat);HighGui.waitKey();

结果:

请添加图片描述

二、拟合椭圆

1.最佳拟合

该函数的作用是在给定的2D点集上找到一个最佳拟合的旋转椭圆,并返回表示该椭圆的 RotatedRect 对象

fitEllipse(MatOfPoint2f points)
参数:
points 一个包含2D点的 MatOfPoint2f 对象
public static void main(String[] args) {// 创建一个二维点集MatOfPoint2f points = new MatOfPoint2f(new Point(100, 50),new Point(150, 100),new Point(200, 50),new Point(150, 0),new Point(100, 50));// 调用fitEllipse方法拟合椭圆RotatedRect rotatedRect = Imgproc.fitEllipse(points);// 打印拟合的椭圆信息System.out.println("Center: " + rotatedRect.center);System.out.println("Size: " + rotatedRect.size);System.out.println("Angle: " + rotatedRect.angle);}

请自行绘制查看结果

fitEllipseDirect​(Mat points)
参数:
points 一个包含2D点的 MatOfPoint2f 对象

这里使用了由 Fitzgibbon1999 提出的直接最小二乘法(Direct)算法

public static void main(String[] args) {// 假设有一组点集合,这里只是举例,实际应用中需要替换为真实数据Point[] pointsArray = {new Point(100, 50),new Point(150, 100),new Point(200, 50),new Point(150, 0),new Point(100, 50)};MatOfPoint points = new MatOfPoint(pointsArray);// 调用 fitEllipseAMS 方法拟合椭圆RotatedRect rotatedRect = Imgproc.fitEllipseDirect(points);// 输出椭圆的信息System.out.println("Center: " + rotatedRect.center);System.out.println("Size: " + rotatedRect.size);System.out.println("Angle: " + rotatedRect.angle);//绘制Mat mat = new Mat(300,300, CvType.CV_8UC3,new Scalar(255,255,255));List pts = new ArrayList<>();pts.add(points);Imgproc.polylines(mat,pts,true,new Scalar(255,0,0));Imgproc.ellipse(mat,rotatedRect,new Scalar(0,255,0));//显示HighGui.imshow("mat",mat);HighGui.waitKey(0);HighGui.destroyAllWindows();}

2.最小面积拟合

fitEllipseAMS根据输入的点集拟合出一个最小面积的椭圆,采用 AMS (Algebraic Method) 算法. 该函数支持更多类型的points

fitEllipse(MatOfPoint2f points)
参数:
points 输入的点坐标集合
        // 假设有一组点集合,这里只是举例,实际应用中需要替换为真实数据Point[] pointsArray = {new Point(100, 50),new Point(150, 100),new Point(200, 50),new Point(150, 0),new Point(100, 50)};MatOfPoint points = new MatOfPoint(pointsArray);// 调用 fitEllipseAMS 方法拟合椭圆RotatedRect rotatedRect = Imgproc.fitEllipseAMS(points);// 输出椭圆的信息System.out.println("Center: " + rotatedRect.center);System.out.println("Size: " + rotatedRect.size);System.out.println("Angle: " + rotatedRect.angle);//绘制Mat mat = new Mat(300,300,CvType.CV_8UC3,new Scalar(255,255,255));List pts = new ArrayList<>();pts.add(points);Imgproc.polylines(mat,pts,true,new Scalar(255,0,0));Imgproc.ellipse(mat,rotatedRect,new Scalar(0,255,0));//显示HighGui.imshow("mat",mat);HighGui.waitKey(0);HighGui.destroyAllWindows();
万水千山总是情,本栏完全公开免费。点赞+收藏30,瞬更下一篇
上一篇:Imgproc之图形绘制 下一篇: Imgproc之图像阈值化

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

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

相关文章

Android11应用安装未知来源的权限改动

最近开发的App需要下载安装另一个App。这就涉及到了app的安装代码。关于App的安装代码&#xff0c;写了不少&#xff0c;所以这一块觉得不是问题&#xff1a; 判断版本&#xff0c;Android8.0判断是否有未知来源安装全选&#xff0c;没有则打开未知来源安装权限设置界面去开启…

【团体程序设计天梯赛 往年关键真题 详细分析完整AC代码】L2-001 紧急救援(最短路+路径打印) L2-002 链表去重(模拟链表)

L2-001 紧急救援 最短路路径打印 作为一个城市的应急救援队伍的负责人&#xff0c;你有一张特殊的全国地图。在地图上显示有多个分散的城市和一些连接城市的快速道路。每个城市的救援队数量和每一条连接两个城市的快速道路长度都标在地图上。当其他城市有紧急求助电话给你的时…

C语言:文件操作(三)

目录 前言 5、文章的随机读写 5.1 fseek 5.2 ftell 5.3 rewind 结语 前言 本篇文章继续讲解文件操作&#xff0c;讲解文件的随机读写&#xff0c;主要有三个函数&#xff1a;fseek&#xff1b;ftell&#xff1b;rewind。 前面讲解的函数都是对文件内容进行顺序读写&#x…

win10 64位装三菱PLC软件出现oleaut32.dll拒绝访问

win10 64位装 三菱PLC软件GX works2出现以下情况&#xff1a;以下文件没有自注册或撤消注册 c:/Windows/SysWOW64/oleaut32.dll拒绝访问 经过百度说是兼容问题 解决方案&#xff1a;在安装包启动图标上右键-兼容性疑难解答-尝试建议的设置-测试程序。 点击测试程序后setup正常…

C/C++ C/C++ 入门(6)模板初阶

个人主页&#xff1a;仍有未知等待探索-CSDN博客 专题分栏&#xff1a;C 多多指教&#xff01; 一、泛型编程 在之前&#xff0c;我们进行编程的时候&#xff0c;总是针对于某一个具体的问题。就比如说&#xff0c;如何实现一个int类型的swap函数呢&#xff1f;大家肯定会写。…

【计算机网络】常用编码方式+例题(曼彻斯特编码、差分曼彻斯特编码...)

常用编码方式例题 常用编码方式练习画出四种编码20221题342015题342013题34 常用编码方式 练习 画出四种编码 20221题34 这个题目的考察是差分曼彻斯特编码。 差分曼彻斯特编码在每个码元的中间时刻电平都会发生跳变。与曼彻斯特编码不同的是&#xff1a;电平的跳变仅代表时钟…

【随笔】Git 基础篇 -- 拉取数据 git pull(二十八)

&#x1f48c; 所属专栏&#xff1a;【Git】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &#x1f496; 欢迎大…

2024全网最全的Postman接口自动化测试!

| 背景 该篇文章针对已经掌握 Postman 基本用法的读者&#xff0c;即对接口相关概念有一定了解、已经会使用 Postman 进行模拟请求的操作。 当前环境&#xff1a; Window 7 - 64 Postman 版本&#xff08;免费版&#xff09;&#xff1a;Chrome App v5.5.3 不同版本页面 U…

哪个品牌短袖穿着舒服?夏季舒适透气的五款短袖分享

近期很多地区的天气都开始变得热了&#xff0c;尤其是华南地区已经开始穿上短袖了。很多朋友都想选一些夏天穿的短袖&#xff0c;但是市面上的短袖品牌实在太多&#xff0c;看得大家眼花缭乱难以选择&#xff0c;而且还有不少质量差的短袖混杂在其中。 基于我对多个品牌的测评以…

[数据结构]—二叉树基本概念

1.树概念及结构 1.树的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff…

20240412-算法复习打卡day52||● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组

300.最长递增子序列 从前往后遍历即可 class Solution { public:int lengthOfLIS(vector<int>& nums) {if (nums.size() < 1) return nums.size();vector<int> dp(nums.size(), 1);int result 0;for (int i 1; i < nums.size(); i) {for (int j 0; …

适合 Python 入门的 8 款强大工具

Python是一种开源的编程语言&#xff0c;可用于Web编程、数据科学、人工智能以及许多科学应用。学习Python可以让程序员专注于解决问题&#xff0c;而不是语法。由于Python相对较小&#xff0c;且拥有各式各样的工具&#xff0c;因此比Java和C等语言更具优势&#xff0c;同时丰…

Fiddler工具的操作和功能时-----定位到步骤图(助力抓包)

前言&#xff1a; 继续上一篇&#xff0c;已经对fiddler的安装、配置和代理的问题进行了讲解&#xff1a; Fiddle配置代理&#xff0c;保手机模拟器访问外部网络-CSDN博客 本章&#xff0c;讲对一些fiddler的操作进行一系列讲解&#xff01;Fiddler作为一款网络调试工具&…

知道做到 一篇总结学习方法的笔记

元数据 [!abstract] 知道做到&#xff1a;跃迁式学习 书名&#xff1a; 知道做到&#xff1a;跃迁式学习作者&#xff1a; 彼得•霍林斯简介&#xff1a; 学习是改善你的生活环境、成为你想成为的人的关键。科学的方法能加速学习进程&#xff0c;让你事半功倍。技能、信息和能力…

攻防世界13-simple_php

13-simple_php <?php show_source(*__FILE__*);//高亮文件 include("config.php");//文件包含在内 $a$_GET[a];//获得a $b$_GET[b];//获得b if($a0 and $a){ //判断a是否满足条件echo $flag1; //满足就输出flag1 } if(is_numeric($b)){ //判断b的条件&#x…

yolov8目标检测 部署瑞芯微rk3588记录

1. 前置条件 本地电脑系统&#xff0c;ubuntu20.04 训练代码&#xff1a; 训练代码下载的ultralytics官方代码 SHA&#xff1a;6a2fddfb46aea45dd26cb060157d22cf14cd8c64 训练代码仅做数据修改&#xff0c;类别修改&#xff0c;代码结构未做任何修改 需要准备的代码&#…

AppleScript初体验,让你的mac实现自动化UI操作

AppleScript 简介 AppleScript是苹果公司开发的一种脚本语言&#xff0c;用于操作MacOS及其应用程序&#xff0c;在实现MacOS自动化工作方面非常给力。 我们可以使用AppleScript用来完成一些重复琐碎的工作&#xff0c;AppleScript具有简单自然的语法&#xff0c;另外系统也提…

【DM8】ET SQL性能分析工具

通过统计SQL每个操作符的时间花费&#xff0c;从而定位到有性能问题的操作&#xff0c;指导用户去优化。 开启ET工具 INI参数&#xff1a; ENABLE_MONITOR1 MONITOR_SQL_EXEC1 查看参数 select * FROM v$dm_ini WHERE PARA_NAMEMONITOR_SQL_EXEC;SELECT * FROM v$dm_ini WH…

系统学c#:1、基础准备(软件下载与安装)

一、Vs软件下载与安装 访问Visual Studio官方网站&#xff1a; https://visualstudio.microsoft.com/zh-hans/downloads 下载Visual Studio 运行exe文件&#xff0c;点击“继续” 初始文件安装完成后选择我们需要安装的项&#xff0c;并勾选好必要的单个组件&#xff0c;设…

【Java框架】Spring框架(二)——Spring基本核心(AOP)

目录 面向切面编程AOPAOP的目标&#xff1a;让我们可以“专心做事”专心做事专心做事解决方案1.0专心做事解决方案2.0蓝图 AOP应用场景AOP原理AOP相关术语术语理解 AOP案例实现前置/后置/异常/最终增强的配置实现1.依赖2.业务类3.日志类4.配置切入点表达式匹配规则举例 环绕增强…