拟合椭圆分开内外两组点集并计算两两之间的距离

2023-11-18

 

通过拟合椭圆,区分开内外两组点,然后计算两两的距离


from Ransac_Process import RANSAC
import cv2
import numpy as np
import math
from operator import *


def calu_neighbor_dis(src, centerPoints, tolerance, DPI, standard_dis):

    img = np.zeros((300, 300, 3), np.uint8)
    h,w = img.shape[:2]

    # 拟合时坐标为整数
    for item in centerPoints:
        item[0] = math.ceil(item[0])*30 + int(w/2)
        item[1] = math.ceil(item[1])*30 + int(h/2)
        cv2.circle(img, (item[0], item[1]), 5, (0, 255, 0), -1)  # 画圆心

    points_data = np.array(centerPoints)

    # 拟合椭圆
    # # 随机采样一致性拟合
    # Ransac = RANSAC(data=points_data, threshold=0.5, P=.98, S=0.5, N=10)
    #
    # ellipse_values = Ransac.execute_ransac()
    # # # 检测到轮廓里数量太少(<5)则无法拟合椭圆
    # # if ellipse_values is None:
    # #     return 0, 0
    #
    # (x, y), (LAxis, SAxis), Angle = ellipse_values
    # a = SAxis
    # # print( (X, Y), (LAxis, SAxis))
    # # # 拟合圆
    #
    # cv2.ellipse(img, ((x, y), (LAxis, SAxis), Angle), (0, 0, 255), 1, cv2.LINE_AA)  # 画圆
    # cv2.circle(img, (int(x), int(y)), 3, (0, 0, 255), -1)  # 画圆心

    # cv2.imshow("image", img)
    # cv2.waitKey()

    # 直接拟合椭圆
    if len(points_data) < 4:
        # 点集不够拟合椭圆
        return []

    rrt = cv2.fitEllipse(points_data)  # x, y)代表椭圆中心点的位置(a, b)代表长短轴长度,应注意a、b为长短轴的直径,而非半径,angle 代表了中心旋转的角度
    # print("rrt", rrt)
    cv2.ellipse(img, rrt, (0, 0, 255), 1, cv2.LINE_AA)  # 画圆
    x, y = rrt[0]
    cv2.circle(img, (int(x), int(y)), 3, (0, 0, 255), -1)  # 画圆心
    a, b = rrt[1]  # ab分别为短长轴

    # 内外侧圆心点集
    in_center_points = []
    out_center_points = []
    for point in points_data:
        dis_inner = math.sqrt(math.pow(point[0] - x, 2) + math.pow(point[1] - y, 2))
        if dis_inner < (a/2)*0.618:
            in_center_points.append(point)
            cv2.circle(img, (int(point[0]), int(point[1])), 3, (255, 255, 255), -1)  # 画圆心
        elif  dis_inner > (a/2)*0.8 and dis_inner < 1.15*(b/2):
            out_center_points.append(point)
            cv2.circle(img, (int(point[0]), int(point[1])), 4, (255, 0, 0), -1)  # 画圆心
    # print(in_center_points)

    standard_in, standard_out = standard_dis
    defect = []

    # 2.1求外侧一圈两两之间的距离
    dis_out_all = []
    for k in range(len(out_center_points) -1):
        between_dis_out = math.sqrt(math.pow(out_center_points[k][0] - out_center_points[k+1][0], 2) +
                                    math.pow(out_center_points[k][1] - out_center_points[k+1][1], 2))
        between_dis_out *= DPI
        dis_out_all.append(between_dis_out)
        if abs(between_dis_out - standard_out ) > tolerance:
            print(abs(between_dis_out - standard_out ))
            defect.append(1)
            print("外侧针有歪斜,产品不合格")
        else:
            defect.append(-1)
        # print("between_dis_out", between_dis_out)


    #2.2计算第一个和最后一个之间的距离
    between_dis_fl = math.sqrt(math.pow(out_center_points[0][0] - out_center_points[-1][0], 2) +
                               math.pow(out_center_points[0][1] - out_center_points[-1][1], 2))
    between_dis_fl *= DPI
    dis_out_all.append(between_dis_fl)
    if abs(between_dis_fl -standard_out ) > tolerance:
        defect.append(1)
        print("外侧针fl有歪斜,产品不合格")
    else:
        defect.append(-1)
    # print(np.mean(dis_out_all))
    # print("between_dis_fl", between_dis_fl)

    # 2.3求中间的三个元素求两两的距离
    dis_in_all = []
    for i in range(len(in_center_points)-1):
        for j in range(i + 1, len(in_center_points)):
            between_dis_inner = math.sqrt(math.pow(in_center_points[i][0] - in_center_points[j][0], 2) +
                                          math.pow(in_center_points[i][1] - in_center_points[j][1], 2))
            between_dis_inner *= DPI
            dis_in_all.append(between_dis_inner)
            if abs(between_dis_inner - standard_in) > tolerance:
                defect.append(0)
                print("内侧针有歪斜,产品不合格")
            else:
                defect.append(-1)
    #         print("between_dis_inner", between_dis_inner)
    # print(np.mean(dis_in_all))

    cv2.imshow("image", img)
    cv2.waitKey()

    return defect


