随机抽样一致性算法(RANSAC)示例及源代码

2023-11-18

作者:王先荣

    大约在两年前翻译了《随机抽样一致性算法RANSAC》,在文章的最后承诺写该算法的C#示例程序。可惜光阴似箭,转眼许久才写出来,实在抱歉。本文将使用随机抽样一致性算法来来检测直线和圆,并提供源代码下载。

一、RANSAC检测流程

    在这里复述下RANSAC的检测流程,详细的过程见上一篇翻译文章:

    RANSAC算法的输入是一组观测数据,一个可以解释或者适应于观测数据的参数化模型,一些可信的参数。

    RANSAC通过反复选择数据中的一组随机子集来达成目标。被选取的子集被假设为局内点,并用下述方法进行验证:
    1.有一个模型适应于假设的局内点,即所有的未知参数都能从假设的局内点计算得出。
    2.用1中得到的模型去测试所有的其它数据,如果某个点适用于估计的模型,认为它也是局内点。
    3.如果有足够多的点被归类为假设的局内点,那么估计的模型就足够合理。
    4.然后,用所有假设的局内点去重新估计模型,因为它仅仅被初始的假设局内点估计过。
    5.最后,通过估计局内点与模型的错误率来评估模型。
    这个过程被重复执行固定的次数,每次产生的模型要么因为局内点太少而被舍弃,要么因为比现有的模型更好而被选用。

二、得到观测数据

    我们没有实验(测试)数据,这里用手工输入的数据来替代——记录您在PictureBox中的点击坐标,作为观测数据。

        /// <summary>
        /// 得到样本点
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void pbSample_Click(object sender, EventArgs e)
        {
            MouseEventArgs me=(MouseEventArgs)e;
            txtRandomPoints.Text += string.Format("({0},{1}),", me.X, me.Y);
            DrawPoint(new Point(me.X, me.Y));
        }
得到样本点

 

