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正常…

js中的节流与防抖功能

防抖功能直接上js代码 let timer; // 声明一个计时器变量// 点击抽奖事件 function even() {// 检查计时器是否存在&#xff0c;如果存在则清除if (timer) {clearTimeout(timer);}// 设定一个时间间隔&#xff0c;比如500毫秒const interval 500;// 设定一个定时器&#xff0…

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

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

Unity HDRP 2022 Release-Notes

&#x1f308;Unity HDRP 2022 Release-Notes 本文信息收集来自自动搜集工具&#x1f448; 版本更新内容2022.3.17HDRP: Fixed a culling result sharing issue between custom passes and the camera rendering them.(UUM-53945)2022.3.17HDRP: Fixed Blackman-Harris filter…

2811: 【算法思想】【双指针】反转元音字符

题目描述 编写一个函数&#xff0c;该函数以字符串作为输入&#xff0c;并只反转字符串的元音,即将第一个元音字母与最后一个元音字母调换位置&#xff0c; 第二个元音字母与倒数第二个元音字母调换位置....... &#xff08;注意&#xff1a;元音字母包括a e i o u &#xf…

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

常用编码方式例题 常用编码方式练习画出四种编码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…

java中整数的取反~

从现代计算机中所有的数据二进制的形式存储在设备中。即 0、1 两种状态&#xff0c;计算机对二进制数据进行的运算(、-、*、/)都是叫位运算&#xff0c;即将符号位共同参与运算的运算。 按位取反运算符~&#xff1a; 运算符的功能是对其操作数进行按位取反。0变1&#xff0c;1…

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

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

python-pytorch实现lstm模型预测中文文本输出0.1.02

python-pytorch实现lstm模型预测中文文本输出0.1.02 数据参考效果分词到数组获取word2index和word2index查看频次获取vacab生成训练数据训练测试连续预测 记录 2024年4月14日15:36:28----0.1.02 有问题还需要完善&#xff0c;会重复生成一句话 数据 一篇新闻&#xff1a;http…

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

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; …

VS 2022部署HoloLens2 error: DEP0600: Deployment failed

一、报错信息 VS 2022 HoloLens 2 Deploy error: DEP0600: Deployment failed. Failed to deploy through new deployment pipeline 二、其它情况说明 1、设备和电脑处于同一网关&#xff0c;且已经联网 2、电脑从web可以访问HoloLens2设备 三、治病方法 在holoLens2上&am…

优秀文章收藏

&#xff08;一&#xff09;DirectUI 作者 Bjarke Viksoe 个人网站&#xff1a; DirectUI 作者 Bjarke Viksoe 个人网站&#xff1a;viksoe.dk - viksoe.dk 比较著名的文章&#xff0c;DirectUI思想做的一个程序&#xff1a;viksoe.dk - UI: Become windowless 还有一个自己…

Flutter问题:本地第三方库与pubspec.lock中的版本不同

问题前景&#xff1a; 不知道为什么flutter项目中的某几个包突然出现问题&#xff0c;提示出错&#xff0c;而本地第三方库与 pubspec.lock和pubspec.yaml 中的版本不同 搜索了一下&#xff0c;是因为我在添加这几个包时都在前面添加了 ^ 符 date_format: ^2.0.4 pubspec.lo…

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

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