def decide_quality(src, centerPoints, tolerance, DPI, standard_dis):

    defect = calu_neighbor_dis(src, centerPoints,  tolerance, DPI, standard_dis)
    if defect is None:
        print("外侧椭圆拟合失败")
        return "检测失败"
    if 0 in defect or 1 in defect:
        return "产品不合格"
    else:
        return "产品合格"


if __name__ == "__main__":
    tolerance = 0.5*2
    DPI = 0.0103
    # 第一个内侧个针之间的标准距离,第二个元素为外侧两针之间的标准距离
    standard_dis = [0.83, 1]


    # centerPoints = [[3.71,0],[3, 2.16], [1.14, 3.51],[-1.14, 3.51], [-3.71, 0],
    #                 [-3, 2.16], [-1.14, -3.51], [-3, -2.16], [1.14, -3.51],
    #                 [3, -2.16], [1.42, 0], [-0.89, -1.24],[-0.89,1.14]]

    centerPoints = [[3.71,0],[3, 2.16], [1.14, 3.51],[-1.14, 3.51], [-3.71, 0],
                    [-3, 2.16], [-1.14, -3.51], [-3, -2.16], [1.14, -3.51],
                    [3, -2.16], [1.42, 0], [-0.89, -1.24],[-0.89,1.14]]

    src = "imread image"

    defect = calu_neighbor_dis(src, centerPoints,  tolerance, DPI, standard_dis)
    if defect is None:
        print("外侧椭圆拟合失败")
        # return "检测失败"
    if 0 in defect or 1 in defect:
        print("产品不合格")
        # return "产品不合格"
    else:
        print("产品合格")
        # return "产品合格"


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

拟合椭圆分开内外两组点集并计算两两之间的距离 的相关文章

