gpt4 book ai didi

python - 使用 OpenCV 霍​​夫变换在二维点云中进行线检测

转载 作者:太空狗 更新时间:2023-10-30 00:00:49 26 4
gpt4 key购买 nike

我已尽力了解如何使用 OpenCV 进行线检测。但是,我找不到我正在寻找的示例。我想用它来查找简单的二维点云中的线。作为测试,我想使用以下几点:

enter image description here

import random
import numpy as np
import matplotlib.pyplot as plt

a = np.random.randint(1,101,400) # Random points.
b = np.random.randint(1,101,400) # Random points.

for i in range(0, 90, 2): # A line to detect
a = np.append(a, [i+5])
b = np.append(b, [0.5*i+30])

plt.plot(a, b, '.')
plt.show()

我找到了很多霍夫变换工作原理的初始示例。但是,当涉及到代码示例时,我只能发现使用了图像。

有没有办法使用 OpenCV 霍​​夫变换来检测一组点中的线,或者您可以推荐任何其他方法或库吗?

---- 编辑----

在阅读了一些很棒的答案后,我觉得我可以描述一下我打算如何更好地使用它。我有一个高分辨率的 2D LiDAR,需要从数据中提取墙壁。典型的扫描看起来像这样: enter image description here

“正确的输出”看起来像这样: enter image description here

在我做了一些更多的研究之后,我怀疑 Hough 变换在这种情况下不是最佳使用。关于我应该寻找什么的任何提示?

(如果有人感兴趣,可以使用 LiDAR 和墙壁提取来生成 map 并为机器人导航。)

谢谢,雅各布

最佳答案

一种方法是按照这些 slides 自己实现霍夫变换跳过边缘检测部分。

或者,您可以从您的点列表中创建一个图像,例如

#create an image from list of points
x_shape = int(np.max(a) - np.min(a))
y_shape = int(np.max(b) - np.min(b))

im = np.zeros((x_shape+1, y_shape+1))

indices = np.stack([a-1,b-1], axis =1).astype(int)
im[indices[:,0], indices[:,1]] = 1

plt.imshow(im)

#feed to opencv as usual

按照这个 question 的答案

编辑:不要提供给 OpenCV,而是使用 skimage,如 documentation 中所述:

import numpy as np

from skimage.transform import (hough_line, hough_line_peaks,
probabilistic_hough_line)
from skimage.feature import canny
from skimage import data

import matplotlib.pyplot as plt
from matplotlib import cm


# Constructing test image
#image = np.zeros((100, 100))
#idx = np.arange(25, 75)
#image[idx[::-1], idx] = 255
#image[idx, idx] = 255

image = im

# Classic straight-line Hough transform
h, theta, d = hough_line(image)

# Generating figure 1
fig, axes = plt.subplots(1, 3, figsize=(15, 6))
ax = axes.ravel()

ax[0].imshow(image, cmap=cm.gray)
ax[0].set_title('Input image')
ax[0].set_axis_off()

ax[1].imshow(np.log(1 + h),
extent=[np.rad2deg(theta[-1]), np.rad2deg(theta[0]), d[-1], d[0]],
cmap=cm.gray, aspect=1/1.5)
ax[1].set_title('Hough transform')
ax[1].set_xlabel('Angles (degrees)')
ax[1].set_ylabel('Distance (pixels)')
ax[1].axis('image')

ax[2].imshow(image, cmap=cm.gray)
for _, angle, dist in zip(*hough_line_peaks(h, theta, d)):
y0 = (dist - 0 * np.cos(angle)) / np.sin(angle)
y1 = (dist - image.shape[1] * np.cos(angle)) / np.sin(angle)
ax[2].plot((0, image.shape[1]), (y0, y1), '-r')
ax[2].set_xlim((0, image.shape[1]))
ax[2].set_ylim((image.shape[0], 0))
ax[2].set_axis_off()
ax[2].set_title('Detected lines')

plt.tight_layout()
plt.show()

# Line finding using the Probabilistic Hough Transform
image = data.camera()
edges = canny(image, 2, 1, 25)
lines = probabilistic_hough_line(edges, threshold=10, line_length=5,
line_gap=3)

# Generating figure 2
fig, axes = plt.subplots(1, 3, figsize=(15, 5), sharex=True, sharey=True)
ax = axes.ravel()

ax[0].imshow(image, cmap=cm.gray)
ax[0].set_title('Input image')

ax[1].imshow(edges, cmap=cm.gray)
ax[1].set_title('Canny edges')

ax[2].imshow(edges * 0)
for line in lines:
p0, p1 = line
ax[2].plot((p0[0], p1[0]), (p0[1], p1[1]))
ax[2].set_xlim((0, image.shape[1]))
ax[2].set_ylim((image.shape[0], 0))
ax[2].set_title('Probabilistic Hough')

for a in ax:
a.set_axis_off()

plt.tight_layout()
plt.show()

result

关于python - 使用 OpenCV 霍​​夫变换在二维点云中进行线检测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57558256/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com