最小二乘圆拟合-程序员宅基地

技术标签: OpenCV  

/***********************************************************************
int fit_circle(CvPoint* points, int num, double * A, double * B, double *R)
Function:polyfit circle
input parameter:
CvPoint* points
int num
double * A
double * B
double *R
output parameter:
0:    success
other:error
Date:2013.04.23
Author:LiuYaqiang
***********************************************************************/
int fit_circle(CvPoint* points, int num, double * A, double * B, double *R)
{
    int i;
    double X1, X2, X3, Y1, Y2, Y3, X1Y1, X1Y2, X2Y1;
    double C, D, E, G, H, N;
    double a, b,c;
    //拟合数据数量判断
    if (num < 3){
        printf("Error: fit data number is less than 3!\n");
        return -1;
    }


    X1 = X2 = X3 = Y1 = Y2 = Y3 = X1Y1 = X1Y2 = X2Y1 = 0;


    for (i = 0; i < num; i++){
        X1 = X1 + points[i].x;
        Y1 = Y1 + points[i].y;
        X2 = X2 + points[i].x * points[i].x;
        Y2 = Y2 + points[i].y * points[i].y;
        X3 = X3 + points[i].x * points[i].x*points[i].x;
        Y3 = Y3 + points[i].y * points[i].y*points[i].y;
        X1Y1 = X1Y1 + points[i].x * points[i].y;
        X1Y2 = X1Y2 + points[i].x * points[i].y*points[i].y;
        X2Y1 = X2Y1 + points[i].x * points[i].x*points[i].y;
    }


    N = num;
    C = N * X2 - X1 * X1;
    D = N * X1Y1 - X1 * Y1;
    E = N * X3 + N * X1Y2 - (X2 + Y2) * X1;
    G = N * Y2 - Y1 * Y1;
    H = N * X2Y1 + N * Y3 - (X2 + Y2) * Y1;


    a = (H * D-E * G) / (C * G - D * D);
    b = (H * C - E * D) / (D * D - G * C);
    c = -(a * X1 + b * Y1 + X2 + Y2)/N;


    *A = a / (-2);
    *B = b / (-2);
    *R = sqrt(a * a + b * b - 4 * c) / 2;
//printf("End:a=%f\tb=%f\tc=%f\n",a,b,c);
    return 0;
}
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/gududeyhc/article/details/8967658

智能推荐

leetcode-829-程序员宅基地

文章浏览阅读212次。题目描述:给定一个正整数 N,试求有多少组连续正整数满足所有数字之和为 N?首先,刚开始读错题目了,以为是子集和就行,后来发现是连续子集;想到用子集树,但是超时了class Solution: def consecutiveNumbersSum(self, N: int) -> int: self.res = 0 nums = ..._leetcode qian 400 timu

STM32内存结构介绍,FreeRTOS内存分配技巧,Stack_Size和Heap_Size大小设置-程序员宅基地

文章浏览阅读1.5w次,点赞56次,收藏283次。STM32内存结构介绍和FreeRTOS内存分配技巧这是我第一次使用FreeRTOS构建STM32的项目,踩了好些坑,又发现了我缺乏对于操作系统的内存及其空间的分配的知识,故写下文档记录学习成果。文章最后要解决的问题是,如何恰当地分配FreeRTOS中的堆、任务栈的空间。但是在概念的理解上,也需要知道STM32内存的相关知识。所以首先大致介绍一下STM32的内存结构。STM32内存结构STM32的数据在物理上分别储存在RAM和Flash中。RAM可读可写,掉电清零。Flash可读可写,但是读写时间很_heap_size

【数据库】密级,视图机制,审计(第四章例题_2)_对删除sc表结构或删除sc表数据的操作进行审计-程序员宅基地

文章浏览阅读493次。敏感度标记(Label) 对于主体和客体,DBMS为它们每个实例(值)指派一个敏感度标记(Label) 敏感度标记分成若干级别绝密(Top Secret,TS)机密(Secret,S)可信(Confidential,C)公开(Public,P)TS>=S>=C>=P主体的敏感度标记称为许可证级别(Clearance Level)客体的敏感度标记称为密级(Classification Level)规则:主体(操作者)的密级别=客体的密集时,可读可写。主体>客体_对删除sc表结构或删除sc表数据的操作进行审计