三、检测直线

    3.1 直线的相关知识

    (1)平面上的任意两点可以确定一条直线;

    (2)直线的通用数学表达形式为:ax+by+c=0。这种表达形式有三个未知数,需要提供三个点才能解出a,b,c三个参数。由于随机选择的三个点不一定在一条直线上,所以程序中放弃这种方式。

    (3)直线可以用y=ax+b及x=c这两个式子来表示。这两种形式只有一个或者两个未知数,只需两个点就能解出a,b,c三个参数。随机选择的两个点即可得到直线,我们采用这种形式。

    3.2 直线类

    直线类(Line)封装了跟直线相关的一些属性及方法,列表如下:

    (1)属性

    A——y=ax+b中的a

    B——y=ax+b中的b

    C——x=c中的c

    (2)构造函数

    public Line(PointF p1, PointF p2)

    提供两个点p1及p2,计算出直线的属性A,B,C。

    (3)方法

    GetDistance——获取点到直线之间的距离;

    GetY——根据x坐标,获取直线上点的y坐标;

    ToString——获取直线的方程式。

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace Ransac
{
    /// <summary>
    /// 直线类:采用y=a*x+b或者x=c的形式表示直线。
    /// </summary>
    public class Line
    {
        /// <summary>
        /// y=ax+b中的a
        /// </summary>
        public double A { get; set; }
        /// <summary>
        /// y=ax+b中的b
        /// </summary>
        public double B { get; set; }
        /// <summary>
        /// x=c中的c
        /// </summary>
        public double C { get; set; }
        
        /// <summary>
        /// 构造函数(如果直线为y=ax+b形式,则C为Nan;如果直线为x=c形式,则A和B为Nan)
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="c"></param>
        public Line(double a, double b, double c)
        {
            if (!((double.IsNaN(a) && double.IsNaN(b) && !double.IsNaN(c)) || (!double.IsNaN(a) && !double.IsNaN(b) && double.IsNaN(c))))
                throw new ArgumentException("参数错误,无效的直线参数。");
            A = a;
            B = b;
            C = c;
        }

        /// <summary>
        /// 构造函数,由两个点确定直线
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        public Line(PointF p1, PointF p2)
        {
            if (p1.X == p2.X)
            {
                A = double.NaN;
                B = double.NaN;
                C = p1.X;
            }
            else
            {
                A = 1d * (p1.Y - p2.Y) / (p1.X - p2.X);
                B = p1.Y - A * p1.X;
                C = double.NaN;
            }
        }

        /// <summary>
        /// 构造函数,由两个点确定直线
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        public Line(Point p1, Point p2) :
            this(new PointF(p1.X, p1.Y), new PointF(p2.X, p2.Y))
        {
        }

        /// <summary>
        /// 生成一条随机的直线
        /// </summary>
        /// <returns></returns>
        public static Line GetRandomLine()
        {
            Random random = new Random();
            int a = random.Next(-10, 10);
            int b = random.Next(-10, 10);
            return new Line(a, b, double.NaN);
        }

        /// <summary>
        /// 获取点到直线的距离
        /// </summary>
        /// <param name="p"></param>
        /// <returns>返回点到直线的距离;如果直线通过点,返回0。</returns>
        public double GetDistance(Point p)
        {
            return GetDistance(new PointF(p.X, p.Y));
        }

        /// <summary>
        /// 获取点到直线的距离
        /// </summary>
        /// <param name="p"></param>
        /// <returns>返回点到直线的距离;如果直线通过点,返回0。</returns>
        public double GetDistance(PointF p)
        {
            double d = 0d;
            if (double.IsNaN(C))
            {
                //y=ax+b相当于ax-y+b=0
                d = Math.Abs(1d * (A * p.X - p.Y + B) / Math.Sqrt(A * A + 1));
            }
            else
            {
                d = Math.Abs(C - p.X);
            }
            return d;
        }

        /// <summary>
        /// 根据x坐标,得到直线上点的y坐标 
        /// </summary>
        /// <param name="x"></param>
        /// <returns></returns>
        public double GetY(double x)
        {
            double y;
            if (double.IsNaN(C))
                y = A * x + B;
            else
                y = double.NaN;
            return y;
        }

        /// <summary>
        /// 返回直线方程
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            string formula = "";
            if (double.IsNaN(C))
                formula = string.Format("y={0}{1}", A != 0 ? string.Format("{0:F02}x", A) : "", B != 0 ? (B > 0 ? string.Format("+{0:F02}", B) : string.Format("{0:F02}", B)) : "");
            else
                formula = string.Format("x={0:F02}", C);
            return formula;
        }
    }
}
Line类

 

    3.3 检测直线的过程

    (1)随机从观测点中选择两个点,得到通过该点的直线;

    (2)用(1)中的直线去测试其他观测点,由点到直线的距离确定观测点是否为局内点或者局外点;

    (3)如果局内点足够多,并且局内点多于原有“最佳”直线的局内点,那么将这次迭代的直线设为“最佳”直线;

    (4)重复(1)~(3)步直到找到最佳直线。

    细心的您估计已经发现我省略了标准RANSAC检测过程中重新估计模型的步骤,我是故意的,我觉得麻烦且没什么用处,所以咔嚓了,O(∩_∩)O~。

/// <summary>
        /// 尝试获取直线
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGetLine_Click(object sender, EventArgs e)
        {
            //用RANSAC方法获取最佳直线
            points = GetSamplePoints();
            Line bestLine = null;           //最佳直线
            double bestInliersCount = 0;    //最佳模型的局内点数目
            Random random = new Random();
            for (int idx = 0; idx < nudIterCount.Value; idx++)
            {
                int idx1, idx2;
                GetRandomInliersPoints(random, out idx1, out idx2);
                int inliersCount = 2;
                Line line = new Line(points[idx1], points[idx2]);
                for (int i = 0; i < points.Count; i++)
                {
                    if (i != idx1 && i != idx2)
                    {
                        if (line.GetDistance(points[i]) <= (double)nudMinDistance.Value)
                            inliersCount++;
                    }
                }
                if (inliersCount >= nudMinPointCount.Value)
                {
                    if (inliersCount > bestInliersCount)
                    {
                        bestLine = line;
                        bestInliersCount = inliersCount;
                    }
                }
            }
            //显示最佳直线
            if (bestLine != null)
            {
                lblFormula.Text = string.Format("方程:{0}\r\nA:{1}\r\nB:{2}\r\nC:{3}\r\n局内点数目:{4}",
                    bestLine.ToString(), bestLine.A, bestLine.B, bestLine.C, bestInliersCount);
                DrawLine(bestLine);
            }
            else
                lblFormula.Text = "没有获取到最佳直线。";
        }
获取直线

 

