繁体   English   中英

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

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

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

追踪 轨道 2 轨道 3

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得到每个白色斑点的分割点

在此处输入图像描述

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

编辑:

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

首先我申请了精明:

在此处输入图像描述

然后我使用了 HoughLinesP function:

在此处输入图像描述

我以前从未使用过 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:

我查看了 function 的文档,第三个参数(theta)指的是角度分辨率。 我认为它可能在您的代码中不起作用,因为您在 Canny 之后没有对图像运行膨胀。 使用 1 度搜索分辨率,不难想象我们可能会错过 canny 返回的非常细的线。 通过使用更大的 kernel(或多次扩张),甚至可能比我在示例中所做的更多地扩张线条。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM