opencv 如何检查两个给定点之间是否存在线段?

x759pob2  于 2022-12-04  发布在  其他
关注(0)|答案(1)|浏览(105)

我做了一个模型来预测电气符号和连接点:image of model inference
给定 Dataframe 形式的每个交汇点边界框的 xywh 坐标:image of the dataframe,我将如何生成一个输出,将所有导线的位置存储在一个.txt文件中,格式为:(x起始,y起始),(x结束,y结束)。
我一直在编写一种方法来检查任意两个给定的连接点之间是否存在有效的线(wire)。

data = df.loc[df['name'] == 'junction']

# iterates through all of the junctions
for index, row in data.iterrows():
    for index2, row2 in data.iterrows():
        check_if_wire_is_valid()

我的尝试是从推理图像中删除所有电气符号(使边界框中的所有内容都为白色但结点除外),并运行cv.HoughLinesP来查找导线。如何编写一个函数来检查cv.HoughLinesP的输出是否位于两个结点之间?
注意,两个结点之间的最小距离应该大于1px,因为如果我有这样的parallel circuit:左上和右下接合点将“检测”它们之间多于1px线,并将其误解为有效线。

EDITminAreaRect on contours。为了简化和测试,我画了这个没有元素的电路。这是为给定的轮廓找到的结果minAreaRect。我似乎找不到一种方法来正确地验证由此得到的线。

我最初的解决方案是比较任意两个连接点,如果它们在 x 轴上相对接近,那么我会说这两个连接点形成了一条垂直线,如果其他两个连接点在 y 轴上接近,我会得出结论,它们形成了一条水平线。junction distance to axis
现在,如果我有一条对角线,这将产生一个问题。我试图找到一个一致的解决方案,并适用于每一个电路。我相信我的东西与HoughLinesP方法或轮廓,但这是我的知识可以帮助我。
主要目标是创建一个LTSpice可读的电路用于仿真。我是否应该改变寻找有效线路的方法?如果是,您对这个问题有什么看法?

jslywgbw

jslywgbw1#

使用findContours()应该是可行的。电线总是(大致)直线,对吗?

  • 照你说的把分类箱漆成白色
  • threshold()以获得二进制图像,其中导线(以及其他符号和字母)为白色,其他所有内容为黑色。
  • 在上运行findContours()以提取对象。
  • 获取所有轮廓的边界框(minAreaRect
  • 丢弃所有边长比太宽轮廓线,这些轮廓线是字母或符号,只保留那些细到足以成为线的轮廓线

现在,您已经将所有导线作为对象,类似于连接点列表。现在,关于如何合并这两个......一些选项浮现在脑海中:

  • 按一定的数量增加方框,并检查它们是否重叠。
  • 从线框插入一条线,并检查它们是否与附近的任何相交框相交。
  • 或者反过来说:在交叉点之间画一条线,并检查有多少线穿过某个接线盒。

这是一个纯粹的数学问题,我不知道你的性能要求是什么,所以我就到此为止了。

相关问题