随机推荐

  • 磁盘空间重分配

    root localhost df h Filesystem Size Used Avail Use Mounted on dev mapper VolGroup lv root 50G 47G 16M 100 lv root满了 tmpf
  • pageHelper的使用与源码分析

    文章目录 一 使用步骤 二 分页原理 1 统计总数 2 源码分析 三 总结 pageHelper作为Mybatis最好用的分页插件 自然受到极大多数人的追捧 而这里想要尽量阐述清楚pageHelper的具体使用步骤 实现的背后原理 以及与原
  • WebGL 实践篇(五)三维图形的绘制及矩阵变换、正射投影

    一 三维 F 的绘制 1 着色器 按照上一篇提到的矩阵变换 我们可以直接在顶点着色器中加入相应的矩阵变换 这样就可以简化着色器代码 通过变量传入矩阵的值也便于之后矩阵变换的修改 三维图形的绘制相比于二维图形只在参数类型上有一些变化 注意ve
  • Dynamically inflates UI in Android App

    Dynamically inflates UI in Android App There is a fascinating idea that inflates UI according to an android layout xml d
  • Spring Cloud OAuth2 + JWT 实现

    Spring Cloud OAuth2介绍 Spring Cloud OAuth2 是 Spring Cloud 体系对OAuth2协议的实现 可以 来做多个微服务的统 认证 验证身份合法性 授权 验证权限 通过向OAuth2服务 统 认证
  • 信息学奥赛一本通 1175:除以13

    题目链接 http ybt ssoier cn 8088 problem show php pid 1175 思路 直接复用 高精度除低精度 的代码即可 include
  • 简洁又快速地处理集合——Java8 Stream(上)

    Java 8 发布至今也已经好几年过去 如今 Java 也已经向 11 迈去 但是 Java 8 作出的改变可以说是革命性的 影响足够深远 学习 Java 8 应该是 Java 开发者的必修课 今天给大家带来 Java 8 Stream 讲
  • signature=8b42938f09e2cf752303c59298e18eae,yarn.lock

    THIS IS AN AUTOGENERATED FILE DO NOT EDIT THIS FILE DIRECTLY yarn lockfile v1 babel code frame 7 0 0 beta 40 babel code
  • 数据分析---常见分类算法

    分类问题是监督学习的一个核心问题 在监督学习中 当输出变量取有限个离散值时 预测问题便成为分类问题 监督学习从数据中学习一个分类决策函数或分类模型 称为分类器 classifier 分类器对新的输入进行输出的预测 这个过程称为分类 KNN算
  • pyQt5 + pyUIC + pycharm 安装心得(Anaconda安装)

    目录 前言 一 环境变量问题 二 anaconda 安装 pyqt5 并配置 pycharm 编译器 1 首先我们打开Anaconda里面的Anaconda prompt 2 创建好环境后我们输入 activate pyqt5 进入我们的虚
  • 论文笔记: MOGRIFIER LSTM

    2020 ICLR 修改传统LSTM 当前输入和隐藏状态充分交互 从而获得更佳的上下文相关表达 1 Mogrifier LSTM LSTM的输入X和隐藏状态H是完全独立的 机器学习笔记 GRU gruc UQI LIUWJ的博客 CSDN博
  • 一次excle导入数值精度失真处理过程(附java、python、goland实现代码)

    在一次excle导入中通过java poi包导入数值过长时出现数值失真的问题 100283710028672000000 在通过java导入时变成了100283710028672010000 现在通过goland java python三种
  • Jupyter Notebook与Markdown知识点汇总(一)

    知识点汇总 安装与启动 软件简介 安装与启动 新建Notebook 操作教程 认识界面 运行Jupyter notebook 新建notebook 修改文件名 菜单栏详情 熟悉工具栏 单元 快捷键 Markdown知识点汇总 运行Pytho
  • 【已解决】如何Python利用matplotlib绘制三维曲面图(可自由旋转的三维图)

    1 需求 在做电机的电磁设计时 需要对某一些参数进行优化 因此从电磁仿真软件Maxwell中导出了数据 部分数据如下图所示 可是这样无法直观地看出参数的影响 因此将其调整为矩阵形式 如下图所示 这样虽然已经能够比较直观地看出输入参数 电流和
  • 如何使用Lua脚本来实现原子性操作

    找一个让你开心一辈子的人 才是爱情的目标 最好的 往往就是在你身边最久的 在Redis中 Lua脚本可以用于实现原子性操作 原子性操作指的是一组操作要么全部执行成功 要么全部不执行 使用Lua脚本可以将多个Redis命令组合成一个原子性操作
  • js的new操作符做了哪些事情

    js的new操作符做了哪些事情 new 操作符新建了一个空对象 这个对象原型指向构造函数的prototype 执行构造函数后返回这个对象
  • 简述什么是静态测试、动态测试、黑盒测试、白盒测试、α测试 β测试

    简述什么是静态测试 动态测试 黑盒测试 白盒测试 测试 测试 静态测试是不运行程序本身而寻找程序代码中可能存在的错误或评估程序代码的过程 动态测试是实际运行被测程序 输入相应的测试实例 检查运行结果与预期结果的差异 判定执行结果是否符合要求
  • css 标签默认样式及清除

    标签默认样式及清除 标签默认样式 一些HTML标签在浏览器中会有默认样式 例如 body标签会有margin 8px ul标签会有margin 16px 0 及padding left 40px 当我们在切图软件中进行尺寸或位置测量的时候
  • 在本地jupyter使用其他环境(如:云创)

    接上一篇笔记 1 打开本地cmd 也可以使用x shell 输入命令 ssh L8888 localhost 8888 root 你的IP 此处的IP是远程需要用到的环境的IP 如下图所示 输入命令 enter之后 如下图所示 2 此时 仍
  • 拟合椭圆分开内外两组点集并计算两两之间的距离

    通过拟合椭圆 区分开内外两组点 然后计算两两的距离 from Ransac Process import RANSAC import cv2 import numpy as np import math from operator impo