Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Opencv 将L形分成两条线_Opencv_Image Processing_Computer Vision - Fatal编程技术网

Opencv 将L形分成两条线

Opencv 将L形分成两条线,opencv,image-processing,computer-vision,Opencv,Image Processing,Computer Vision,我想从标记中检测距离和方向。标记为L形;两条宽度和高度相等的线连接成一个L形 为了检测方向和距离,我需要将相机捕捉到的L形切割成两条线 如果代码每帧需要运行多次,那么轻量级的方法是什么 我已经使用下面描述的算法实现了blob检测: 我曾考虑过使用Hough变换,但我担心执行每一帧都需要大量的处理能力。除此之外,我认为这不是最准确的方法。我已经进行了适当的分析,以从一条直线中提取精确的向量,但不确定如何将L形切割成两条直线 下面是一张不同结果的照片,照片中的L形是如何被摄像机捕捉到的 我在想,我

我想从标记中检测距离和方向。标记为L形;两条宽度和高度相等的线连接成一个L形

为了检测方向和距离,我需要将相机捕捉到的L形切割成两条线

如果代码每帧需要运行多次,那么轻量级的方法是什么

我已经使用下面描述的算法实现了blob检测:

我曾考虑过使用Hough变换,但我担心执行每一帧都需要大量的处理能力。除此之外,我认为这不是最准确的方法。我已经进行了适当的分析,以从一条直线中提取精确的向量,但不确定如何将L形切割成两条直线

下面是一张不同结果的照片,照片中的L形是如何被摄像机捕捉到的

我在想,我可以通过一条穿过边界框的质心和中心的线来分割L形,但这行不通

我认为这可能是如何做到的一个粗略的头脑风暴草图:

扫描线! 请参阅Python中的(更新的)演练,其中包含图像以可视化我在您的数据中的旅程:)

跳到“扫描线”解决方案的末尾


扫描行 基础 假设 我假设这些约束来自您的示例图像

  • 您的图像中有(几个)L形
  • 您可以轻松地分割它们(没有重叠的形状,没有一个L到另一个L的延续…)
  • 您知道Ls中线条笔划的确切宽度
标记你的二值图像 您首先要知道哪些像素是L的一部分,这是通过“标记”二值图像来完成的

还计算每个体积的边界框,如下所示:

旋转坐标系 现在真正的诀窍是从x/y正交系统变为每个形状的“L形参考”

将其视为将X轴重新定义为L的一个分支,将Y轴重新定义为另一个分支。 一旦我们计算出一个到另一个的转换向量,我们就安全了

让我们考虑PCA方式。 我们现在面临的问题(“估计数据集中的最大变化轴”)是可以使用协方差特征向量的时刻

我不会太深入,但你可以看看这篇帖子,感受一下

该问题通常在更高的维度中定义(“给定一个50维数据集,计算其中的10个最大变化轴”),但可以通过单独考虑每个形状并声明属于L的每个像素是2D空间中的一个点来延伸到2D点云问题

但这将是对计算能力的浪费,因为与PCA的常见情况相比,您已经对L点的位置有了限制(它们在一条线上,而不是随机分散)。这个问题涉及到的线性代数的野兽在这个小问题上做得太过分了

霍夫线,去营救! 你只是想在2D图像中找到线条? 对线(也称为“Hough线”)使用Hough变换。 OpenCV拥有它

又是一个很好的介绍:

我使用了你的二值图像的骨架(这样每一行只上选一次),并手动选择了我为算法提供给OpenCV的参数。 这就是线条有时似乎与特定图像不完全匹配的原因,这是因为采样率等因素。)


新希望 在您指出需要计算速度之后,我想到了一些更多的技术,利用图像的特性对您有利

兰萨克 我曾想过在数据上使用RANSAC变体:毕竟,您希望将线拟合到点云中。 基本技术如您所知,可以用

  • (随机)选择足够的数据以适合模型(在您的案例中为行)
  • 评估异常值的数量(模型不适用的数据点)
  • 重复并记录得分最高的模型(并在一定时间内保持记录,包括数学)
一个伟大的介绍兰萨克是(奇怪的是)

但我看到了复杂性:

  • 哪种型号?:您是用4个点定义2条线,还是用2个点定义一条线并重复两次
  • 没有异常值:您实际上没有合适的异常值,那么为什么要在这样一个小问题上使用RANSAC呢
  • 计算能力:你真的会无缘无故地进行数千次潜在的迭代,因为你在随机查看你的点
不用说,RANSAC不可能做到这一点,但我们可以用它作为灵感

扫描线!

让我们考虑一下你的LS包围盒。

如果我们在
Y=0处水平切片它,我们将有一个1D数组,其连续区域定义为
True

那么,如果我们以这样的间隔对图像进行切片,以定义L的向量呢

设置5%作为基线,我们只需找到“哪个X指数是Y=0值的1D数组的中心”,然后对Y=0.05*img_宽度进行相同的操作

我们现在有2个2D点定义了通过图像的第一条线

在另一边重复,你就有了你的解决方案

在计算上,您只需在
img\u width
length数组中找到4个中间值, 每个内存块都是来自映像的连续内存块(Heeeello二级缓存命中!)


同样,如果刚才有点难以想象,请看我的

的结尾部分。您能用PNG重新发布相同的图像吗?我正试图使用你的示例图像作为我的答案,但JPEG压缩丢失了一些信息,使得很难轻松进行正确的分割=(当然,马上就来!上一张图片现在已替换为PNG。谢谢!更好=)一个答案,co