有序链表的交集_有序链表的交集调用函数-程序员宅基地

文章浏览阅读1.3k次。已知两个非降序链表序列S1与S2,设计函数构造出S1与S2的交集新链表S3。输入格式说明:输入分2行,分别在每行给出由若干个正整数构成的非降序序列,用-1表示序列的结尾(-1不属于这个序列)。数字用空格间隔。输出格式说明:在一行中输出两个输入序列的交集序列,数字间用空格分开,结尾不能有多余空格;若新链表为空,输出“NULL”。样例输入与输出:_有序链表的交集调用函数

java重定向和请求转发区别_java重定向和转发的区别-程序员宅基地

文章浏览阅读1.9k次,点赞5次,收藏11次。请求转发:request.getRequestDispatcher().forward();重定向:response.sendRedirect();例如:请求转发:request.getRequestDispatcher("/student_list.jsp").forward(request,response);重定向:response.sendRedirect(request.getContextPath + "/student_list.jsp")转发过.._java重定向和转发的区别

html背景向四周散开,纯css3圆形从中心向四周扩散动画-程序员宅基地

文章浏览阅读1.1k次。查看效果:http://hovertree.com/texiao/css3/37/以下为讲解和代码。可以通过 @keyframes 规则,创建动画。创建动画的原理是,将一套 CSS 样式逐渐变化为另一套样式。在动画过程中,您能够多次改变这套 CSS 样式。以百分比来规定改变发生的时间,或者通过关键词 "from" 和 "to",等价于 0% 和 100%。0% 是动画的开始时间,100% 动画的结..._css3 背景扩散效果

随便推点

Wireshark数据抓包分析——网络协议篇-程序员宅基地

文章浏览阅读270次。Wireshark数据抓包分析——网络协议篇 Wireshark是眼下最受欢迎的抓包工具。它能够执行在Windows、Linux及MAC OS X操作系统中,并提供了友好的图形界面。同一时候,Wireshark提供功能强大的数据抓包功能。使用它。能够以各种方式抓取用户所须要的网络数据包。..._分析五条不同类型的wireshark抓包行分析是什么网络应用

GPS系统跟踪捕获算法的Verilog实现_gps的ca码设计与相关verilog程序-程序员宅基地

文章浏览阅读4.1k次。GPS系统跟踪捕获算法_gps的ca码设计与相关verilog程序

苹果 macOS Sonoma 14 开发者预览版 Beta 3 发布_mac os sonoma最新版本-程序员宅基地

文章浏览阅读81次。苹果今日向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 3 更新。但是并未发现 macOS 14 Sonoma 的第三个开发者测试版的新功能,且更新日志和 Beta 2 类似。_mac os sonoma最新版本

ES6-17【类、类的继承、类的实现、类的修饰】_es6 类修饰 详解-程序员宅基地

文章浏览阅读270次。一.类(1).基础最简单的定义方式class Person{}log(new Person());//Person{}log(typeof Person);function标准写法class Person{ constructor(name = "zhangsan",age = "18"){ //私有属性 this.name = name; this.age = age; } //公有属性 _es6 类修饰 详解

Java 常用类 03 可变字符串和BigDecimal(BigInteger)_java字符串和bigdecimal类-程序员宅基地

文章浏览阅读335次。3.1 可变字符串和BigDecimal3.1.1 可变字符串由于我们的字符串,是不可变的。每次都要在 字符串池里 新建和共享。这样效率很低,而且占用空间大。我们的 Java 就开发了 可变字符串下面的两者,都比传统的 String 类型要快很多。① StringBuffer:JDK1.0提供的,效率低,线程安全。它是实现开辟一个缓冲区,然后操作的时候,直接在 缓冲区里进行操作。② StringBuilder:JDK5.0提供的,效率高,线程不安全3.1.2 StringBuffer①_java字符串和bigdecimal类

【基于FPGA的芯片设计】32×32位寄存器堆_fpga2s需要多少位寄存器-程序员宅基地

文章浏览阅读2.6k次,点赞9次,收藏2次。32×32位寄存器堆设计,杭电计算机组成原理实验四,实验的开发工具是vivado2018,vivado2022也兼容2018_fpga2s需要多少位寄存器

推荐文章

热门文章

相关标签