四、检测圆

    4.1 圆的相关知识

    (1)平面内不在同一直线上的三个点可以确定一个圆;

    (2)圆的数学表达形式为:(x-a)2+(y-b)2=r2

    其中,(a,b)为圆心,r为半径。

    4.2 圆类

    圆类(Circle)封装了跟圆有关的属性及方法,列表如下:

    (1)属性

    A——圆心的x坐标

    B——圆心的y坐标

     R——圆的半径

    (2)构造函数

    public Circle(PointF p1, PointF p2, PointF p3)

    提供三个点p1,p2和p3,计算出圆的属性A,B,R。

    (3)方法

    GetDistance——获取点到圆(周)之间的距离,表示点接近或者远离圆;

    ToString——获取圆的方程式。

using System;
using System.Collections.Generic;
using System.Text;
using System.Drawing;
using System.Drawing.Drawing2D;

namespace Ransac
{
    /// <summary>
    /// 圆类:用(x-a)**2+(y-b)**2=r**2形式表示
    /// </summary>b
    public class Circle
    {
        /// <summary>
        /// 圆心的X坐标
        /// </summary>
        public double A { get; set; }
        /// <summary>
        /// 圆心的Y坐标
        /// </summary>
        public double B { get; set; }
        /// <summary>
        /// 半径
        /// </summary>
        public double R { get; set; }

        /// <summary>
        /// 构造函数,提供圆心和半径。
        /// </summary>
        /// <param name="a"></param>
        /// <param name="b"></param>
        /// <param name="r"></param>
        public Circle(double a, double b, double r)
        {
            A = a;
            B = b;
            if (r < 0)
                throw new ArgumentOutOfRangeException("r", "圆的半径必须大于0。");
            R = r;
        }

        /// <summary>
        /// 构造函数,提供三个点。
        /// 该算法来自csdn论坛,帖子地址是:http://bbs.csdn.net/topics/50383586,在此感谢5楼的privet。
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <param name="p3"></param>
        public Circle(PointF p1, PointF p2, PointF p3)
        {
            float xMove = p1.X;
            float yMove = p1.Y;
            p1.X = 0;
            p1.Y = 0;
            p2.X = p2.X - xMove;
            p2.Y = p2.Y - yMove;
            p3.X = p3.X - xMove;
            p3.Y = p3.Y - yMove;
            float x1 = p2.X, y1 = p2.Y, x2 = p3.X, y2 = p3.Y;
            double m = 2.0 * (x1 * y2 - y1 * x2);
            if (m == 0)
                throw new ArgumentException("参数错误,提供的三点不能构成圆。");
            double x0 = (x1 * x1 * y2 - x2 * x2 * y1 + y1 * y2 * (y1 - y2)) / m;
            double y0 = (x1 * x2 * (x2 - x1) - y1 * y1 * x2 + x1 * y2 * y2) / m;
            R = Math.Sqrt(x0 * x0 + y0 * y0);
            A = x0 + xMove;
            B = y0 + yMove;
        }

        /// <summary>
        /// 构造函数,提供三个点。
        /// </summary>
        /// <param name="p1"></param>
        /// <param name="p2"></param>
        /// <param name="p3"></param>
        public Circle(Point p1, Point p2, Point p3) :
            this(new PointF(p1.X, p1.Y), new PointF(p2.X, p2.Y), new PointF(p3.X, p3.Y))
        {
        }

        /// <summary>
        /// 获取点到圆的距离(圆周,不是圆心)
        /// </summary>
        /// <param name="p"></param>
        /// <returns></returns>
        public double GetDistance(PointF p)
        {
            return Math.Abs(R - Math.Sqrt(Math.Pow(p.X - A, 2) + Math.Pow(p.Y - B, 2)));
        }

        /// <summary>
        /// 返回圆方程
        /// </summary>
        /// <returns></returns>
        public override string ToString()
        {
            return string.Format("{0}**2+{1}**2={2}",
                A == 0 ? "x" : (A > 0 ? string.Format("(x-{0:F02})", A) : string.Format("(x+{0:F02})", Math.Abs(A))),
                B == 0 ? "y" : (B > 0 ? string.Format("(y-{0:F02})", B) : string.Format("(y+{0:F02})", Math.Abs(B))),
                R == 0 ? "0" : string.Format("{0:F02}**2", Math.Abs(R)));
        }
    }
}
Circle类

 

    3.3 检测圆的过程

    (1)随机从观测点中选择三个点,尝试得到通过这三个点的圆;

    (2)用(1)中的圆去测试其他观测点,由点到圆的距离确定观测点是否为局内点或者局外点;

    (3)如果局内点足够多,并且局内点多于原有“最佳”圆的局内点,那么将这次迭代的圆设为“最佳”圆;

    (4)重复(1)~(3)步直到找到最佳圆。

