RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1546314
Accepted
slx0009
slx0009
Asked:2023-10-17 15:24:09 +0000 UTC2023-10-17 15:24:09 +0000 UTC 2023-10-17 15:24:09 +0000 UTC

如何获得新的圆心坐标,使其不与轮廓相交?

  • 772

我正在学习Python中的Opencv并制作一个小项目。Opencv 窗口创建可以使用手部动作推动的圆圈。大部分代码已经完成 - 读取手部动作并获取其轮廓并创建圆圈(圆圈的数据存储在全局数组中)。但我不知道如何推动杯子。

录制视频时,会处理每一帧。我有手的轮廓以及圆的坐标和半径。也就是说,你需要遍历每个圆并检查它是否与轮廓相交。如果没有,那么一切都很好,如果相交,那么您需要垂直于轮廓移动圆,使其停止相交。然后,使用圆圈中的新数据绘制它们(这也准备好了)。

但我还是不明白到底怎样才能把圆圈移开?

python-3.x
  • 1 1 个回答
  • 59 Views

1 个回答

  • Voted
  1. Best Answer
    MBo
    2023-10-17T15:37:57Z2023-10-17T15:37:57Z

    有必要计算从圆心到轮廓的最小距离 - 在最简单的情况下,通过遍历构成轮廓的线段,并计算从中心到线段的垂直 D 的长度(加上- 以及到角落的距离!)。如果它小于 R,则将中心移动与该垂直线共线的向量,长度为 RD。

    在此输入图像描述

    这是代码,但它没有考虑到中心投影没有落在线段上,而是有交集的情况,所以还需要检查到线段两端的距离

    import math
    def proj(x1, y1, x2, y2, xp, yp):
        x12 = x2 - x1
        y12 = y2 - y1
        dotp = x12 * (xp - x1) + y12 * (yp - y1)
        dot12 = x12 * x12 + y12 * y12
        coeff = dotp / dot12
        lx = x1 + x12 * coeff
        ly = y1 + y12 * coeff
        return lx, ly, coeff
    
    x1,y1,x2,y2,cx,cy,R = 0, 0, 10, 0, 5, 5, 6
    lx, ly, cf = proj(x1, y1, x2, y2, cx, cy)
    if 0<=cf<=1:   #проекция находится в пределах отрезка
        dx, dy  = cx - lx, cy - ly
        dist = math.hypot(dx, dy)
        if dist < R:    #окружность пересекает отрезок
            xshift = dx * (R-dist) / dist
            yshift = dy * (R-dist) / dist
            print(xshift, yshift)
    
    >>> 0.0 1.0
    

    如果圆心的投影位于线段之外,但到其中一端的距离小于半径,则圆与该线段相交一次或完全包含该线段。在这种情况下,您需要选择一种从角开始排斥的策略 - 要么我们将其移动相同的找到的向量(这是最简单的),要么我们从两个相邻边的向量中选择最小长度,要么我们沿着外平分线,或其他东西。

    如果圆可以延伸超出半径,则必须考虑轮廓的哪一侧是外侧以及线段的方向。此外,对于复杂(非凸)轮廓,移动时可能会出现新的交点;在这种情况下,您必须构建类似外部骨架的东西(外角在交点之前的平分线等)。

    然而,对于动态系统,可以预测圆与轮廓之间的接触力矩,并在此时给圆一个沿接触半径的冲量

    • 1

相关问题

  • 在 Linux 服务器上运行 Django 项目

  • 当您单击kivy设置中的关闭按钮时,如何调用更新应用程序本身的gui的方法

  • 制作一个按钮处理程序来调用该函数。那些。单击按钮时,该函数应运行。遥控机器人

  • 如何正确地将列表项添加到 Word 表格中?

  • 内容解析(Python、BeautifulSoup、请求)

  • 脚本不适用于 BeautifulSoup 和请求 (Python3x)

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5