为什么 Opencv/Hough 转换找不到整行?

Why is Opencv/Hough Transform not finding the whole line?

我完成了一个关于 OpenCv 的寻找车道的教程,我正在尝试将其应用于寻找地板上的一段胶带。我得到了代码 运行 并设置了感兴趣区域,但它只找到了磁带的几个边缘。我认为这与厚度有关,但我不是 100% 确定。任何帮助将不胜感激。

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

def canny(image):
    gray = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
    blur = cv2.GaussianBlur(gray, (5,5), 0)
    canny = cv2.Canny(blur, 50, 150)
    return canny

def display_lines(image, lines):
    line_image = np.zeros_like(image)
    if lines is not None:
        for line in lines:
            x1, y1, x2, y2 = line.reshape(4)
            cv2.line(line_image, (x1, y1), (x2, y2), (255, 0, 0), 10)
    return line_image

def region_of_interest(image):
    height = image.shape[0]
    polygons = np.array([
        [(200, height), (400, height), (355, 0)]
        ])
    mask = np.zeros_like(image)
    cv2.fillPoly(mask, polygons, 255)
    masked_image = cv2.bitwise_and(image, mask)
    return masked_image

image = cv2.imread('tape3.jpg')
lane_image = np.copy(image)
canny_image = canny(image)
cropped_image = region_of_interest(canny_image)
lines = cv2.HoughLinesP(cropped_image, 2, np.pi/180, 100, np.array([]), minLineLength=40, maxLineGap=5)
line_image = display_lines(lane_image, lines)
combo_image = cv2.addWeighted(lane_image, 0.8, line_image, 1, 1)
# cv2 print image
print(region_of_interest(image))
cv2.imshow("result", combo_image)
cv2.waitKey(0)

这可能无法回答您原来的问题,但这可能是实现您所寻找的目标的替代方法。

我首先对图像的灰度进行阈值处理以尝试隔离磁带

然后我用opencv的findContours得到了每个白色blob的分割点

我使用的阈值方法对光线和阴影很敏感,因此如果这不是可行的约束,您可能必须找到其他一些阈值方法。如果不同颜色的胶带是一个问题,您可以关闭其他值的阈值(转换为 HSV 或 LAB 并分别关闭 H 或 B 通道的阈值以寻找红色)。

编辑:

如果您仍想使用 HoughLinesP,这里有一个使用您的图片的工作示例。

首先我申请了canny:

然后我使用了HoughLinesP函数:

我以前从未使用过 houghLinesP 所以我不确定潜在的陷阱,但它似乎有效,虽然它实际上用这些参数创建了一堆重叠的线,你必须尝试一下有点。

相关代码:

# canny
canned = cv2.Canny(gray, 591, 269);

# dilate
kernel = np.ones((3,3), np.uint8);
canned = cv2.dilate(canned, kernel, iterations = 1);

# hough
lines = cv2.HoughLinesP(canned, rho = 1, theta = 1*np.pi/180, threshold = 30, minLineLength = 10, maxLineGap = 20);

编辑 2:

我查看了该函数的文档,第三个参数 (theta) 指的是角度分辨率。我认为它可能在您的代码中不起作用,因为您在 Canny 之后没有对图像进行 运行 放大。使用一级搜索分辨率,不难想象我们可能会错过精明 returns 的那条非常细的线。通过使用更大的内核(或多次扩展),甚至比我在示例中所做的更多地扩展行是值得的。