/// <summary>
        /// 尝试获取圆
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void btnGetCircle_Click(object sender, EventArgs e)
        {
            //用RANSAC方法获取最佳直线
            points = GetSamplePoints();
            Circle bestCircle = null;       //最佳圆
            double bestInliersCount = 0;    //最佳模型的局内点数目
            Random random = new Random();
            for (int idx = 0; idx < nudIterCount.Value; idx++)
            {
                int idx1, idx2, idx3;
                GetRandomInliersPoints(random, out idx1, out idx2, out idx3);
                int inliersCount = 3;
                Circle circle;
                try
                {
                    circle = new Circle(points[idx1], points[idx2], points[idx3]);
                }
                catch
                {
                    continue;
                }
                for (int i = 0; i < points.Count; i++)
                {
                    if (i != idx1 && i != idx2 && i!=idx3)
                    {
                        if (circle.GetDistance(points[i]) <= (double)nudMinDistance.Value)
                            inliersCount++;
                    }
                }
                if (inliersCount >= nudMinPointCount.Value)
                {
                    if (inliersCount > bestInliersCount)
                    {
                        bestCircle = circle;
                        bestInliersCount = inliersCount;
                    }
                }
            }
            //显示最佳圆
            if (bestCircle != null)
            {
                lblFormula.Text = string.Format("方程:{0}\r\nA:{1}\r\nB:{2}\r\nR:{3}\r\n局内点数目:{4}",
                    bestCircle.ToString(), bestCircle.A, bestCircle.B, bestCircle.R, bestInliersCount);
                DrawCircle(bestCircle);
            }
            else
                lblFormula.Text = "没有获取到最佳圆。";
        }
获取圆

 

五、本文源代码

    点击这里下载本文源代码

    感谢您阅读本文,希望对您有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

随机抽样一致性算法(RANSAC)示例及源代码 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • C# 异步等待澄清?

    我读了here http blog stephencleary com 2012 02 async and await html that 等待检查等待的看看它是否有already完全的 如果 可等待已经完成 那么该方法将继续 运行 同步
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • 如何在 Cassandra 中存储无符号整数?

    我通过 Datastax 驱动程序在 Cassandra 中存储一些数据 并且需要存储无符号 16 位和 32 位整数 对于无符号 16 位整数 我可以轻松地将它们存储为有符号 32 位整数 并根据需要进行转换 然而 对于无符号 64 位整
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • C++11 删除重写方法

    Preface 这是一个关于最佳实践的问题 涉及 C 11 中引入的删除运算符的新含义 当应用于覆盖继承父类的虚拟方法的子类时 背景 根据标准 引用的第一个用例是明确禁止调用某些类型的函数 否则转换将是隐式的 例如最新版本第 8 4 3 节
  • 如何从 Visual Studio 将视图导航到其控制器?

    问题是解决方案资源管理器上有 29 个项目 而且项目同时具有 ASP NET MVC 和 ASP NET Web 表单结构 在MVC部分中 Controller文件夹中有大约100个子文件夹 每个文件夹至少有3 4个控制器 视图完全位于不同
  • 从经典 ASP 调用 .Net C# DLL 方法

    我正在开发一个经典的 asp 项目 该项目需要将字符串发送到 DLL DLL 会将其序列化并发送到 Zebra 热敏打印机 我已经构建了我的 DLL 并使用它注册了regasm其次是 代码库这使得 IIS 能够识别它 虽然我可以设置我的对象
  • 访问外部窗口句柄

    我当前正在处理的程序有问题 这是由于 vista Windows 7 中增强的安全性引起的 特别是 UIPI 它阻止完整性级别较低的窗口与较高完整性级别的窗口 对话 就我而言 我想告诉具有高完整性级别的窗口进入我们的应用程序 它在 XP 或
  • 人脸 API DetectAsync 错误

    我想创建一个简单的程序来使用 Microsoft Azure Face API 和 Visual Studio 2015 检测人脸 遵循 https social technet microsoft com wiki contents ar
  • 使用 C# 中的 CsvHelper 将不同文化的 csv 解析为十进制

    C 中 CsvHelper 解析小数的问题 我创建了一个从 byte 而不是文件获取 csv 文件的类 并且它工作正常 public static List
  • 如何获取 EF 中与组合(键/值)列表匹配的记录?

    我有一个数据库表 其中包含每个用户 年份组合的记录 如何使用 EF 和用户 ID 年份组合列表从数据库获取数据 组合示例 UserId Year 1 2015 1 2016 1 2018 12 2016 12 2019 3 2015 91
  • C# - 当代表执行异步任务时,我仍然需要 System.Threading 吗?

    由于我可以使用委托执行异步操作 我怀疑在我的应用程序中使用 System Threading 的机会很小 是否存在我无法避免 System Threading 的基本情况 只是我正处于学习阶段 例子 class Program public
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • 有没有办法让 doxygen 自动处理未记录的 C 代码?

    通常它会忽略未记录的 C 文件 但我想测试 Callgraph 功能 例如 您知道在不更改 C 文件的情况下解决此问题的方法吗 设置变量EXTRACT ALL YES在你的 Doxyfile 中
  • 当文件流没有新数据时如何防止fgets阻塞

    我有一个popen 执行的函数tail f sometextfile 只要文件流中有数据显然我就可以通过fgets 现在 如果没有新数据来自尾部 fgets 挂起 我试过ferror and feof 无济于事 我怎样才能确定fgets 当
  • C# 中最小化字符串长度

    我想减少字符串的长度 喜欢 这串 string foo Lorem ipsum dolor sit amet consectetur adipiscing elit Aenean in vehicula nulla Phasellus li
  • 为什么 std::uint32_t 与 uint32_t 不同?

    我对 C 有点陌生 我有一个编码作业 很多文件已经完成 但我注意到 VS2012 似乎有以下语句的问题 typedef std uint32 t identifier 不过 似乎将其更改为 typedef uint32 t identifi
  • 类型或命名空间“MyNamespace”不存在等

    我有通常的类型或命名空间名称不存在错误 除了我引用了程序集 using 语句没有显示为不正确 并且我引用的类是公共的 事实上 我在不同的解决方案中引用并使用相同的程序集来执行相同的操作 并且效果很好 顺便说一句 这是VS2010 有人有什么
  • 从 mvc 控制器使用 Web api 控制器操作

    我有两个控制器 一个mvc控制器和一个api控制器 它们都在同一个项目中 HomeController Controller DataController ApiController 如果我想从 HomeController 中使用 Dat

随机推荐

  • 创建任意程序为系统服务

    网上流传的创建系统服务的方法我看着真麻烦 把我自己弄的很简单的代码共享下 create SERVICENAME bat ECHO OFF sc delete SERVICENAME sc create SERVICENAME start a
  • 51单片机按键识别与LED显示(显示0-9的数字)

    实验内容 单片机外接10个按键 编号为0 9 编程实现任意按键则LED显示对应数字 一 硬件电路原理图 1 共阴共阳两种不同的方式 2 数码管显示表 3 矩阵键盘介绍 矩阵键盘是 单片机 外部设备中所使用的排布类似于矩阵的键盘组 矩阵式结构
  • WIN10+VS2013+CUDA10安装方法

    1 先安装VS 先安装VS 先安装VS 安装CUDA会配置VS文件 反向的话VS中找不到文件 VS安装参考 https blog csdn net m0 37477061 article details 83447773 2 安装CUDA
  • E-R模型应用示例

    E R模型应用示例 例1 1 设有某计算机系统集成制造公司需要建立一个零配件物资管理系统 该公司组装不同型号计算机所用的零配件由不同供货商供给 存放在多个仓库中 由多名仓库管理员管理 试用E R模型对该公司的零配件管理工作进行分析 根据该公
  • STM32移植lwip之官方源码解析

    本篇目标 分析stm32的ETH MAC控制器 初始化及lwip是如何与stm32底层连接的 材料准备 官方资料 包含代码和移植手册 stm32官方移植lwip资料 修改代码 包含移植后的代码 STM32官方移植lwip修改代码 修改参考
  • C++智能指针:shared_ptr用法详解

    C 智能指针 shared ptr用法详解 shared ptr是C 11里的新特性 其包装了new操作符在堆上分配的动态对象 如 shared ptr
  • MATLAB自动生成标记点

    在测试算法准确性的过程中 需要在图像上生成一些大小已知的标记点来识别 同时又需要生成的标记点位置随机 以测试算法的适用性 本人搜索自动生成标记点没有找到相关内容 因此将完成思路整理如下 随机生成点位置 MATLAB生成随机点很容易实现 使用
  • 解决django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.3 or newer is required; you have 1.0.

    最近在配置环境时遇到这样的问题 在网上查找了很多资料 比如注释base py中的代码 又或是添加如下代码 这些方法对我来说都不管用 后面又查到说可以降低django的版本 随后我重新安装了django2的版本 然后报以下错误 TypeErr
  • layui php+PHPExcel 拉取excel表格数据一键导入

    需求 大量数据需要导入数据库 直接拉取excel表格进行读取数据并存入数据库 过程中不对文件进行存储 使用上传过程中的缓存文件 前端代码 layui php
  • vs2019配置Qt5开发环境

    使用visual studi 2019配置qt5开发环境 以及创建qt项目s 一 下载安装visual Studio2019 1 进入visual studio 官网下载community 2019版本 安装器 2 下载完成后启动visua
  • Vue2里的computed的传参方法

    在使用element ui的时候 后台返回的字段需要你来判断显示什么 这时候可能就需要计算属性了 但是使用computed无法传值 可以通过computed定义的函数里面返回一个函数来接受传值 进行判断 如果直接使用computed传参是报
  • 使用nrm管理npm仓库

    引言 目前遇到了这样的问题 因为个人和公司的npm仓库环境不一样 导致使用时需要频繁的切换npm指向 所以 为了提高工作效率 就采用了nrm的方式来管理多个npm仓库 老规矩 先举一个 For example 当前有两个仓库指向 分别是 公
  • PyCharm安装教程最新版(社区版)

    1 官网下载地址 PyCharm the Python IDE for Professional Developers by JetBrains 2 安装 直接Install进行安装 最后点击finish即可 3 新建项目并测试 新建一个项
  • 线程安全分析

    1 成员变量和静态变量是否线程安全 如果它们没有被共享 则线程安全 如果它们被共享了 根据它们的状态是否能够改变 又分两种情况 如果只有读操作 则线程安全 如果有读写操作 则这段代码是临界区 需要考虑线程安全 2 局部变量是否线程安全 局部
  • 编译工具Make

    文章目录 make指令 指定目标 隐藏指令 通配符 伪目标 多目标 Makefile的命令 变量 变量的基础 赋值变量 函数调用 字符串操作函数 文件名操作函数 循环函数 条件判断函数 条件判断语句 隐式规则 隐式规则举例 隐式规则中的变量
  • Linux性能监控 -- vmstat命令

    文章目录 示例 字段说明 示例 输入vmstat命令后 第一个参数表示每1秒获取一次服务器资源 第二个参数表示总共获取10次 若第二个参数不设置 则表示持续获取服务器资源 字段说明 数据项 含义 r 表示有多少任务需要CPU执行 通常与后5
  • Button与ImageButton的点击监听事件-onClick

    Button与ImageButton自身都有一个onClick点击事件 通过自身的 setOnClickListener OnClickListener 的方法添加点击事件 所有控件都有一个OnClick事件 通过点击事件的监听可以实现点击
  • 吐血总结《Mysql从入门到入魔》,图文并茂

    文章目录 1 数据库操作 1 1显示数据库 1 2 创建数据库 1 3 使用数据库 1 4 查看当前数据库 1 5 删除数据库 2 表操作 2 1 创建表 2 2 更新表 2 2 1 添加列 2 2 2 删除列 2 3 查看表结构 2 4
  • CTF基本赛制与题型

    CTF简介 CTF的全称为Capture The Flag 即夺旗赛 CTF竞赛活动蓬勃发展 已成为了锻炼信息安全技术 展现安全能力和水平的绝佳平台 CTF号称计算机界的奥林匹克 CTF目标 CTF参赛队伍的目标为获取尽可能多的flag 参
  • 随机抽样一致性算法(RANSAC)示例及源代码

    作者 王先荣 大约在两年前翻译了 随机抽样一致性算法RANSAC 在文章的最后承诺写该算法的C 示例程序 可惜光阴似箭 转眼许久才写出来 实在抱歉 本文将使用随机抽样一致性算法来来检测直线和圆 并提供源代码下载 一 RANSAC检测流程 在